集合
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
是一个古老的集合,通常建议使用ArrayList
ArrayList
是线程不安全的, 而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 许可协议。转载请注明出处!