Java专题 Collection下list,set关系 hashset去重原理 总结+案例

Collection 对象数组不能扩展和修改,每一次添加元素都必须重新建立一个新的对象

//	Collection					        单列集合的顶层接口
//	 	    List						有序的子接口
//	 	 	    ArrayList 	 	 	顺序存储,查询修改快
//	 	 	    LinkedList			链式存储,增加删除快
//	 	 	    Vector 	 	 	 	顺序存储,都慢但线程安全
//	 	    Set							无序的子接口
//	 	 	    HashSet				哈希存储
//	 	 	 	    LinkedHashSet

构造方法 以及常用方法

	
	//构造方法		Collection为接口需要实现类来创建
	Collection collection = new ArrayList<>();		//可在类名或接口名后加泛型
	Collection collection1 = new LinkedList<>();
	Collection collection2 = new Vector();
	List co = new ArrayList<>();					//可在类名或接口名后加泛型
	List col = new LinkedList<>();
	List coll = new Vector();
	
	
	//常用方法
	collection.add("adwaw");				//不用泛型修饰则可添加任意类型
	collection.add("adwaw");
	collection.add(135342);
	collection.add(132.142);
	collection.add('s');
	collection.add(true);
	
	collection.remove("adwaw");			//删除任意类型的某个元素  用一次删一个 没有就不删
	
	collection.size();					//元素个数
	collection.contains(collection);    //是否包含参数中的元素
	collection.isEmpty();				//是否为空
	collection.clear();					//清空集合
	

遍历方式

结果
增删LinkedList最快, 查询Linked List最慢 ArrayList平均时间在Vector 和 Linked List之间
ArrayList最常用

Collection 的遍历方式

	//Collection 的遍历方式
	//第一种
	Collection collection3 = new ArrayList<>();
	collection3.add("asdasd");
	collection3.add("asdasd");
	collection3.add("asdasd");
	
	Object[] array = collection3.toArray();
	
	for (int i = 0; i < array.length; i++) {
		System.out.println(array[i]);
	}
	
	
	//Collection 中带All的方法
	collection.addAll(collection1);				//将参数中的所有元素添加到调用者中
	collection.removeAll(collection3);			//删除也存在于参数中的所有元素
	collection.containsAll(collection3);		//是否包含参数中的所有
	collection.retainAll(collection3);			//保留与参数中同样拥有的元素	交集
	
	
	//第二种遍历方式
	Collection	c1 = new ArrayList<>();
	c1.add("123sv");
	c1.add("123sv");
	c1.add("123sv");
	c1.add("123sv");
	c1.add("123sv");
	
	Iterator iterator = c1.iterator();
	while (iterator.hasNext()) {
		System.out.println(iterator.next());	//每获取一个,指针指向下一位
	}
	

List

	//List			有索引
	
	//特有方法
	List list = new ArrayList<>();
	list.add(0, "daw");				//在指定位置添加元素   没有泛型就可以任意类型
	list.add(0, "daw");
	
	list.remove(0);			//删除指定位置元素
	list.set(0, "341");		//修改指定位置的值
	list.get(0);			//得到指定位置的元素
	
	
	//遍历方式
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}

特殊异常

	ConcurrentModificationException
	并发修改异常
	出现原因:
	在使用【迭代器对象】遍历集合的同时,使用【集合对象】增加或删除集合的元素
	解决方法:两种解决方式都是针对List集合可以解决
	方式1:迭代器遍历、迭代器增加
	方式2:集合遍历、集合增加
	//Vector		已过时被ArraysList替代	线程安全,效率较低 顺序存储,增删较慢
	
	//ArrayList    时List的一个实现类 没有特殊方法 数组实现 顺序存储
	
	//LinkedList   链表式的数组	结点中除了元素还有下一个元素的地址,链表  查询慢 每一个都要访问
								//删减最快 与顺序无关 转移指针即可。
	//LinkedList  特有方法
	LinkedList list2 = new LinkedList<>();
	list2.addFirst(list);				//首尾添加
	list2.addLast(list);
	list2.getFirst();					//获取首尾
	list2.getLast();
	list2.removeLast();					//删除首尾
	list2.removeFirst();
	

set 以及hashset去重原理

	//Set(集合)           Collection 中的另一个子接口
	//元素不能重复,没有顺序
	
	//实现类
	Set<String> set = new HashSet<String>();
	
	
	//Set集合遍历
	//1
	Object[] array = set.toArray();
	for (int i = 0; i < array.length; i++) {
		System.out.println(array[i]);
	}
	
	
	//2
//	转成数组,toArray(T[] arr),带泛型的转数组,得到的是T类型的数组。
// 	1、自己创建的数组大小,小于集合元素个数
// 	 	在方法中,就只能创建一个新的数组,使用集合元素将数组填充,将新数组返回
// 	2、自己创建的数组大小,等于集合元素个数
// 	  	在方法中,就不需要创建新的数组,使用集合元素将传入的数组填充,将原数组返回
// 	3、自己创建的数组大小,大于集合元素个数
// 	 	在方法中,也不创建新的数组,直接将传入的数组前面几个位置填充,为集合的元素,剩余位置使用null填充(默认值就是null)
	public static void test2(Set<String> s) {
		//数组长度与集合元素个数相等,不会创建新的数组
		String[] strArr=new String[s.size()];
		String[] array = s.toArray(strArr);
		
		bianli(array);
		System.out.println("=========");
		bianli(strArr);
	}
	public static void test3(Set<String> s) {
		//数组长度小于集合元素个数,会创建新的数组
		String[] strArr=new String[s.size()-3];
		String[] array = s.toArray(strArr);
		
		bianli(array);
		System.out.println("=========");
		bianli(strArr);
	}
	public static void test4(Set<String> s) {
		//数组长度大于集合元素个数,不会创建新的数组
		String[] strArr=new String[s.size()+5];
		String[] array = s.toArray(strArr);
		
		bianli(array);
		System.out.println("=========");
		bianli(strArr);
	}
	public static void bianli(String[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+" ");
		}
	}

	
	//迭代器
	Iterator<String> iterator = set.iterator();
	while (iterator.hasNext()) {
		System.out.println(iterator.next());
	}
	
	
	//foreach 循环
	for (Object object : array) {
		System.out.println(object);
	}
	
	
	//HashSet 去重原理 
	//对内在元素的hashcode和euals进行对比
	//将hashcode和equals方法进行重写之后将可以对自定义类进行去重,没有重写的类将不会除重
	
	//linkedlist 固定了顺序的set集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值