集合

一、 Collection

集合是用來管理多個對象的對象,相對於數組來說,在使用前可以不必確定元素的類型,也不必確定元素數量

Collection是集合框架中的根接口,聲明瞭集合框架中常用的方法

Add

Contains

Remove

iterate

二、 List:元素是有序,可以重複

a) ArrayList,基於數組,底層是使用數組來存儲元素,當存儲的元素數量超過一定的配置時,就會創建一個比原來的容量大新的數組,再將原來數組中的值複製到新數組中

b) 爲什麼要使用Iterator,使用增強for循環就可以對集合元素進行遍歷,但如果要在遍歷的過程中對集合進行結構上的修改,就必須使用Iterator,否則會拋ConcurrentModifyException

c) ArrayList,底層是基於數組的,可以隨機訪問元素,但不方便隨機插入元素,線程不安全

d) Vector:ArrayList基本相同,但它是線程安全的,效率低

e) LinkedList:基於鏈接列表實現,方便隨機插入元素,不方便隨機訪問元素

三、 Set:元素是無序,不可以重複,只能接收一個null元素,判斷元素是否存在與hashCode方法和equals方法有關係

a) HashSet:

四、 SortedSet:元素是無序,不可以重複,支持排序

a) TreeSet

五、 Map:不是Collection的子接口,以鍵值對的形式存儲元素

a) HashTable:線程安全,效率低

b)HashMap:線程不安全,效率高,

它是鍵值對的形式存儲數據,鍵基於set,不重複,無序值是可以重複,可以爲null,set集合中添加數據時,如果數據已經存在,數據添加不進去,但在map中,如果鍵已經存在,會把原來對應的鍵的值覆蓋.鍵和值都可爲null,但不能同時爲null

public class Student /*implements Comparable<Student>*/{
	private Long id;
	private static long count = 0;
	private String name;
	
	public Student(String name) {
		count++;
		id = count;
		this.name = name;
	}
	@Override
	public String toString() {
		return id+"\t"+name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Long getId() {
		return id;
	}
	
	@Override
	public boolean equals(Object obj) {
		if(obj == this)
			return true;
		if(obj==null)
			return false;
		if(obj instanceof Student){
			Student t = (Student)obj;
			if(t.name!=null&&t.name.equals(this.name)){
				return true; 
			}else{
				return false;
			}
		}else{
			return false;
		}
	}
	
	@Override
	public int hashCode() {
		return name.hashCode();
	}
//	public int compareTo(Student o) {
//		return this.name.compareTo(o.name);
//	}
	
	public String getName() {
		return name;
	}
}

Collection常用的一些方法

@Test
	public void test(){
		//創建一個集合
		Collection c = new ArrayList();
		//給集合添加元素
		c.add(1);
		c.add("ab");
		c.add(new Student("zs"));
		//查看集合中元素的數量
		System.out.println(c.size());
		System.out.println(c);
		//遍歷元素:增強for循環
		for (Object o : c) {
			System.out.println(o);
		}
		//遍歷元素:Iterator
		System.out.println("=================");
		Iterator ite = c.iterator();
		while(ite.hasNext()){
			Object o = ite.next();
			System.out.println(o);
		}
	}

快速失敗

@Test
	public void test2(){
		List<String> names = new ArrayList<String>();
		names.add("aa");
		names.add("bb");
		names.add("cc");
		names.add("dd");
		//使用For循環時,不能刪除元素
//		for (String name : names) {
//			if("bb".equals(name))
//				names.remove(name);
//			else
//				System.out.println(name);
//		}
		//只有使用Iterator纔可以在遍歷時修改集合的結構
		Iterator<String> ite = names.iterator();
		while(ite.hasNext()){
			String name = ite.next();
			if("bb".equals(name))
				ite.remove();
			else
				System.out.println(name);
		}
	}

ArrayList的一些操作

@Test
	public void test3(){
		List<String> names = new ArrayList<String>();
		names.add("aa");
		names.add("bb");
		names.add(1,"cc");
		names.add("dd");
		System.out.println(names);//aa,cc,bb,dd
		names.set(2, "ee");
		System.out.println(names);//aa,cc,ee,dd
		
		//獲取索引爲2的元素
		System.out.println(names.get(2));
	}
	//可以添加null
@Test
	public void test4(){
		List<Integer> is = new ArrayList<Integer>();
		System.out.println(is.size());//0
		is.add(12);
		is.add(null);//可以添加null
		is.add(null);//元素可以重複
		System.out.println(is.size());//3
		
	}
集合中元素本質是一個對象

@Test
	public void test5(){
		List<Student> stus = new ArrayList<Student>();//泛型,限定集合接收的類型
		Student s = new Student("張三");
		//集合中的元素其實是一個變量
		stus.add(s);//只不過是在集合中添加了一個Student類型的變量而已
		stus.add(s);
		stus.add(s);//到這個時候,有4個變量在引用Student對象
		System.out.println(stus.size());
		stus.get(2).setName("李四");
		System.out.println(stus.get(0));//李四
		System.out.println("====================");
		System.out.println(stus);//[1	李四, 1	李四, 1	李四]
	}

測試ArrayListLinkedList性能異同

@Test
	public void test6(){
		Random r = new Random();
		//基於鏈表的list隨機插入效率高,隨機訪問效率低
		List<String> names = new LinkedList<String>();
		names.add("aa");
		names.add("bb");
		long b = System.currentTimeMillis();//系統當前時間
		for(int i=0;i<1000000;i++){
			names.add(1,"cc"+i);
		}
		System.out.println(System.currentTimeMillis()-b);
		b = System.currentTimeMillis();
		for(int i=0;i<1000;i++)
			names.get(r.nextInt(1000000));
		System.out.println(System.currentTimeMillis()-b);
		List<String> names2 = new ArrayList<String>();
		names2.add("aa");
		names2.add("bb");
		b = System.currentTimeMillis();
		for(int i=0;i<1000000;i++){
			names2.add(1,"cc"+i);
		}
		System.out.println(System.currentTimeMillis()-b);
		b = System.currentTimeMillis();
		for(int i=0;i<1000;i++)
			names.get(r.nextInt(1000000));
		System.out.println(System.currentTimeMillis()-b);
	}

集合有序不同於集合排序

@Test
	public void test7(){
		//
		List<String> names = new ArrayList<String>();
		//list集合是有序的
		names.add("ba");
		names.add("ab");
		names.add("aa");
		names.add(2,"bd");
		names.add("bc");
		System.out.println(names);
		//對集合進行排序
		names.sort(new Comparator<String>() {
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
		});
		System.out.println(names);
	}

Set(不能重複)的一些方法

@Test
	public void test(){
		Set<Double> sd = new HashSet<Double>();
		sd.add(1.2);//true
		sd.add(2.3);//true
		sd.add(1.2);//false,在這個集合中已經存在值爲1.2的元素,重複,添加不成功
		System.out.println(sd.size());
	}
@Test
	public void test2(){
		Set<Student> st = new HashSet<Student>();
		Student s = new Student("zs");
		st.add(s);
		st.add(s);
		System.out.println(st.size());//1
		s = new Student("zs");
		st.add(s);//添加一個新對象,新對象與原來的對象的地址不同,當student沒有重寫equals方法,按
		//Object類中的equals方法的邏輯來比較
		System.out.println(st.size());//2
	}

添加到Treeset中的元素要麼實現Compareable接口,或是提供Comparator接口的實現

@Test
	public void test5(){
		//實現Compareable接口,
		Set<Student> stus = new TreeSet<Student>();
		stus.add(new Student("aa"));
		stus.add(new Student("ba"));
		stus.add(new Student("ab"));
		System.out.println(stus);
	}
implements Comparable<Student>
重寫compareTo方法
Public int compareTo(Student o){
Return this.name.compareTo(o.name);
}

//Comparator接口的實現
Set<Student> stus = new TreeSet<Student>(new Comparator<Student>(){
Public int compare(student o1,Student o2){
Return o1.getName.compareTo(o2.getName)
}

})

獲得List集合中所有不重複的元素

@Test
	public void test3(){
		List<String> names = new ArrayList<String>();
		names.add("aa");
		names.add("bb");
		names.add("aa");
		names.add("aa");
		names.add("aa");
		System.out.println(names);
		Set<String> ns = new HashSet<String>();
		ns.addAll(names);
		System.out.println(ns);
	}

@Test
	public void test4(){
		Set<Integer> a = new HashSet<Integer>();
		a.add(23);
		a.add(12);
		a.add(7);
		a.add(72);
		System.out.println(a);
		SortedSet<Integer> names = new TreeSet<Integer>();
		names.add(23);
		names.add(12);
		names.add(7);
		names.add(72);
		System.out.println(names);
		SortedSet<String> ss = new TreeSet<String>();
		ss.add("aa");
		ss.add("cc");
		ss.add("kk");
		ss.add("ee");
		System.out.println(ss);
		
	}

Toarray

@Test
	public void testToArray(){
		Set<Integer >  is = new HashSet<Integer>();
		is.add(23);
		is.add(12);
		is.add(45);
		is.add(26);
		
		//將is轉換成數組
		Integer[] ia = is.toArray(new Integer[0]);
		for(int i=0;i<ia.length;i++){
			System.out.println(ia[i]);
		}
	}

Set判斷對象是否相等時通過equalshashcode

@Override
	public boolean equals(Object obj) {
		if(obj == this)
			return true;
		if(obj==null)
			return false;
		if(obj instanceof Student){
			Student t = (Student)obj;
			if(t.name!=null&&t.name.equals(this.name)){
				return true; 
			}else{
				return false;
			}
		}else{
			return false;
		}
	}
	
	@Override
	public int hashCode() {
		return name.hashCode();
	}





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章