Java 集合框架
List 不唯一、有序;Set 唯一、无序。
Vector 也实现了 List 接口,实现了 ArrayList 的所有操作。主要区别:Vector 线程安全操作相对较慢,ArrayList重速度,线程非安全。长度增长时,Vector 默认增长100%,ArrayList 增长50%。使用 capacity() 方法获取实际的空间。—— 二者默认初始大小皆为 10.
HashCode() 方法的实现:所有用于判断相等的字段在hashCode中都要使用(例如 Hashtable 就是把每一个 Entry 的 hashCode 相加,得到最后的 hashCode:如果某一项是数值,就直接相加等等;如果不是就加上该项的 hashCode)。
HashSet:哈希实现 Set 的特性,故元素顺序不一定恒久不变(加入新元素,可能改变元素遍历顺序);TreeSet:二叉排序树实现 Set,故有序。其他地方和 HashSet 类似。但需要提供办法让元素可比较,有两种方法:
一、让元素自身具备可比性,实现 Comparable<T> 接口:
重载其 compareTo 方法,如:
/* * 升序(从小到大):比参数小,返回负整数;比参数大,返回正整数。否则返回0 * 降序反之 */ @Override public int compareTo(Dog dog) { if(this.intimacy < dog.intimacy) { return -1; } if(this.intimacy > dog.intimacy) { return 1; } return 0; }
二、使用比较器,Comparator 接口:
// 降序 TreeSet<Dog> dogs = new TreeSet<>((Dog dog1, Dog dog2) -> { if(dog1.getIntimacy() < dog2.getIntimacy()) return 1; if(dog1.getIntimacy() > dog2.getIntimacy()) return -1; return 0; });
Hashtable 与 HashMap 的原理、功能相同,可以互用。其区别在于:
- Hashtable 继承 Dictionary 类,HashMap 实现 Map 接口。
- Hashtable 线程安全,HashMap 线程不安全(多线程开发中,酌情使用 Hashtable)。
- Hashtable 不允许 null 值,HashMap 允许。