1:集合的并发修改异常
使用迭代器遍历集合时,有同时在删除集合 中的数据,程序就会出现并发修改异常的错误。
由于增强for循环遍历集合就是迭代器遍历集合的简化写法,因此,使用增强for循环遍历集合,又在同时删除集合 中的数据时,程序也会出现并发修改异常的错误。
2:怎样保证遍历集合同时删除数据时不出bug?
使用迭代器遍历集合,但用迭代器自己的删除方法删除数据即可。
如果能用for循环遍历时:可以倒着遍历并删除;或者从前往后遍历,但删除元素后做i--操作
3:可变参数:就是一种特殊形参,定义在方法,构造器的形参列表里,格式是:数据类型...参数名称;
可变参数的特点和好处:
特点:可以传一个或者同时传多个数据给它;也可以传一个数组给它。
好处: 常常用来灵活的接收数据。
Collection:是一个用来操作集合的工具类。
4:Map集合:双列集合
格式:{key1=value1, key2=value2,key3=value3...} ,一次需要存一对数据作为一个元素。
Map集合的每一个元素,“key=value”称为一个键值对/键值对对象/一个Entry对象,Map集合也被叫做“键值对集合”
Map集合的所有键是不允许重复的,但值可以重复,键和值是一一对应的,每一个键只能找到自己对应的值。
5:Map集合体系的特点:
注意:Map系列 集合的特点都是由键决定的,值只能是一个附属品,值是不做要求的。
HashMap:(由键决定特点)无序,不重复,无索引
LinkedHashMap:(由键决定特点)有序,不重复,无索引
TreeMap:(由键决定特点) 按照大小默认升序排列,不重复,无索引
为什么要先学习Map的常用方法?
Map是双列集合的祖宗,它的功能是全部双列集合都可以继承过来使用的。
6::Map集合的遍历方式
键找值:先获取Map集合全部的键,再通过遍历键来找值
键值对:把“键值对”看成一个整体进行遍历
Lambda:JDK1.8开始之后的新技术
键找值需要用到的Map方法如下:
键值对:
Entry对象
Map.Entry<String,double>
Lambda:
map,forEach(k,v)->{
System.out.println(k+"------>"+v) ;
});
7:HashMap集合的底层执行原理:
HashMap跟HashSet的底层原理是一模一样的,都是基于哈希表实现的。原来学的Set 系列集合的底层就是基于Map实现的,只是Set集合的元素只要键数据,不要值数据而已。
HashMap集合是一种增删改查数据,性能都较好的集合。
但它是无序,不能重复,没有索引支持的(由键决定特点)
HashMap的键依赖hashCode方法和equals方法保证键的唯一
如果键存储的是自定义类型的对象,可以通过重写hashCode方法和equals方法,这样可以保证多个对象内容一样时,HashMap 集合就能认为是重复的
LinkedHashMap集合的原理:
底层数据结构是基于哈希表实现的,只是每个键值对元素额外的多了一个双链表的机制记录顺序(保证有序)。实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。
TreeMap
特点:不重复,无索引,可排序(按照键的大小默认升序排序,只能对键排序)
原理:TreeMap跟TreeSet集合的底层原理是一样的,都是基于红黑树实现的排序。
TreeMap集合同样也支持两种方式来指定排序规则:
让类实现Comparable接口,重写比较规则
TreeMap集合有一个有参构造器,支持创建Comparator比较器对象,以便用来指定比较规则。