文章目录
- 一、集合概述
- 二、Iterable
- 三、Collection
- 四、List接口及其子类
- 1.ArrayList类
- 2.Vector类
- 3.LinkedList类
- 五、Set接口及其子类
- 1.HashSet类
- 1.1LinkedHashSet类
- 2.TreeSet类
- 六、Java中单列集合的粗略关系图
一、集合概述
- 为什么出现集合
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。 - 集合的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。 - 集合的分类
java中集合分为单列集合和键值对集合。在两个顶级接口下又衍生出多中不同实现、不同数据结构的集合类。
二、Iterable
Iterable为单列集合封装了一系列迭代方法,为集合的遍历提供了底层依赖。下面列出方法列表
方法 | 作用 |
Iterator iterator(); | 返回迭代器对象 |
default void forEach(Consumer<? super T> action) | 遍历collection类的集合(1.8新增) |
default Spliterator spliterator() | 返回并行迭代器对象(1.8新增) |
三、Collection
单列集合的根接口。继承Iterable接口。方法列表
方法 | 作用 |
int size(); | 返回集合中元素的个数 |
boolean isEmpty(); | 判断集合是否为空 |
boolean contains(Object o); | 判断集合是否包含某个元素 |
Iterator iterator(); | 返回迭代器对象 |
T[] toArray(T[] a); | 将集合转为对象数组 |
boolean add(E e); | 添加元素(成功返回true) |
boolean remove(Object o); | 移除元素(成功返回true) |
boolean containsAll(Collection<?> c); | 是否包含给定集合中的所有元素 |
boolean addAll(Collection<? extends E> c); | 将给定集合中的元素添加到本集合 |
boolean removeAll(Collection<?> c); | 将给定集合从本集合中移除 |
boolean retainAll(Collection<?> c); | 本集合对给定集合做交集运算,结果保存在本集合(发生改变返回true) |
void clear() | 清空集合中的元素 |
default boolean removeIf(Predicate<? super E> filter) | 移除集合中符合条件的元素(1.8新增) |
default Stream stream() | 返回stream串行流(1.8新增) |
default Stream parallelStream() | 返回stream并行流(1.8新增) |
部分方法演示:
@Test
public void test1() {
Collection<String> collection1 = new ArrayList<>();
//添加元素
collection1.add("Hello ");
collection1.add("Collection!");
//集合长度
int size = collection1.size();
System.out.println("collection.size:"+size);
Collection<String> collection2 = new ArrayList<>();
collection2.add("I ");
collection2.add("Love ");
collection2.add("You!");
//contains方法
System.out.println("是否包含'Love '元素:"+collection2.contains("Love "));
//addAll方法
collection1.addAll(collection2);
//remove方法
collection1.remove("Love ");
System.out.println("移除'Love '后:"+collection1);
//removeIf方法,移除以感叹号结束的元素
collection1.removeIf(s -> s.endsWith("!"));
System.out.println("----遍历----");
//获取Stream流并遍历
collection1.stream().forEach(System.out::println);
}
运行结果:
collection.size:2
是否包含'Love '元素:true
移除'Love '后:[Hello , Collection!, I , You!]
----遍历----
Hello
I
四、List接口及其子类
List接口,继承Collection。有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
主要特点:元素有放入顺序,可重复。
特有方法列表:
方法 | 作用 |
boolean addAll(int index, Collection<? extends E> c) | 将给定集合插入到指定索引处 |
E get(int index) | 获取给定索引处的元素 |
E set(int index, E element) | 将元素设置到指定索引处 |
void add(int index, E element); | 将元素添加到指定索引处 |
E remove(int index); | 移除指定索引处的元素 |
int indexOf(Object o); | 返回给定元素在集合中的第一个索引值 |
int lastIndexOf(Object o); | 返回给定元素在集合中的最后一个索引值 |
ListIterator listIterator() | 返回ListIterator迭代器对象 |
ListIterator listIterator(int index); | 返回以index为迭代起始位置的迭代器对象 |
List subList(int fromIndex, int toIndex); | 截取从fromIndex(包含)到toIndex(不包含)的子集合 |
default void replaceAll(UnaryOperator operator) | 将集合中的每个元素按照给定规则替换(1.8新增) |
default void sort(Comparator<? super E> c) | 按照给定规则将元素排序(1.8新增) |
部分方法演示:
@Test
public void test2() {
//用Arrays工具类创建集合
List<Integer> list = new ArrayList<>();
list.add(0);
list.add(11);
list.add(222);
list.add(3333);
list.add(44444);
list.add(44444);
//在指定索引处添加元素;
list.add(3, 0);
//获取指定索引处的元素
System.out.println("3 索引处的元素:" + list.get(3));
System.out.println(list);
//移除指定索引处的元素
System.out.println("移除 4 索引处的元素:" + list.remove(5));
System.out.println(list);
//返回给定元素在集合中的最后一个索引值
System.out.println("0 在集合中的最后一个索引值"+list.lastIndexOf(0));
//replaceAll方法
list.replaceAll(i -> ++i);
System.out.println(list);
}
运行结果
3 索引处的元素:0
[0, 11, 222, 0, 3333, 44444, 44444]
移除 4 索引处的元素:44444
[0, 11, 222, 0, 3333, 44444]
0 在集合中的最后一个索引值3
[1, 12, 223, 1, 3334, 44445]
1.ArrayList类
主要特点:底层数据结构是数组; 查询快,增删慢 ; 线程不安全,效率高
特有方法列表:
方法 | 作用 |
public void trimToSize() | 将ArrayList容量修改为当前大小(节约内存) |
public void ensureCapacity(int minCapacity) | 预定ArrayList容量大小(当添加大量元素时效率高) |
2.Vector类
主要特点:底层数据结构是数组; 查询快,增删慢 ; 线程安全,效率低
特有方法列表:
方法 | 作用 |
public synchronized void copyInto(Object[] anArray) | 将元素复制到给定数组中 |
public synchronized void trimToSize() | 将Vector容量修改为当前大小(节约内存) |
public synchronized void ensureCapacity(int minCapacity) | 预定Vector容量大小(当添加大量元素时效率高) |
public synchronized void setSize(int newSize) | 设置Vector的长度(元素个数) |
public synchronized int capacity() | 返回Vector的当前容量大小 |
public synchronized int indexOf(Object o, int index) | 返回从index开始元素o(可为空)的第一个索引值 |
public synchronized int lastIndexOf(Object o, int index) | 返回从index开始元素o(可为空)的最后一个索引值 |
public synchronized E elementAt(int index) | 返回index索引处的元素 |
public synchronized E firstElement() | 返回 0 索引处的(第一个)元素 |
public synchronized E lastElement() | 返回最后一个元素 |
public synchronized void setElementAt(E obj, int index) | 在指定索引处设置给定元素 (集合长度不变) |
public synchronized void removeElementAt(int index) | 将指定索引处的元素移除 |
public synchronized void insertElementAt(E obj, int index) | 在指定索引处添加元素(集合长度+1) |
public synchronized void addElement(E obj) | 添加元素 |
public synchronized boolean removeElement(Object obj) | 移除元素 |
public synchronized void removeAllElements() | 移除所有元素(集合长度变为0) |
public Enumeration elements() | 返回Enumeration对象(常用于遍历) |
部分方法演示:
@Test
public void test3() {
Vector<String> vector = new Vector<>();
vector.add("王");
vector.add("富");
vector.add("贵");
vector.add("王富贵");
vector.add("王富贵");
//设置指定索引处的元素( 参数index<vector.size(),否则越界 )
vector.set(3,"富贵");
System.out.println(vector);
//在指定索引处添加元素( 参数index<=vector.size(),否则越界 )
vector.add(0,"哈哈");
System.out.println(vector);
System.out.println("第一个元素为:"+vector.firstElement());
System.out.println("最后一个元素为:"+vector.lastElement());
}
运行结果:
[王, 富, 贵, 富贵, 王富贵]
[哈哈, 王, 富, 贵, 富贵, 王富贵]
第一个元素为:哈哈
最后一个元素为:王富贵
3.LinkedList类
主要特点:底层数据结构是链表 ; 查询慢,增删快; 线程不安全,效率高;
特有方法列表:
方法 | 作用 |
public E getFirst() | 获取第一个元素 |
public E getLast() | 获取最后一个元素 |
public E removeFirst() | 移除第一个元素 |
public E removeLast() | 移除最后一个元素 |
部分方法演示:
@Test
public void test4() {
LinkedList<Character> list = new LinkedList<>();
list.add('A');
list.add('A');
list.add('B');
list.add('C');
System.out.println(list);
System.out.println("第一个元素:" + list.getFirst());
System.out.println("最后一个元素:" + list.getLast());
System.out.println("移除第一个元素:" + list.removeFirst());
System.out.println(list);
System.out.println("移除最后一个元素:" + list.removeLast());
System.out.println(list);
}
运行结果:
[A, A, B, C]
第一个元素:A
最后一个元素:C
移除第一个元素:A
[A, B, C]
移除最后一个元素:C
[A, B]
五、Set接口及其子类
Set接口,继承自Collection接口。该类集合特点元素不可重复,无放入顺序(注意:元素虽然无放入顺序,但是元素在 set 中的位置是有该元素的 HashCode 决定的,其位置其实是固定的)
主要特点:元素不可重复,无放入顺序
1.HashSet类
主要特点:底层数据结构是哈希表; 不保证 set 的迭代顺序; 线程不安全
代码演示:
@Test
public void test5() {
HashSet<String> set = new HashSet<>();
set.add("窝窝头");
set.add("一块钱");
set.add("四个");
set.add("嘿嘿");
//元素顺序与添加顺序不同,但其顺序由HashCode决定,又相对固定
for (int i = 0; i < 5; i++) {
System.out.println("打印:"+set);
}
//添加元素
set.add("哈哈");
//元素顺序发生改变,故其不保证迭代顺序
System.out.println("添加元素后:"+set);
System.out.println("添加重复元素:"+set.add("窝窝头"));
System.out.println(set);
}
运行结果
打印:[一块钱, 四个, 嘿嘿, 窝窝头]
打印:[一块钱, 四个, 嘿嘿, 窝窝头]
打印:[一块钱, 四个, 嘿嘿, 窝窝头]
打印:[一块钱, 四个, 嘿嘿, 窝窝头]
打印:[一块钱, 四个, 嘿嘿, 窝窝头]
添加元素后:[一块钱, 四个, 嘿嘿, 哈哈, 窝窝头]
添加重复元素:false
[一块钱, 四个, 嘿嘿, 哈哈, 窝窝头]
1.1LinkedHashSet类
LinkedHashSet实现Set接口,继承自HashSet。由链表保证了元素有序,由哈希表保证了元素唯一。
主要特点:元素有序、唯一 ;线程不安全;
代码演示:
@Test
public void test6() {
LinkedHashSet<Character> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add('B');
linkedHashSet.add('A');
linkedHashSet.add('N');
linkedHashSet.add('G');
linkedHashSet.add('S');
linkedHashSet.add('E');
linkedHashSet.add('R');
linkedHashSet.add('R');//重复元素
System.out.println(linkedHashSet);
}
运行结果
[B, A, N, G, S, E, R]
2.TreeSet类
TreeSet 使用元素的自然顺序对元素进行排序 或者根据创建 set 时提供的 Comparator 进行排序, 具体取决于使用的构造方法。
主要特点: 底层数据结构是红黑树,元素有序且唯一;线程不安全;
代码演示:
@Test
public void test7() {
//无参构造,自然排序规则
TreeSet<Integer> integers = new TreeSet<>();
integers.add(1);
integers.add(8);
integers.add(6);
integers.add(3);
integers.add(15);
System.out.println(integers);
//带参(比较器)构造
/*
TreeSet<String> strings = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return Integer.compare(s1.length(),s2.length());
}
});*/
//1.8后使用Lambda表达式
TreeSet<String> strings = new TreeSet<>(Comparator.comparingInt(String::length));
strings.add("天王盖地虎宝塔镇河妖");
strings.add("谁tm买小米啊");
strings.add("菠菜贱卖");
System.out.println(strings);
}
运行结果
[1, 3, 6, 8, 15]
[菠菜贱卖, 谁tm买小米啊, 天王盖地虎宝塔镇河妖]
六、Java中单列集合的粗略关系图