黑马程序员__集合

黑马程序员——集合

------- android培训java培训、期待与您交流! ----------

1.集合类

   集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。

  Java的集合类主要由两个接口派生而出:Collection和Map.这两个接口是Java集合框架的根接口。

  Java集合框架:

 

  注意:Collection接口是在整个Java类集中保存单列值的最大的操作父接口,此集合里每次操作的时候都只能保存一个对象的数据;

             Map是真个Java类中保存双列值(具有映射关系的数据)的最大操作父接口,此集合里每次操作的都是一对对象并且都是以键值对的形式存在的。

             Iterator接口也是Java集合框架的成员,但它与Collection和Map系列的集合不一样:Collection和Map系列的集合用于盛装其他对象;而Iterator 则主要用于迭代Collection集合中的元素,被称为迭代器。

2.Collection:

  

   Collection接口是List和Set接口的父接口,该接口里定义的方法既可以用于操作List集合,也可以操作Set集合。

   代码示例:

  

<span style="font-family:FangSong_GB2312;font-size:14px;">import java.util.*;
//集合中的共性方法
class CollectionMethodDemo 
{
	public static void main(String[] args) 
	{
		//创建集合对象
		ArrayList al1=new ArrayList();
		ArrayList al2=new ArrayList();
		ArrayList al3=new ArrayList();
		//向集合中添加元素
		al1.add("A");
		al1.add("B");
		al1.add("C");
		al1.add("D");
		al1.add("E");
		//将集合中的元素添加到指定的集合中
		al2.addAll(al1);
		al3.addAll(al1);
		//打印集合
		pri("集合1中的元素为:"+al1);
		pri("集合2中的元素为:"+al2);
		pri("集合3中的元素为:"+al3);
		//清空集合里的所有元素
		al2.clear();
		pri("集合2中的元素为:"+al2);
		//判断集合中是否包含指定元素
		pri("集合1中是否包含C:"+al1.contains("C"));
		//判断集合中是否包含指定集合中的所有元素
		pri("集合1中是否包含集合3中的所有元素:"+al1.containsAll(al3));
		//判断集合是否为空
		pri("集合2是否为空:"+al2.isEmpty());
		//删除集合中的指定元素
		al3.remove("A");
		pri("删除集合3中的A:"+al3);
		//从集合中删除指定集合中的所有元素
		al1.removeAll(al3);
		pri("从集合1中删除集合3中的所有元素:"+al1);
		//获取两个集合的交集
		al1.retainAll(al3);
		pri("集合1与集合3的交集:"+al1);
		//获取集合中的元素个数
		pri("集合3中的元素个数为:"+al3.size());
		//将集合转换为数组
		Object[] obj=al3.toArray();
		pri("转换之后的数组的长度为:"+obj.length);
		//用迭代器迭代集合
		Iterator iterator=al3.iterator();
		while(iterator.hasNext())
		{
			pri(iterator.next());
		}

	}
	private static void pri(Object obj)
	{
		System.out.println(obj);
	}
}
</span>


  2.1 List :

      List集合代表一个元素有序并且可重复的集合,集合中的每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按照元素的添加顺序设置元素的索引。

      List的相关操作代码示例:

      

<span style="font-family:FangSong_GB2312;font-size:14px;">import java.util.*;
class ListMethodDemo 
{
	public static void main(String[] args) 
	{
		//创建List集合对象
		List list=new ArrayList();
		//向集合中添加元素
		list.add("A1");
		list.add("B2");
		list.add("C3");
		list.add("D4");
		list.add("E5");
		list.add("F6");
		//method(list);
		//用for循环来访问集合中的元素
		//formethod(list);
		//用foreach来访问集合中的元素
		//foreach(list);
		//用迭代器来迭代集合中的元素
		iterator(list);
		
		
	}
	//此方法中是List集合的特有操作方法
	private static void method(List list)
	{
		//原集合
		pri("原集合中的元素为:"+list);
		//将元素插入到集合中的指定位置处
		list.add(3,"G7");
		pri("插入元素之后的结果为:"+list);
		//将集合插入到指定集合的指定位置处
		ArrayList lt=new ArrayList();
		lt.add("a1");
		lt.add("b2");
		lt.add("c3");
		list.addAll(5,lt);
		pri("插入集合之后的结果为:"+list);
		//获取指定索引处的集合元素
		pri("集合中1处的元素是:"+list.get(1));
		//获取指定元素在集合中第一次出现的位置
		pri("G7的位置是:"+list.indexOf("G7"));
		//获取指定元素在集合中最后一次出现的位置
		pri("a1在集合中最后一次出现的位置:"+list.lastIndexOf("a1"));
		//删除并返回指定位置处的元素
		pri("删除5处的元素:"+list.remove(5));
		pri("删除之后的集合是:"+list);
		//将指定位置处的元素替换
		list.set(6,"H8");
		pri("替换之后的集合是:"+list);
		//获取子集合
		List L=list.subList(3,7);
		pri("获取的子集合是:"+L);
	}
	private static void formethod(List list)
	{
		for(int i=0;i<list.size();i++)
		{
			pri("list<"+i+">="+list.get(i));
		}
	}
	private static void foreach(List list)
	{
		for(Object obj:list)
		{
			pri(obj);
		}

	}
	private static void iterator(List list)
	{
		//获取迭代器对象
		ListIterator it=list.listIterator();
		//从前迭代
		while(it.hasNext())
		{
			pri(it.next());
		}
		pri("--------------------------");
		//从后迭代
		while(it.hasPrevious())
		{
			pri(it.previous());
		}
	}
	private static void pri(Object obj)
	{
		System.out.println(obj);
	}
}
</span>

 2.1.1 ArrayList

   (1)底层数据结构使用的数组数据结构;

   (2)默认构造方法初始容量为10;

   (3)扩充算法:原来长度+原来长度>>1;

   (4)优点:元素的有序存储,利于遍历;

            缺点:删除和插入速度慢。

   (5)ArrayList是线程不安全的,性能较高。

   实例代码:

   

<span style="font-family:FangSong_GB2312;font-size:14px;">/*将自定义对象作为元素存入到ArrayList集合中,并去除重复元素
  比如:存入人对象,同姓名同年龄视为同一个人,为重复元素。
  思路:
  (1)定义人类,将信息封装到对象中。
  (2)创建集合对象,将数据存储到集合中。
  (3)从集合中获取元素。
*/
import java.util.*;
class ArrayListDemo2 
{
	public static void main(String[] args) 
	{
		//创建集合对象
		ArrayList list=new ArrayList();
		list.add(new Person("Apple",18));
		list.add(new Person("Lily",20));
		list.add(new Person("Joe",19));
		list.add(new Person("Apple",18));
		list.add(new Person("Eama",18));
		System.out.println("原集合为:");
		iterator_method(list);
		list=cancleSame(list);
		System.out.println("去除重复值为:");
		iterator_method(list);
		

	}
	private static void iterator_method(List list)
	{
		//迭代集合
		Iterator it=list.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
	private static ArrayList cancleSame(ArrayList list)
	{
		//创建一个新的集合
		ArrayList al=new ArrayList();
		//迭代指定集合
		Iterator it=list.iterator();
		while(it.hasNext())
		{
			Object obj=it.next();
			if(!al.contains(obj))
				al.add(obj);
		}
		return al;
	}
}
//人类
class Person
{
	private String name;
	private int age;
	public Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public String getName()
	{
		return name;
	}
	public void setAge(int age)
	{
		this.age=age;
	}
	public int getAge()
	{
		return age;
	}
	//覆写equals方法
	public boolean equals(Object obj)
	{
		if(obj instanceof Person)
		{
			//类型转换
			Person p=(Person)obj;
			return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
		}
		else
			return false;

	}
	//覆写toString 方法
	public String toString()
	{
		return "name"+name+",age"+age;
	}
}
</span>


 

2.2.2 Vector

   (1)与ArrayList实现基本一致,初始容量为10;

   (2)扩充算法:原来长度+原来长度(或者指定长度);

   (3)Vector是线程安全的,性能较低。

   (4)除了支持Iterator .ListIterator 迭代输出之外,还支持Enumeration输出。

2.2.3 LinkedList:

   (1)底层数据结构使用的是链表数据结构;

  (2)优点:适合插入和删除操作;

          缺点:查询的速度慢;

  (3)LinkedList可以作为链表、队列和堆栈来使用。

  (4)LinkedList是线程不安全的。

   代码示例:

  

<span style="font-family:FangSong_GB2312;font-size:14px;">//用LinkedList的来模拟队列(先进先出)和堆栈(先进后出)
import java.util.*;
class LinkedListDemo
{
	public static void main(String[] args) 
	{
		//创建链表对象
		LinkedList link=new LinkedList();
		//队列
		Quenue q=new Quenue(link);
		q.Add("A01");
		q.Add("B02");
		q.Add("C03");
		q.Add("D04");
		q.Add("E05");
		//遍历
		while(!q.isNull())
		{
			//q.Get();
			System.out.println(q.Get());
		}
		//堆栈
		DuiZhan d=new DuiZhan(link);
		d.Add("A01");
		d.Add("B02");
		d.Add("C03");
		d.Add("D04");
		d.Add("E05");
		//遍历
		while(!d.isNull())
		{
			//q.Get();
			System.out.println(d.Get());
		}
	}
}
//队列
class Quenue
{
	//内部封装了一个链表的数据结构
	private LinkedList link;
	public Quenue(LinkedList link)
	{
		this.link=link;
	}
	//添加元素的方法
	public void Add(Object obj)
	{
		//内部调用的是链表的添加方法
		link.addFirst(obj);
	}
	//获取元素的方法
	public Object Get()
	{
		//内部调用的是链表的获取方法
		return link.removeLast();
	}
	//判断队列是否为空
	public boolean isNull()
	{
		return link.isEmpty();
	}
}
//堆栈
class DuiZhan
{
//内部封装了一个链表的数据结构
	private LinkedList link;
	public DuiZhan(LinkedList link)
	{
		this.link=link;
	}
	//添加元素的方法
	public void Add(Object obj)
	{
		//内部调用的是链表的添加方法
		link.addFirst(obj);
	}
	//获取元素的方法
	public Object Get()
	{
		//内部调用的是链表的获取方法
		return link.removeFirst();
	}
	//判断队列是否为空
	public boolean isNull()
	{
		return link.isEmpty();
	}
}</span>


 2.2 Set

   Set接口也是Collection的子接口,与List接口最大的不同在于:Set不允许有重复元素,允许存在Null值。Set接口并没有对Collection接口进行扩充,基本上还是与Collection接口保持一致。

  2.2.1 HashSet:

   HashSet是Set的实现子类,属于散列的存放类集,里面的内容是无序存放的。HashSet 按哈希算法来存储集合中的元素,因此具体很好的存取和查找性能。

   (1)HashSet底层使用的哈希表数据结构;

   (2)默认初始容量为16,默认的加载因子为0.75(表示容量存满75%,就要重新散列);

   (3)在哈希表中存储对象时,判断两个对象是同一个对象的方法:先比较两个对象的hashCode值是否相同,如果不同,就认为不是同一个对象;如果相同,在调用equals()方法判断。

   (4)当向HashSet集合中存入一个元素时,HashSet 会调用该对象的hashCode()来得到该对象的hashCode 值,然后根据该hashCode值决定该对象在HashSet中的存储位置。

   特点:

    a. 不能保证元素的排列顺序;

    b. HashSet 是线程不同步的;

    c. 集合元素可以是null。

  实例代码:

  

<span style="font-family:FangSong_GB2312;font-size:14px;">/*将自定义对象作为元素存入到HashSet集合中
  比如:存入人对象,同姓名同年龄视为同一个人,为重复元素。
  思路:
  (1)定义人类,将信息封装到对象中。
  (2)创建集合对象,将数据存储到集合中。
  (3)从集合中获取元素。
*/
import java.util.*;
class HashSetDemo
{
	public static void main(String[] args) 
	{
		HashSet set=new HashSet();
		set.add(new Person("Apple",19));
		set.add(new Person("Eama",10));
		set.add(new Person("Joe",19));
		set.add(new Person("Nuna",22));
		set.add(new Person("Eama",10));
		set.add(new Person("Apple",19));
		iterator_method(set);
	}
	private static void iterator_method(Set set)
	{
		//迭代集合
		Iterator it=set.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}
//人类
class Person
{
	private String name;
	private int age;
	public Person(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public String getName()
	{
		return name;
	}
	public void setAge(int age)
	{
		this.age=age;
	}
	public int getAge()
	{
		return age;
	}
	//覆写hashCode()方法
	public int hashCode()
	{
		return name.hashCode()+age*39;
	}
	//覆写equals方法
	public boolean equals(Object obj)
	{
		if(obj instanceof Person)
		{
			//类型转换
			Person p=(Person)obj;
			//返回比较结果
			return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
		}
		else
			return false;

	}
	//覆写toString 方法
	public String toString()
	{
		return name+":"+age;
	}
}
</span>


 2.2.2 TreeSet

    TreeSet可以确保集合元素处于排序状态,其本身属于排序的子类。

   (1)TreeSet底层数据结构是二叉树;

   (2)如果想TreeSet集合中添加自定义对象时,则该对象所属的自定义类必须实现Comparable接口,覆写compareTo方法。如果两个对象通过compareTo方法比较相等时,新对象将无法添加到TreeSet集合中。

  注意:对于TreeSet集合而言,它判断两个对象是否相等的唯一标准就是:两个对象通过compareTo方法比较是否返回0.如果返回0,TreeSet集合会认为它们相等;否则就认为它们不相等。

  实例代码:

  

<span style="font-family:FangSong_GB2312;font-size:14px;">//用TreeSet存储学生对象,并按照年龄进行排序。
import java.util.*;
class TreeSetDemo
{
	public static void main(String[] args) 
	{
		//创建集合对象
		TreeSet<Student> set=new TreeSet<Student>();
		set.add(new Student("Apple",12));
		set.add(new Student("Joe",24));
		set.add(new Student("Apple",24));
		set.add(new Student("Apple",12));
		iterator_method(set);
	}
	private static void iterator_method(Set set)
	{
		//迭代集合
		Iterator<Student> it=set.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}
//学生类:要进行自然排序,必须实现Comparable接口
class Student implements Comparable<Student>
{
	private String name;
	private int age;
	public Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public String getName()
	{
		return name;
	}
	public void setAge(int age)
	{
		this.age=age;
	}
	public int getAge()
	{
		return age;
	}
	//覆写compareTo方法,让元素能按照自然顺序输出
	public int compareTo(Student s )
	{
		//比较年龄,返回比较结果
		if(this.getAge()>s.getAge())
				return 1;
		if(this.getAge()==s.getAge())
		{
			return this.getName().compareTo(s.getName());
		}
		return -1;
		
	}
		public String toString()
	{
		return name+":"+age;
	}

}</span>


  比较器

  

<span style="font-family:FangSong_GB2312;font-size:14px;">//用比较器实现TreeSet存储学生对象,并按照姓名进行排序。
import java.util.*;
class TreeSetDemo2
{
	public static void main(String[] args) 
	{
		//将自定义的比较器对象作为构造函数的参数
		TreeSet set=new TreeSet(new MyComparator());
		set.add(new Student("Apple",24));
		set.add(new Student("Joe",20));
		set.add(new Student("Lily",24));
		set.add(new Student("Eama",30));
		set.add(new Student("Apple",12));
		iterator_method(set);
	}
	private static void iterator_method(Set set)
	{
		//迭代集合
		Iterator it=set.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}
//学生类
class Student 
{
	private String name;
	private int age;
	public Student(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	public void setName(String name)
	{
		this.name=name;
	}
	public String getName()
	{
		return name;
	}
	public void setAge(int age)
	{
		this.age=age;
	}
	public int getAge()
	{
		return age;
	}
	
	public String toString()
	{
		return name+":"+age;
	}

}
//定义比较器
class MyComparator implements Comparator
{ 
	//覆写compare方法
	public int compare(Object obj1,Object obj2)
	{
		if(!((obj1 instanceof Student) && (obj2 instanceof Student)))
			throw new RuntimeException("参数类型错误!");
		//类型转换
		Student s1=(Student)obj1;
		Student s2=(Student)obj2;
		//定义变量用来记录姓名的比较结果
		int result=s1.getName().compareTo(s2.getName());
		//姓名相同时比较年龄
		if(result==0)
			return s1.getAge()-s2.getAge();
		return result;
	
	}
}</span>


3.  Iterator接口

   Iterator 接口也是Java集合框架中的成员,主要用于迭代Collection集合中的元素。Iterator的对象也被称为迭代器。

   Iterator接口里定义了如下三个方法:

         boolean HasNext():是否有下一个元素;

        Object next():返回集合里的下一个元素;

        void remove():删除当前元素。

  Iterator仅用于遍历集合,其本身并不提供盛装对象的能力。如果要创建Iterator对象,则必然有一个与之关联的Collection对象。

  注意:在使用Iterator迭代集合的时候,如果在进行迭代输出的时候要想删除当前元素,则只能使用Iterator接口中的remove()方法,而不能使用集合中的remove()方法,否则将出现ConcurrentModificationException。

  3.1 ListIterator接口

     ListIterator表示列表迭代器,只有List接口有。ListIterator提供了专门操作List集合的方法。

     此接口中定义了以下操作方法:

     void add(E e):增加元素;

     boolean hasPrevious():判断是否有前一个元素;

     E previous():取出前一个元素;

     void set(E e):修改元素的内容;

     int previousIndex():返回前一个索引;

     int nextIndex();返回下一个索引。

    注意:如果要想使用ListIterator接口,则必须依靠List接口进行实例化,通过List接口中定义的listIterator()方法。

   代码示例:

   

//获取迭代器对象
		ListIterator it=list.listIterator();
		//从前迭代
		while(it.hasNext())
		{
			pri(it.next());
		}
		pri("--------------------------");
		//从后迭代
		while(it.hasPrevious())
		{
			pri(it.previous());
		}

  3.2 Enumeration接口

    Enumeration是古老的输出接口,专门为Vector进行迭代输出。如果要想使用Enumeration输出的话,则必须使用Vector类,通过其elements()方法来完成。

      代码示例:

   

<span style="font-family:FangSong_GB2312;font-size:18px;">Vector v=new Vector();
		Enumeration e=v.elements();
		while(e.hasMoreElements())
		{
			Object obj=e.nextElement();
		}</span>

  4.  Map接口

  

   Map用于保存具有映射关系的数据,因此,Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。

   Map的key不允许重复,key和value之间存在单向一对一关系,即通过指定的key,总能找到唯一的、确定的value。

   Map的相关操作实例代码:

   

<span style="font-family:FangSong_GB2312;font-size:14px;">import java.util.*;
class MapDemo 
{
	public static void main(String[] args) 
	{
		//创建Map集合对象,并指定泛型
		Map<Integer,String> map=new HashMap<Integer,String>();
		//向集合中添加元素
		map.put(1,"Apple");
		map.put(2,"Joe");
		map.put(3,"Nuna");
		map.put(4,"Eama");
		//判断集合中是否包含指定的键
		print(map.containsKey(2));
		//判断集合中是否包含一个或者多个值
		print(map.containsValue("Joe"));
		//判断集合是否为空
		print(map.isEmpty());
		//删除指定键所对应的键值对
		print(map.remove(3));
		print(map);
		//获取集合中的键值对的个数
		print(map.size());
		//获取集合中所有值组成的集合
		Collection<String> col=map.values();
		print(col);
		//通过keySet()方法来获取集合中的每一个元素
		//获取所有键组成的set集合
		Set<Integer> set=map.keySet();
		//获取迭代器
		Iterator<Integer> it1=set.iterator();
		//获取元素
		while(it1.hasNext())
		{
			Integer key=it1.next();
			print("key="+key+",vaule="+map.get(key));
		}
		print("-------------------------");
		//通过entrySet()方法来获取集合中的每一个元素
		//获取映射关系
		Set<Map.Entry<Integer,String>> entry=map.entrySet();
		//获取迭代器
		Iterator<Map.Entry<Integer,String>> it2=entry.iterator();
		//获取元素
		while(it2.hasNext())
		{
			Map.Entry me=it2.next();
			print("key="+me.getKey()+",vaule="+me.getValue());
		}

	}
	private static <T> void print(T t)
	{
		System.out.println(t);
	}
}
</span>

  4.1  HashMap

  HashMap是Map的子类,本身是属于无序存放的。

  (1)HashMap底层的数据结构是哈希表;

  (2)默认初始容量为16,默认加载因子为0.75;

   (3)不同步,线程不安全;

    (4)性能较高。

 4.2  Hashtable

  Hashtable是一个古老的Map实现子类,与HashMap是类似的。与HashMap的不同:

   (1)默认初始容量为11,默认加载因子为0.75;

   (2)从JDK1.0开始;

   (3)同步,线程安全的;

   (4)性能较低;

    (5)Hashtable中是不能插入null值的。

  注意:

      A:HashMap和Hashtable都是无序的;

      B:HashMap和Hashtable判断两个key相对的标准是:两个key通过equals()方法比较返回true,两个key的hashCode值也相等;

      C:HashMap和Hashtable判断两个value相对的标准是:只有两个对象通过equals()方法比较返回true即可;

      D:要在HashMap和Hashtable中存储对象,用作key的对象所属类必须实现hashCode()和equals()。

  4.3  TreeMap

   (1)TreeMap的底层数据结构是红黑树;

  (2)TreeMap子类其本身在操作的时候将按照key进行排序,key中的内容可以为任意的对象,但是要求对象所在的类必须实现Comparable接口,覆写compare方法;

  (3)TreeMap中判断两个key相等的标准是:两个key通过compareTo()方法返回0,TreeMap即认为这两个key是相等的。

  实例代码:

     

 <span style="font-family:FangSong_GB2312;font-size:14px;"> /*
每一个学生都有一个对应的归属地。
学生Student,地址String
学生属性:姓名,年龄。
注意:姓名和年龄相同的视为同一个学生。
保证学生的唯一性。
*/
import java.util.*;
class MapDemo2 
{
 public static void main(String[] args) 
 {
  Map<Student,String> map=new TreeMap<Student,String>(
   new Comparator<Student>()
   {
    //实现compare()
    public int compare(Student s1,Student s2)
    {
     int num=s1.getName().compareTo(s2.getName());
     if(num==0)
      return s1.getAge()-s2.getAge();
     return num;
    }
   });
  //添加元素
  map.put(new Student("Apple",18),"NewYork");
  map.put(new Student("Joe",20),"BeiJing");
  map.put(new Student("Eama",19),"LongDou");
  map.put(new Student("Paul",24),"Pairs");
  map.put(new Student("Nuna",18),"Shouer");
  //第一种方法获取元素
  Iterator<Student> it1=map.keySet().iterator();
  while(it1.hasNext())
  {
   Student s=it1.next();
   System.out.println("name:"+s.getName()+",age:"+s.getAge()+",contry:"+map.get(s));
  }
  //第二种方法获取元素
  Iterator<Map.Entry<Student,String>> it2=map.entrySet().iterator();;
  while(it2.hasNext())
  {
   Map.Entry<Student,String> me=it2.next();
   System.out.println("name---"+me.getKey().getName()+",age---"+me.getKey().getAge()+",contry---"+me.getValue());
  }
 }
}
//学生类
class Student implements Comparable<Student>
{
 private String name;
 private int age;
 public Student(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 public void setName(String name)
 {
  this.name=name;
 }
 public String getName()
 {
  return name;
 }
 public void setAge(int age)
 {
  this.age=age;
 }
 public int getAge()
 {
  return age;
 }
 //覆写hashCode()和equals(),compareTo()
 public int hashCode()
 {
  return name.hashCode()+age;
 }
 public boolean equals(Object obj)
 {
  if(!(obj instanceof Student))
   throw new ClassCastException("类型不匹配!");
  //类型转换
  Student s=(Student)obj;
  return this.getName().equals(s.getName())&&this.getAge()==s.getAge();
 }
 public int compareTo(Student s)
 {
  int num=this.getAge()-s.getAge();
  if(num==0)
   return this.getName().compareTo(s.getName());
  return num;
 }
 
}</span>

        5. Collections

            Collections是操作集合的工具类,其所有方法都是静态方法。该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。

 以下是一些常用方法:            
 addAll(Collection c, T... elements):将所有指定元素添加到指定 collection 中。 
 binarySearch(Listlist, T key) :使用二分搜索法搜索指定列表,以获得指定对象。
 binarySearch(List list, T key, Comparatorc) :使用二分搜索法搜索指定列表,以获得指定对象。
 copy(List dest, List src) :将所有元素从一个列表复制到另一个列表。
 fill(Listlist, T obj) :使用指定元素替换指定列表中的所有元素。 
 ArrayListlist(Enumeration e) :返回一个数组列表,它按返回顺序包含指定枚举返回的元素。
 max(Collection coll) :根据元素的自然顺序,返回给定 collection 的最大元素。
 max(Collection coll, Comparatorcomp) : 根据指定比较器产生的顺序,返回给定 collection 的最大元素。
 min(Collection coll) :根据元素的自然顺序 返回给定 collection 的最小元素。
 min(Collectioncoll, Comparator comp) :根据指定比较器产生的顺序,返回给定 collection 的最小元素。 
 replaceAll(Listlist, T oldVal, T newVal):使用另一个值替换列表中出现的所有某一指定值。
 reverse(List list) :反转指定列表中元素的顺序。
 reverseOrder() :返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。
 reverseOrder(Comparator cmp) :返回一个比较器,它强行逆转指定比较器的顺序。 
 shuffle(List list) :使用默认随机源对指定列表进行置换。 
 sort(List list) :根据元素的自然顺序 对指定列表按升序进行排序。
 sort(List list, Comparator c) :根据指定比较器产生的顺序对指定列表进行排序。
 swap(List list, int i, int j) :在指定列表的指定位置处交换元素。
 synchronizedCollection(Collection c) : 返回指定 collection 支持的同步(线程安全的)collection。

 

总结:

<1> List的遍历方法

<span style="font-family:FangSong_GB2312;font-size:14px;">//第一种:
	for(int i=0;i<list.size();i++)
	{
		System.out.println(list.get(i));
	}
	//第二种:
	for(Object obj:list)
	{
		System.out.println(obj);
	}
	//第三种
	Iterator iter=list.iterator();
	while(iter.hasNext())
	{
		System.out.println(iter.next());
	}
	//第四种
	ListIterator lister=list.listIterator();
	//从前迭代
		while(lister.hasNext())
		{
			System.out.println(lister.next());
		}
		pri("--------------------------");
		//从后迭代
		while(lister.hasPrevious())
		{
			System.out.println(lister.previous());
		}
	//第五种
	Vector v=(Vector)list;
	Enumeration e=v.elements();
	while(e.hasMoreElements())
	{
		Object obj=e.nextElements();
		System.out.println(obj);
	}
</span>	


 

<2>Set集合的遍历方法

<span style="font-family:FangSong_GB2312;font-size:14px;">//第一种
	for(Object obj:set)
	{
		System.out.println(obj);
	}
	//第二种
	Iterator iter=set.iterator();
	while(iter.hasNext())
	{
		System.out.println(iter.next());
	}</span>


 

<3>Map集合的遍历方法

<span style="font-family:FangSong_GB2312;font-size:14px;">//第一种
	Set<Map.Entry<K,V>> set=map.entrySet();
	Iterator<Map.Entry<K,V>> iter=set.iterator();
	while(iter.hasNext())
	{
		Map.Entry<K,V> entry=iter.next();
		System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
	}
	//第二种
	Set<K> keys=map.keySet();
	Iterator<K> iter=keys.iterator();
	while(iter.hasNext())
	{
		K key=iter.next();
		System.out.println("key:"+key+",vaule:"+map.get(key));
	}</span>


------- android培训java培训、期待与您交流! ----------


### Java 高级集合进阶教程 #### Set 接口及其子类特性 Set接口是Java集合框架中的一个重要部分,它不允许存储重复元素。这使得`Set`非常适合用于去除重复项以及表示数学上的集合理论概念。 - **HashSet**: 实现了`Set`接口,内部基于哈希表实现[^3]。其特点是查找速度非常快,因为它是无序的,并且允许null值的存在(仅限一个)。为了保证元素唯一性,在向`HashSet`中添加对象时会调用该对象的`hashCode()`和`equals()`方法来判断是否已经存在相同元素。 ```java import java.util.HashSet; public class Student { private String name; public Student(String name){ this.name = name; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Student other = (Student) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } ``` - **LinkedHashSet**: 继承自`HashSet`,除了具备后者所有的性质外还保持了插入顺序不变。这意味着当你迭代这个set的时候,你会按照最初加入这些项目的次序得到它们。 - **TreeSet**: 提供了一种有序的方式去保存元素,底层采用红黑树结构实现了排序功能。可以通过自然排序(`Comparable`)或定制比较器(`Comparator`)两种方式定义元素之间的大小关系。 #### Collection 和 Map 的区别与联系 在Java中,`Collection`是一个顶层接口,代表一组单一类型的对象列表。而`Map`则用来映射键到值之间的一对一关联,即每一对键都对应着唯一的值[^4]。 对于想要深入了解高级集合特性的开发者来说: - `Collection`适用于处理单列数据; - `Map`更适合于管理具有键值对形式的数据。 了解两者间的差异有助于选择合适的数据容器以满足特定应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值