Summary: list/set/迭代器/比较器/(==/equals/hashcode)区别 * 集合:collection * 1、子接口: List List 特征:维护有序的,可重复的集合。 List的实现类: ArrayList LinkedList Vector ArrayList 底层是一个可扩容的数组.拥有下标(索引),从零开始。 LinkedList 底层是:双向链表,插入删除速度快,检索速度慢。 Vector 是一个线程安全的集合。
2、子接口:Set Set 特征: 维护着无序的,不可重复的集合。 Set存储元素使用的是散列表存储。当散列表中存在已有对象,首先判断hashCode是否相同, 如果不同,直接存入。如果相同再判断equals方法,如果equals方法为false则存入,如果为 ture,则不存入。(==/equals/hashcode不同) HashSet 使用散列表存储元素。 linkedHashSet 使用散列表存储元素,在元素中添加了双向链表,从而能记录对象的前后顺序。 TreeSet维护科技型排序的元素的集合。使用Comparator接口的实现类进行排序(不然是默认的按数字或者字母进行排序)。 # 迭代器iterator获取set内的元素的两种写法: 1 Iterator var3 = logs.iterator();(用的多) while(var3.hasNext()){ Log r1 = (Log)var3.next(); System.out.println(r1); } 2 Iterator<Log> iterator = logs.iterator(); while(iterator.hasNext()){ System.out.println((Log)iterator.next()); }
# ==/equals/hashcode 不同
- ==: 基本数据类型引用的是值。引用类型数据,比较的是内存地址,有可能内容一样,但内存地址不一样。
- .equals: 比较引用类型的的属性,eg.字符串的内容。如果重写了方法,比较的则是其内存地址。
- hashCode:内存地址转为Int,并返回值(哈希码/散列码),能更好确定对象在哈希表中索引位置。
- 其他:对象不同但哈希码可能相同(哈希冲突),因此再用.equals判断是否绝对相等。但两个完全相同的对象(内存地址指向同一个),那hashcode一定相同。