ArrayList和linkedList的对比
ArrayList:底层使用数组实现的,查询快,增删慢,线程不安全,当数据查询比较多时使用
linkedLis:底层使用双向链表实现的,查询慢,增删快。当对数据进行操作较多时使用
Set接口:实现类主要掌握:HashSet,TreeSet
hashSet:数组+链表+红黑树
TreeSet:使用二叉树实现,可以对常见元素进行排序
Set接口的特点:
没有通过下标操作的API,存储无序,不能存储重复元素
问题:为什么说是存储无序?
set结合在存储值时,会根据值的hashcode来计算出该值在数组中的存储位置,因为不同的值,一般hashcode不相同,所以计算出来的存储位置,却取决于hashcode,因此存储位置是杂乱的
为什么说是不重复?
在存储值时,首先判断是否已经存储了hashcode一样的值,使用equals进行判断,equals相同--》不存储 equals---》不相同,则存储,如果存在不相同的hashcode直接存储。
![](https://i-blog.csdnimg.cn/blog_migrate/92c664415ef040a64d5ecdc54b9653ee.jpeg)
为什么TreeSet存储自定义类型数据会报错
是因为Treeset不知道按照类型的哪个属性进行排序。
处理办法:
(1)让实体类实现Comparable接口(内部比较器)
(2)重写comparableTo方法,制定类的排序规则
规则:
前>后 返回 正数
相等 返回 0
前<后 返回 负数
在HashSet存储自定义类型中,如何将两个对象属性完全相同的对象在进行hashcode存储时,将其看成重复元素,不进行重复添加?
第一步:让属性值相同的两个对象相同的hashcode
第二步:让属性值相同的两个对象进行equals比较时,返回true--重写equals方法