09 集合框架2
集合元素的迭代方式有哪些?
for循环,for-each循环(底层迭代器),迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()) {String ele = it.next();System.out.println(ele);
}
并发修改集合元素异常是怎么造成的?怎么解决?
在迭代过程中使用List里面的增加方法和删除方法修改了集合的长度
解决方法:使用迭代器的删除方法去删除集合里面的值
示例:
Iterator<String> it=list.iterator();
while(it.hasNext()){
String b=it.next();
if(a.equals(b)){
it.remove();
}
}
Set集合的特点是什么?有哪些常用的实现?
特点:不记录元素添加顺序,元素不可以重复
常用的实现:
HashSet:底层是哈希表,删改的效率高,需要在类中重写equals方法
TreeSet:底层是红黑树,用于比较值的大小,有排序的作用,使用comparable接口和comparator接口
HashSet集合的底层原理是什么?
Hashset:底层是哈希表,先使用hashcode计算值的索引,看这个 索引位置上是否有元素,如果没有就直接添加进去.如果有的话,使用equals方法进行比较两个元素是否相等,如果相等就放弃添加,不同就在该索引位置使用链表进行添加
HashSet使用hash表计算值添加元素
TreeSet使用二叉树添加元素
Comparable接口和Comparator接口的作用和区别?
Comparable:内部比较器使用ComparaTo的方法对元素大小进行比较,然后将集合元素按照升序排列
示例:
public class User2 implements Comparable<User2> {//给类型才正确private String name;private int age;//省略getter,setter方法//重写规则@Overridepublic int compareTo(User2 o) {//实现比较的规则//return this.age=o.getAge();//使用里面的字段进行比较,比较规则return this.name.compareTo(o.getName());//return 0;//0表示两个对象相同}//集合调用格式//创建三个对象加载TreeSet集合中User2 u1=new User2("张三",21);User2 u2=new User2("李四",22);User2 u4=new User2("王五",23);Set<User2> set=new TreeSet<>();//第一个直接添加set.add(u1);
Comparator:外部比较器,在外部创建一个类继承该接口,重写里面的comparator方法,自己定义里面的规则
public class NameComparator implements Comparator<UserComparator> {
//comparator比较器,自定义排序规则@Overridepublic int compare(UserComparator o1, UserComparator o2) {return o1.getName().compareTo(o2.getName());}//对象调用格式//创建三个对象加载TreeSet集合中UserComparator u1=new UserComparator("张三",21);UserComparator u2=new UserComparator("李四",22);UserComparator u3=new UserComparator("王五",23);UserComparator u4=new UserComparator("王五",23);Set<UserComparator> set=new TreeSet<>(new NameComparator());//使用NameComparator来实现比较//第一个直接添加set.add(u1);
说说Map集合的使用场景
应用于键和值一一对应的情况,配合循环语句增删改查的效率很高,
与类型无关,应用于低耦合场景,代码更通用
可以轻松取得值的个数
如何完成Map集合中元素的增删改查?
//创建 Map集合
Map<String Object> map=new HashMap<>();
//添加
map.put("张三",25);
//修改
map.put("张三",56);
//删除
map.remove("张三")//使用键值进行删除
//查询
map.get("张三")//用键查值
map.containskey("张三")//判断map中是否有指定的key
map.containsvalue(23)//判断map中是否包含指定的值//获取map中所有的键
Set<String> keys=map.keySet();
for(key:keys){
sout.key;
}//获取map中所有的value
Set<Objiect> values=map.values();
sout.values;//拿到里面所有的键值对
Set<Map.Entry<String,Objiect>> intries=map.entrySet();
sout.intries;
//取出里面的每一个键值对
for(Map.Entry<String,Objiect> entry:entries){sout.(entry.getkey());//sout.(entry.getvalue());
}
TreeMap的使用方法和TreeSet相同