Java中集合类的详解
1、集合的概述
集合在Java是一种用来存储多个数据的容器,它的功能与数组相类似,但集合类的提出解决了数组长度不可变的难题,让数据的存储更加方便快捷。
按照集合的存储结构,可以将集合类分为两大类,分别是进行单值存储的Collection集合和进行键值对存储的Map集合,这两集合都在Java的封装的工具包:java.util 中,因此在使用对应的集合类时需要进行导包操作。
2、集合的结构图
以下是Java中集合的结构图:
由上图可以知晓集合类有三个顶级的父接口:Collection接口、Map接口和Iterator接口,Collection接口是所有Collection集合的顶级父接口,Map接口是所有Map集合的顶级父接口,而Iterator接口很特殊,它不是的功能不是用来存储数据的,而是用来遍历集合中的数据。
3、集合的分类
在上面介绍了集合按存储的结构可以分为Collection集合和Map集合,下面就来介绍关于这两种集合的相关知识。
3.1、Collection集合
Collection集合在存储数据时,进行的是单个数据的存储,也就是说只要是一个Java中的对象就能存进该类集合中去。在Collecttion集合中,作为顶级父接口的Collection接口在开发中是不会直接使用的,会进行操作的是该接口中的两个子接口,分别为:List接口和Set接口。
3.1.1、List接口
List接口是进行单值存储的集合的一个重要分支,实现该接口的集合类可以存储相同的数据,存储的数据是以一种线性方式进行存储,类似于数组的结构,每个数据都会存在一个下标,通过该下标便可以访问对应的元素(数据),正是因为数据时线性存储的在遍历时,输出数据的顺序和存入数据的顺序是一样的。
List集合常用的方法有以下几个:
-
public void add(int index,E e)——将制定的元素存储到指定的下标处。
-
public E get(int index)——返回指定下标的元素
-
public E remove(int index)——删除指定下标处的元素,返回被删除的元素
-
public E set(int index,E e)——将指定下标处的元素替换成新的元素,返回的是被替换的旧元素
因为List接口是无法使用 new 字段创建一个List集合对象的,因此需要创建List集合需要使用到List接口的两个实现类,分别是:ArrayList类和LinkedList类。
这两个集合类在我之前的两篇博文中有详细介绍,感兴趣的小伙伴可以点击下方链接了解详情,在这我就不做详细的介绍了,就简单的介绍一下。
ArrayList集合的底层实现结构与数组相类似,但ArrayList的长度可以实现动态扩容,该集合的特点是方便数据的查询和遍历,缺点是对数据的增删处理效率低;而LinkedList集合的底层实现结构是基于双向链表实现,该集合的特点是方便数据的增删,缺点是对数据的查询和遍历处理效率低。
3.1.2、Set接口
Set接口与List接口在数据存储机制上有所不同,List接口中是可以存储相同数据,但在Set接口中元素是不可以重复的,也就是说不可以存储相同的元素,List集合中的数据时线性存储的,而在Set集合中,数据的存储是无序的。这就是实现Set接口的集合与List集合不一样的地方。
当然Set接口和List接口一样,无法使用 new 字段创建集合对象,需要使用到它的一个常用的子类:HashSet类和一个不常用的子类:TreeSet类。HashSet类我之前的博文也有详细的介绍,在这就不做详细的介绍了,感兴趣的小伙伴可以点击下方链接进行了解,在这就简单的介绍一下:
HashSet集合类的底层实现结构是基于哈希表的实现,通过哈希值的计算得出存储的位置,而该集合不可以存储相同数据的机制是依赖于HashMap集合的结构。该集合的特点是:具有良好的数据存取和查找的性能。
TreeSet集合类中的数据比HashSet集合中的数据的约束更严格,在TreeSet中数据的存储的按照大小进行排序,因此在数据存储后会进行大小比较,排序规则是依靠了一个接口Comparable接口,在上面的结构图中也有体现(在图的右下角)。
在Comparable接口中可以自己定义数据比较后存储顺序的规则:返回-1表示新数据比较小,放在旧数据前面,返回1表示新数据比较大,放在旧数据后面,返回0表示比较的两个数据相同,那么新数据不进行存储。
因此存储的数据需要实现Comparable接口,而在Java中八种基本类型是是实现了Comparable接口的,但如果存储的数据的类型是自定义的类型,那么该类性需要实现Comparable接口,如下方代码所示:
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person() {
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
//该方法便是实现了Comparable接口后需要重写的关于排序规则的方法
@Override
public int compareTo(Person person) {
if(this.age>person.age){
return 1;
}else if(this.age<person.age){
return -1;
}else {
if(this.getName().equals(person.getName())){
return 0;
}
return 1;
}
}
}
该集合有几个常用的方法:
- boolean add(E e)——添加指定的元素,成功返回true,失败返回false
- Boolean remove(Object o)——删除你指定的元素,元素在集合中存在则删除成功,返回true,元素在集合中不存在则删除失败,返回false
- Boolean contains(Object o)——查找列表中是否含有指定元素,含有返回true,不含有返回false
- int size()——获取集合中的元素总数
- Boolean isEmpty()——判断集合是否为空,为空返回true。不为空返回false
- Iterator< E > iterator()——返回该集合的迭代器,该迭代器可以用来进行集合的遍历,遍历方式和上面的HashSet介绍博文中介绍的是一样的
关于Collection集合的相关知识就介绍到这,下面来介绍Map集合。
3.2、Map集合
Map集合在进行数据存储时,是进行键值对的方式存储,简单的说就是:在你进行元素存储时,需要给这个元素加一个标识,该标识就是键值对中的键(Key),而你要进行存储的元素就是键值对中的值(Value)。在Map集合中,作为顶级父接口的Map接口在开发中也是不会直接使用的,会进行操作的是该接口中的三个子类,分别为:HashMap类、Hashtable类和TreeMap类
3.2.1、HashMap类
该集合类在我之前的博文中有详细的介绍,在这里我就不做详细介绍了,感兴趣的小伙伴可以点击下方链接进行了解,在这就简单的介绍一下:
该集合的底层实现结构也是基于哈希表的实现,和HashSet集合类不同的是HashMap集合类存储的是键值对,该集合中不允许出现重复的键(Key),如果出现重复的键(Key),那么该重复键所对应的新的值(Value)将覆盖旧的值。反应快的朋友是不是就想到了上面在HashSet中提到了不存储重复值的机制是依赖于HashMap集合来实现的,没错正是依赖于HashMap集合中键不可以重复的机制。
3.2.2、Hashtable类
该集合类是Java在早期时对Map接口的实现类,之后被性能更高的HashMap所取代,因此该集合类和上述的HashMap集合操作基本类似,基本类似也就是说还是有不同之处的,二者的不同之处在于以下两点:
(1)Hashtable集合中进行的是同步处理,性能较低,而HashMap集合进行的是异步处理,性能较高,
(2)Hashtable集合中的存储的键值对中的值(Value)不可以为null,而HashMap集合中存储的键值对中的键(Value)可以为null。
以上就是二者的不同之处的介绍。
3.3.3、TreeMap类
该集合类与上述的TreeSet集合类相似,数据也是按照大小进行顺序存储,因此存储的数据也需要实现Comparable接口,具体是操作依照TreeSet集合类的演示。
该集合类有几个常用的方法:
- V put(K key,V value)——存储指定键值对,返回存储的值(Value)
- boolean containKey(Object key)——判断集合中是否含有指定的键(Key),存在返回true,不存在返回false
- boolean containValue(Object value)——判断集合中是否含有指定的值(Value)存在返回true,不存在返回false
- V get(Object key)——获得指定键(key)所对应的值(value),不存在键(Key)则返回null
- Set< K > keySet()——返回集合中所有键(Key)的Set列表
- v remove(Object key)——删除指定键(Key)对相应的值(Value)删除成功返回被删除的值,键(Key)不存在则返回null
- int size()—获得集合中元素的个数
- Collection< V > values()——返回集合中所有值(Value)的Collection列表
以上就是对Map集合的所有介绍,由此关于Java中的集合类的详解就已经介绍完毕了。希望文章可以帮到你们,感谢大家阅读,如果觉得文章写得不错就关注我吧,我会不定期更新关于Java的相关知识的博文。
相关博文链接:
“Java中的集合类:HashMap”
“Java中的集合类:HashSet”
“Java中的集合类:LinkedList”
“Java中的集合类:ArrayList”