Java集合概述

时间:2023-01-05 15:59:52

容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用。要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系

String str = new String("song");
  1. 右边的“new ”,是创建一个String类对象

  2. ()指在对象创建后,调用构造函数,初始化对象。

  3. 左边的“String str”创建了一个String类引用变量str。

  4. “=”使对象引用指向刚创建的String对象

集合是保存其他对象的对象,集合是一种存储机制,可以添加,删除元素以及访问,更新元素的值

Collection

Java集合中的Collection接口是集合框架最基础的接口,Collection接口描述了集合中的主要操作,集合类型不直接实现Collection接口,Collection的直接“子接口”有Set,List,Queue等接口。

下图是Java容器中接口或类之间的继承和实现关系

Java集合概述

继承至该接口的方法有

方法名 说明
boolean add(E e) 确保此 collection 包含指定的元素(可选操作)。
boolean addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。
void clear() 移除此 collection 中的所有元素(可选操作)。
boolean contains(Object o) 如果此 collection 包含指定的元素,则返回 true。
boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。
boolean equals(Object o) 比较此 collection 与指定对象是否相等。
int hashCode() 返回此 collection 的哈希码值。
boolean isEmpty() 如果此 collection 不包含元素,则返回 true。
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。
boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。
boolean retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。
int size() 返回此 collection 中的元素数。
Object[] toArray() 返回包含此 collection 中所有元素的数组。
<T> T[] toArray(T[] a) 返回包含此 collection中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

Set

Set集合不允许重复值,集操作包括并集、交集和差集操作。

  • Set:无序、不包含重复元素
    • HashSet(散列函数):外部无序地遍历成员
      • LinkedHashSet:外部按成员的插入顺序遍历成员
    • TreeSet(红黑树):外部有序地遍历成员,并实现了SortedSet,支持子集等要求顺序的操作

List

List集合类型是描述按位置顺序存储元素的对象,同时它还包括基于索引的操作。

  • List:元素有序、可重复、有对应的顺序索引
    • LinkedList:可以在任何位置进行插入和移除操作的有序序列
    • ArrayList(主要实现类,不同步):可以动态增长和缩减的索引序列
    • (Vector(古老的实现类,同步))

ArrayList集合是一种在内存连续区域中存储元素的通用数组,底层的存储结构是一个允许直接访问元素的数组。(ArrayList取代Vector。Vector是同步的,而ArrayList不是同步的)

  1. ArrayList集合是一种能够直接访问的集合
  2. ArrayList集合是能够在尾部插入和删除元素的通用数组

LinkedList是一个序列,该序列的值有一个值以及标识序列中相邻元素的链接

  1. LinkedList集合的访问必须从列表头开始,按照链接前进到达所要求的值,是一种顺序访问的结构
  2. 在LinkedList中插入或删除元素涉及链中的链接,这些都是O(1)操作

(ListIterator子接口包含add方法,可以从前后两个方向遍历链表中的元素,并可以添加删除元素previous()和hasPrevious方法)

Queue

Queue是典型的先进先出容器

队列(queue)是一种只允许在头部和尾部进行访问的集合,从尾部进入,从头部退出(FIFO)

(由于LinkedList即实现了List接口又实现了Queue接口。所以该类支持队列的行为)

PriorityQueue

优先队列(priority queue)中,元素以任何顺序进入优先队列结构,但是必须按照一定规则的优先顺序被删除。

Map

Map是一种存储键值对的集合,键值可以是任意的对象类型,键唯一标识了元素,而值字段通常具有相关联的信息,访问某个元素只要求键参数,并返回值组件。

  • Map:将对象映射到其他对象所形成的键值对容器,允许使用键来查找值
    • HashMap:能满足用户对Map的通用需求
      • LinkedHashMap:可以记住键值项被添加顺序的Map集合
    • SortedMap

      -TreeMap:键有序的Map集合,并实现了SortedMap,支持子Map等要求顺序的操作

      -EnumMap :键属于枚举类型的Map集合

迭代器

Iterator接口具有下面三个方法


public interface Iterator<E>{ E next();
Boolean hasNext();
void remove(); }

迭代器的工作是通过反复调用next方法遍历序列中的元素,其用法主要有一下几个步骤:

Collection<String> c = ArrayList()<String>;

Iterator<String> it = c.iterator();
while(it.hasNext()){
String element = it.next();
System.out.println(element);
it.remove();
  1. 使用方法iterator()要求容器返回一个Iterator。
  2. 使用next()获取序列的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()删除元素。

(ListIterators是实现双向遍历,并且可以修改单元的列表)

从JavaSE5.0起引入Foreach语句,对于标准类中的任何集合都可以使用Foreach语句

for(String element c){
System.out.println(c);
}

也可应用于Collection对象,语法规则是

Foreach与Iterator

对于上述两者有一个示例:


import java.util.*;
public class IteratorTest { public static void main(String[] args){
List<Integer> c =new ArrayList<Integer>(); for(int i=0;i<10;i++)
c.add(i);//自动装箱 Integer[] moreInts = {10,11,12,13};
c.addAll(Arrays.asList(moreInts)); for(Integer i : c)
System.out.print(i+ ",");
System.out.println(); Iterator it = c.iterator();
while(it.hasNext()){
it.next();
it.remove();
}
System.out.print(c); }
}

对象的比较

Comparable和 Comparator

Comparable接口定义了一个方法

public interface Comparable<T>
{
int conpareTo(T other);
}

使用COmparable接口序列排序有局限性,如果一个集合中的元素需要按照要求A排序,而另一集合却要按照要求B排序

Comparator接口定义了带有两个显示参数的compare方法

public interface Comparator
{
int compare(T a ,T b)
]

Comparable和 Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序

Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。,该对象列表或数组可以通过Collections.sort(或Arrays.sort)进行排序。Comparable接口只提供了int compareTo(T o)方法

Comparator 是比较器接口。让对象(数组)实现比较的功能,可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。Comparator 接口提供额int compare(T o1,T o2)和 boolean equal(Object obj)方法

集合与数组的转换

数组转换成集合

Arrays.asList的包装器可以实现

String values[] =

HashSet staff = new HashSet<Arrays.asList(values)>;

集合转换成数组

可以使用toArray方法

Object[] values =staff.toArray;

返回的是对象数组

HashMap原理

其他记录

List phones = new ArrayList<>();

使用接口的目的是在于修改实现时,只需要在创建处去修改它

List phones = new LinkedList<>();