博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaSE——Collection集合
阅读量:3977 次
发布时间:2019-05-24

本文共 6904 字,大约阅读时间需要 23 分钟。

文章目录


前言

集合作为java中提供的一种容器,可以用来存储多个数据,要明确它与数组之间的区别:

1.数组的长度是固定的。集合的长度是可变的。
2.数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。


一、类集框架主要接口

在整个java类集中最常使用的类集接口是:Collection、List、Set、Map、Iterator、ListIterator、Enumeration、SortedSet、SortedMap、Queue、Map.Entry。这些接口之间存在继承关系,其继承关系如下图:

在这里插入图片描述


二、Collection接口

2.1 Collection接口定义

public interface Collection
extends Iterable

从接口的定义可以看出,此接口使用了泛型的定义,在操作时必须指定具备的操作类型。这样可以保证类集操作的安全性,避免发生ClassCastException异常。

Collection属于单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.Listjava.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayListjava.util.LinkedListSet接口的主要实现类有java.util.HashSetjava.util.TreeSet

2.2 Collection接口常用功能

Collection是所有单列集合(这里的单列集合这样去理解,它不像双列集合Map那样是通过键值对的方式去存储的,网上找了些资料并没有总结的很好的关于单列集合中单列这个概念是什么样的,这只是集合的一种划分类别的方式,不用深究)的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:

  • 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(): 把集合中的元素,存储到数组中。
    代码演示如下:
import java.util.ArrayList;import java.util.Collection;public class Demo1Collection {
public static void main(String[] args) {
// 创建集合对象,使用多态形式 Collection
coll = new ArrayList
(); // 使用方法 // 添加功能 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()); }}

三、Collection子接口定义

这里介绍两个常用的Collection子接口List和Set。

3.1 List接口

java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。

其接口定义如下:

public interface List
extends Collection

3.1.1 List接口特点

  1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
  2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
  3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

3.1.2 List接口常用方法

List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操

作集合的特有方法,如下:
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
list = new ArrayList
(); // 往 尾部添加 指定元素 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

3.1.3 List接口的子类

常用的List子类包括ArrayList和LinkedList。

ArrayList

java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。
可以直接通过对象的多态性为List接口实例化,此类的定义如下:

public class ArrayList
extends AbstractList
implements List
,RandomAccess, Cloneable,Serialezable//从定义可以看出ArrayLisst类继承了AbstractList类。AbstractList类的定义:public abstract class AbstractList
extends AbstractCollection
implements List

LinkedList

java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
在这里插入图片描述
LikedList常用方法:
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
link = new LinkedList
(); //添加元素 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); }}

3.2 Set接口

java.util.Set 接口和java.util.List接口一样,同样继承自 Collection 接口,它与 Collection 接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比Collection 接口更加严格了。与 List接口不同的是, Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set 集合有多个子类,这里我们介绍其中的 java.util.HashSetjava.util.LinkedHashSet 这两个集合。

3.2.1 散列存放HashSet

HashSet集合 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性(不允许重复元素)的方式依赖于: hashCode 与 equals 方法。

通过代码来看一下,集合不能存储相同代码:

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

3.2.2 LinkedHashSet

HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?

在HashSet下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。

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

总结

关于Collection集合部分就介绍这么多啦,希望可以帮助到学习到这里的小伙伴,概念理解不清可以运行一下代码,都是可以运行的。有关的一些知识点后面会补充的,关于HashSet的数据结构存储方式——哈希表,后面会写一篇博客详细解释一下的。

转载地址:http://jogki.baihongyu.com/

你可能感兴趣的文章
linux kernel之platform driver&device
查看>>
linux 内核网卡驱动 ast2500 board
查看>>
linux中断处理与NAPI机制
查看>>
linux kernel编译makefile简要介绍(arm)
查看>>
pci总线扫描及pci网卡驱动
查看>>
x86下usb驱动framework
查看>>
linux kernel同步之原子操作
查看>>
内存barrier
查看>>
hamming weight algorithm(汉明算法)以及kernel的实现
查看>>
linux X86下的段地址_段内偏移_虚拟地址_线性地址_物理地址
查看>>
linux ARM多处理器的启动过程
查看>>
linux CFS调度和load balance
查看>>
oprofile的使用
查看>>
linux下的ip tunnel workflow
查看>>
linux下strongswan workflow
查看>>
k8s下POD之间的通信过程
查看>>
ARM下的自旋锁spinlock
查看>>
ARM下的读写锁rwlock实现
查看>>
BPF filter
查看>>
linux下non-preempt的RCU实现分析(基于rcu-tree)
查看>>