【校招VIP】Java - Collection 接口及主要实现类

08月04日 收藏 0 评论 1 java开发

【校招VIP】Java - Collection 接口及主要实现类

转载声明:文章链接:https://blog.csdn.net/xing123456jl/article/details/108044431

一、Collection
1. 基本介绍
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.List 与 java.util.Set。其中:
List 的特点是有索引、存取有序、可重复。
Set 的特点是无索引、存取无序(LinkedHashSet除外)、不可重复。
而两个子接口又分别有各自对应的实现类。其中,List 接口的主要实现类包括 java.util.ArrayList 和 java.util.LinkedList;Set 接口的主要实现类有 java.util.HashSet、java.util.LinkedHashSet 和 java.util.TreeSet。可以通过一张图来描述 Collection 接口的继承实现体系。

2. 常用方法
public boolean add(E e):把给定的对象添加到当前集合中 。
public void clear():清空集合中所有的元素。
public boolean remove(E e):把给定的对象在当前集合中删除。
public boolean contains(E e):判断当前集合中是否包含给定的对象。
public boolean isEmpty():判断当前集合是否为空。
public int size():返回集合中元素的个数。
public Object[] toArray():把集合中的元素,存储到数组中。

public class DemoCollection {
public static void main(String[] args) {
// 创建集合对象
Collection<String> coll = new ArrayList<String>(); // 使用多态形式
// 使用方法
// 添加功能 boolean add(String s)
coll.add("小李广");
coll.add("扫地僧");
coll.add("石破天");
System.out.println(coll);
// boolean contains(E e) 判断o是否在集合中存在
System.out.println("判断 扫地僧 是否在集合中"+coll.contains("扫地僧"));
//boolean remove(E e) 删除在集合中的o元素
System.out.println("删除石破天:"+coll.remove("石破天"));
System.out.println("操作之后集合中元素:"+coll);

// size() 集合中有几个元素
System.out.println("集合中有"+coll.size()+"个元素");
// Object[] toArray()转换成一个Object数组
Object[] objects = coll.toArray();
// 遍历数组
for (int i = 0; i < objects.length; i++) {
System.out.println(objects[i]);
}
// void clear() 清空集合
coll.clear();
System.out.println("集合中内容为:"+coll);
// boolean isEmpty() 判断是否为空
System.out.println(coll.isEmpty());
}
}

二、List
1. 基本介绍
java.util.List 接口继承自 Collection 接口,习惯性地会将实现了 List 接口的对象称为 List 集合。这类集合具有以下特点:
List集合中的元素是以线性方式进行存储的,基于不同的实现类有不同的表现形式(数组/链表)
List集合中的元素是带索引的,可以通过索引来访问集合中的指定元素
List集合中的元素是有序的,即元素的存入顺序和取出顺序一致。
List 集合中的元素是可重复的,允许出现重复的元素,可以通过元素的 equals() 方法比较两个元素是否重复
2. List 的特有方法
List集合特有方法均与索引相关:
public void add(int index, E element):将指定的元素,添加到该集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index):移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

public class ListDemo {
public static void main(String[] args) {
// 创建List集合对象
List<String> list = new ArrayList<String>();

// 往 尾部添加 指定元素
list.add("图图");
list.add("小美");
list.add("不高兴");

System.out.println(list);
// add(int index,String s) 往指定位置添加
list.add(1,"没头脑");

System.out.println(list);
// String remove(int index) 删除指定位置元素 返回被删除元素
// 删除索引位置为2的元素
System.out.println("删除索引位置为2的元素");
System.out.println(list.remove(2));

System.out.println(list);

// String set(int index,String s)
// 在指定位置 进行 元素替代(改)
// 修改指定位置元素
list.set(0, "三毛");
System.out.println(list);

// String get(int index) 获取指定位置元素

// 跟size() 方法一起用 来 遍历的
for(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//还可以使用增强for
for (String string : list) {
System.out.println(string);
}
}
}

3. List 接口的实现类
java.util.ArrayList 底层采用数组实现,查询快,增删慢

java.util.LinkedList 底层采用双向链表实现,查询慢,增删快

其中,由于 LinkedList 自身的结构特性,JDK提供了大量有关首尾操作的方法:
public void addFirst(E e):将指定元素插入此列表的开头。
public void addLast(E e):将指定元素添加到此列表的结尾。
public E getFirst():返回此列表的第一个元素。
public E getLast():返回此列表的最后一个元素。
public E removeFirst():移除并返回此列表的第一个元素。
public E removeLast():移除并返回此列表的最后一个元素。
public E pop():从此列表所表示的堆栈处弹出一个元素。
public void push(E e):将元素推入此列表所表示的堆栈。
public boolean isEmpty():如果列表不包含元素,则返回true。

public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
System.out.println(link);
// 获取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while (!link.isEmpty()) { //判断集合是否为空
System.out.println(link.pop()); //弹出集合中的栈顶元素
}
System.out.println(link);
}
}

三、Set 接口
1. 基本介绍
java.util.Set 接口同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,但是比 Collection 接口更加严格。Set 接口的实现类对象具有以下特点:
Set 接口实现类中的元素是无索引的,无法通过索引来访问集合中的指定元素
除 LinkedHashSet 以外,Set 接口实现类中的元素是无序的,元素的存入顺序和取出顺序不能保证一致
Set 接口实现类中的元素是不可重复的,不允许出现重复的元素,在添加元素的过程中,Set类对象会通过某些规则保证存入的元素不出现重复
2. Set 接口的实现类
java.util.HashSet 底层采用散列表实现,无索引、不可以存储重复元素、存取无序。当出现哈希冲突时,相同哈希值的元素采用链表结构存储,当同一哈希值的冲突元素超过 8 个时,改为红黑树存储。

public class HashSetDemo {
public static void main(String[] args) {
//创建 Set集合
HashSet<String> set = new HashSet<String>();
//添加元素
set.add(new String("cba"));
set.add("abc");
set.add("bac");
set.add("cba");
//遍历
for (String name : set) {
System.out.println(name);
}
}
}

java.util.LinkedHashSet 底层采用散列表实现,同样使用链表+红黑树的搭配解决哈希冲突的问题。且无索引、不可以存储重复元素、存取有序。数据结构与存储机制与 HashSet 一致,但是多了一个维护数据存储顺序的链表。

public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}

运行结果:

bbb
aaa
abc
bbc

注意:Set接口实现类中的元素能够保证唯一性,实际上是根据对象的 hashCode() 和 equals() 方法来决定的。如果向 Set 类集合中存放自定义的对象,保证其唯一性的方式是复写 hashCode() 和 equals() 方法建立属于当前对象的比较方式。

C 1条回复 评论
墨石

这问题真不好答

发表于 2023-08-27 22:00:00
0 0