Java - Collection 接口及主要实现类
Collection 接口及主要实现类
一、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() 方法建立属于当前对象的比较方式。
- 关于java的collection框架我们最应该知道的两个接口和四个实现类
- 用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口?
- Java Set接口的主要实现类HashSet
- Java:Collection.List接口实现
- JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没
- Java Set接口的主要实现类HashSet
- Java - Map 接口及主要实现类
- Java中的数据结构(一):PCollection接口定义、PArrayList的实现
- JAVA类实现序列化的方法?如在COLLECTION框架中,实现比较要实现什么样的接口。
- 实现Java与C语言接口
- java 接口的实现
- 实现支付宝接口时url的构造,主要解决服务器不支持https的问题
- JAVA中implements实现多接口
- Java中常用数据结构的实现类 Collection和Map
- AOP的四种主要Java实现方式
- 用 Java 接口实现回调函数的等价功能
- 纯作业代码——Java实现接口、继承
- 关于Java使用接口实现多重继承
- WSDL2Java通过WSDL文件生成java服务接口并实现
- java中的多线程 内部类实现多线程 Runable接口的实现