本文共 6904 字,大约阅读时间需要 23 分钟。
集合作为java中提供的一种容器,可以用来存储多个数据,要明确它与数组之间的区别: 1.数组的长度是固定的。集合的长度是可变的。 2.数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。
在整个java类集中最常使用的类集接口是:Collection、List、Set、Map、Iterator、ListIterator、Enumeration、SortedSet、SortedMap、Queue、Map.Entry。这些接口之间存在继承关系,其继承关系如下图:
public interface Collectionextends Iterable
从接口的定义可以看出,此接口使用了泛型的定义,在操作时必须指定具备的操作类型。这样可以保证类集操作的安全性,避免发生ClassCastException异常。
Collection属于单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List
和java.util.Set
。其中,List
的特点是元素有序、元素可重复。Set
的特点是元素无序,而且不可重复。List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set
接口的主要实现类有java.util.HashSet
和java.util.TreeSet
。
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) { // 创建集合对象,使用多态形式 Collectioncoll = 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子接口List和Set。
java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
其接口定义如下:
public interface Listextends Collection
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集合对象 Listlist = 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
常用的List子类包括ArrayList和LinkedList。
ArrayList
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。 可以直接通过对象的多态性为List接口实例化,此类的定义如下: public class ArrayListextends 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) { LinkedListlink = 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); }}
java.util.Set
接口和java.util.List
接口一样,同样继承自 Collection
接口,它与 Collection
接口中的方法基本一致,并没有对 Collection
接口进行功能上的扩充,只是比Collection
接口更加严格了。与 List
接口不同的是, Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。Set 集合有多个子类,这里我们介绍其中的 java.util.HashSet
、 java.util.LinkedHashSet
这两个集合。
HashSet集合 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性(不允许重复元素)的方式依赖于: hashCode 与 equals 方法。
通过代码来看一下,集合不能存储相同代码:public class HashSetDemo { public static void main(String[] args) { //创建 Set集合 HashSetset = new HashSet (); //添加元素 set.add(new String("cba")); set.add("abc"); set.add("bac"); set.add("cba"); //遍历 for (String name : set) { System.out.println(name); } }}
HashSet
保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。 public class LinkedHashSetDemo { public static void main(String[] args) { Setset = 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/