一、集合的概述
1.Java集合大概可以分为Set,List,Map,Queue四种体系,其中Set是无序唯一的(不可重复),List是有序不唯一的(可以重复)
2.Java集合主要有Collection和Map接口,这两个集合框架又包含了一些子类接口的实现
二、toArray()方法和toString()方法
1.toArray():不管Collection是否使用了泛型,toArray()的返回值总是Object[],后来新增加了一个toArray(IntFunction)方法后,当Collection使用了泛型后返回的类型为特定类型的数组
2.toString()一次性的输出集合中所有的元素
三、几种遍历
1、使用lambda表达式
import java.util.ArrayList;
import java.util.List;
//集合容器
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("lpf");
list.add("sjp");
System.out.println(list.toString());
list.forEach((item->{
System.out.println(item);
}));
}
}
2、使用Iterator遍历元素--迭代器
定义了四个方法
1.Boolean hasNext():如果被迭代的元素中还没有被遍历完,返回true
2.Object next():返回集合的下一个元素
3.void remove():删除集合里上一次next方法返回的元素
4.void forEachRemaining(Consumer action):java8默认的方法,使用lambda表达式来遍历
注意的是:Iterator迭代器采用的是快速失败(fail-fast)机制,一旦集合被修改立即引发ConcurrentModificationException异常
import java.awt.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
//集合容器
public class Test {
public static void main(String[] args) {
HashSet<String> h = new HashSet<>();
h.add("java");
h.add("python");
h.add("Linux");
//使用iterator获取iterator对象
Iterator iterator=h.iterator();
while(iterator.hasNext()){
//泛型给出的对象类型
String item=(String) iterator.next();
System.out.println(item);
if(item.equals("python")){
//使用iterator迭代过程中不可以修改集合的元素
//h.remove(item);
}
}
}
}
3、使用forEach遍历集合元素
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
//集合容器
public class Test {
public static void main(String[] args) {
for(String item:h){
System.out.println(item);
if(item.equals("python")){
//引发异常
//h.remove(item);
}
}
}
}
4.for循环遍历
import java.util.ArrayList;
//集合容器
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("lpf");
list.add("sjp");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
四、Set集合
1.HashSet类
HashSet按照Hash算法来存储集合中的元素因此具有很好的存取和查找功能
特点
1.不能保证元素的排列顺序(无序性)
2.HashSet不是同步的,如果多个线程访问HashSet,假设有两个或两个以上的线程同时修改集合中的元素,则必须通过代码来同步
3.集合中的元素可以为null
HashSet判断两个元素相等的标准:
通过equals()方法比较相等,并且两个对象的hashCode()方法的返回值也相等
HashSet速度快的原因:我们都知道数组通过索引来快速的查找元素,但是HashSet没有索引这一概念,所以借助hash算法的功能,根据元素的hashcode计算出元素的位置,之所以不适用数组是因为数组的长度不可变,无法增加长度,所以才使用HashSet,因此,从HashSet中访问元素时,先计算改元素的hashcode值(调用该对象的hashcode()方法的返回值),然乎直接用hashcode的值所对应的位置取出元素
说一下 HashSet 的实现原理?
HashSet 是基于 HashMap 实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
HashSet如何检查重复?HashSet是如何保证数据不可重复的?
向HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。
HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较key是否相等是先比较hashcode