集合
Java 集合类存放于 java.util 包中,是一个用来存放对象的容器
- Java 集合只能存放对象。
- 集合存放的是多个对象的引用,对象本身还是存放在堆内存中
- 集合可以存放不同类型,不限数量的数据类型
Java 集合可分为 Set、List、Map 三种大体系:
Set:无序、不可重复集合List:有序,可重复集合Map:具有映射关系的集合
在 JDK5 之后,增加了泛型,Java集合可以记住容器中对象的数据类型
HashSet
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。我们大多数时候说的 Set 集合值得都是 HashSet
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
HashSet 具有以下特点:
- 不能保证元素的排列顺序
- 不可重复
HashSet不是线程安全的- 集合元素可以是
null
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值确定该对象在 HashSet 中的存储位置。
如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。
Hashset 方法
1 | set.add(); // 添加元素 |
hashCode() 方法
HashSet集合判断两个元素相等的标准:两个对象通过 equals() 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。
如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同。
如果想让集合只能存同样类型的对象,使用泛型:
1 | Set<String> set = new HashSet<String>(); // 该集合只能存 String 类型的数据 |
TreeSet
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。TreeSet 支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
自然排序
排序:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
- 如果 this > obj, 返回正数 1
- 如果 this < obj, 返回负数 -1
- 如果 this = obj, 返回 0,则认为这两个对象相等
- 必须放入同样类的对象(默认会进行排序)否则可能会发生类型转换异常,可以使用泛型来进行限制。
定制排序
如果要实现定制排序,则需要在创建 TreeSet 集合对象时,提供一个 Comparator 接口的实现类对象。由该 Comparator 对象负责集合元素的排序逻辑。
1 | class Person implements Comparator<Person> { // 按照年龄排序 |
List 与 ArrayList
List 代表一个元素有序,且可重复的集合,集合中的每个元素都有其对应的顺序
List 允许使用重复元素,可以通过索引来访问指定位置的元素集合
List 默认按元素的添加顺序设置元素的索引
List 集合里添加了一些根据索引来操作集合的方法
1 | list.get(2); // 通过索引来访问指定位置的集合元素 |
ArrayList 和 Vector
ArrayList 和 Vector 是 List 接口的两个典型实现。
区别:
Vector是一个古老的集合,通常建议使用ArrayListArrayList是线程不安全的, 而Vector是线程安全的- 即使为保证
List集合线程安全,也不推荐使用Vector
Map
Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value
Map 中的 Key 和 Value 都可以是任何引用类型的数据
Map 中的 key 不允许重复,即同一个 Map 对象的任何两个 Key 通过 equals() 方法比较返回 false
Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到唯一的确定的 Value
1 | map.put("b",1); // 添加数据 |
HashMap 和 Hashtable
HashMap 和 HashValue 是 Map 接口的两个典型实现类。
区别:
Hashtable是一个古老的 Map 实现类,不建议使用Hashtable是一个线程安全的 Map 实现,但HashMap是线程不安全的Hashtable不允许使用null作为key和value, 而HashMap可以
与 HashSet 集合不能保证元素的顺序一样,Hashtable、HashMap 也不能保证其中 key-value 对的顺序
Hashtable、HashMap 判断两个 Key 相等的标准是:两个 key 通过 equals() 方法返回 true,hashCode值也相等
Hashtable、HashMap 相等的标准是:两个value 通过 equalsHashMap 判断两个 Values 方法返回 true
TreeMap
TreeMap 存储 Key-Value 对时,需要根据 Key 对 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态.
TreeMap 的 key 的排序:
- 自然排序:
TreeMap的所有的Key必须实现Comparable接口,而且所有的Key应该是同一个类的对象,否则会抛出ClassCastException - 定制排序:创建
TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中所有key进行排序。此时,不需要Map的Key实现Comparable接口
操作集合的工具类 Collections
Collections 是一个操作 Set、List 和 Map 等集合的工具类
Collections 中提供了大量方法对集合进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。
排序操作:
reverse(List): 反转 List 元素顺序shuffle(List)对 List 集合元素进行随机排序sort(List)根据元素的自然顺序对指定 List 集合元素按升序排序sort(List, Comparator)根据指定的 Comparator 产生的顺序对 List 集合元素进行排序swap(List, int i, int j)将指定 list 集合中的 i 处元素 和 j 处元素进行交换
查找、替换
Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素Object max(Collection, Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素Object min(Collection)Object min(Collection, Comparator)int frequency(Collection, Object):返回指定集合中指定元素的出现次数boolean replaceAll(List list, Object oldVal, Object newVal):使用新值替换 List 对象的所有指定旧值
- 本文作者: Kelly Liu
- 本文链接: http://tiantianliu2018.github.io/2019/10/12/Java-集合/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
