Java 集合
1、为什么需要集合
-
java是面向对象的语言,为了方便操作多个对象,我们需要把对象存储起来。
-
既然要存储多个对象,那么就需要一个容器
-
java为我们提供了集合
2、数组和集合的区别
-
长度的区别
- 数组长度固定
- 集合长度可变
-
元素的数据类型
- 数组只能够存储的基本数据类型,也可以存储引用类型(String)
- 集合只能存储引用类型(假设你存储的是int,java是会动装箱成integer)
集合的大致结构:
3 List集合
List集合主要有三个子类
- ArrayList (底层是数组)
- LinkList (底层是链表)
- Vector (底层是数组)
3.1 ArrayList集合
查看ArrayList的层次结构图:
右键类
ArrayList底层其实就是⼀个数组,ArrayList中有扩容这么⼀个概念,正因为它扩容,所以它能够实现“动态”增⻓
常用方法:
ArrayList 常用方法列表如下:
(点击对应的方法到相应网站查看详解。)
方法 | 描述 |
---|---|
add() | 将元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 删除 arraylist 中的所有元素 |
clone() | 复制一份 arraylist |
contains() | 判断元素是否在 arraylist |
get() | 通过索引值获取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
remove() | 删除 arraylist 里的单个元素 |
size() | 返回 arraylist 里元素数量 |
isEmpty() | 判断 arraylist 是否为空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替换 arraylist 中指定索引的元素 |
sort() | 对 arraylist 元素进行排序 |
toArray() | 将 arraylist 转换为数组 |
toString() | 将 arraylist 转换为字符串 |
ensureCapacity() | 设置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
removeIf() | 删除所有满足特定条件的 arraylist 元素 |
forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
public class ArrayList01 {
/**
* ArrayList的常用方法
*/
public static void main(String[] args) {
//add方法 add(E element) 默认再末尾进行加入
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
System.out.println(arrayList.get(0));
System.out.println(arrayList.get(1));
//List的遍历,forEach方法
System.out.println("add--------");
for (Integer element : arrayList) {
System.out.println(element);
}
//List的遍历,常规方法
System.out.println("------------");
int size = arrayList.size(); //获取集合的长度
for (int i = 0; i < size; i++) {
System.out.println(arrayList.get(i));
}
//使用迭代器:
//add(int index,E element) 在下标中插入
//arrayList.add(1,3);
System.out.println("------------");
Iterator iter = arrayList.iterator();
while(iter.hasNext()) {
int element = (Integer) iter.next();
System.out.println(element );
}
//set方法 set(int index,E element) 替换下标为index的元素,新的元素为element
//arrayList.set(1,2);
System.out.println("Set--------");
for (Integer element : arrayList) {
System.out.println(element);
}
//remove方法 remove(int index) 删除下标为index的元素
//arrayList.remove(1);
System.out.println("remove------");
arrayList.forEach(integer -> {
System.out.println(integer);
});
}
}
由于ArrayList是List的子类,所以定义的时候也是可以这样定义的:
List<?> list = new ArrayList<>();
3.2 LinkedList集合
- Java的LinkedList是一种常用的数据容器,与ArrayList相比,LinkedList的增删操作效率更高,而查改操作效率较低。
- LinkedList 实现了Queue接口,能当作队列使用。
- LinkedList 实现了List 接口,能对它进行列表操作。
- LinkedList 实现了Deque 接口,即能将LinkedList当作双端队列使用。
- LinkedList 实现了Cloneable接口,能克隆。
- LinkedList 实现了java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
1.增
public boolean add(E e),链表末尾添加元素,返回是否成功;
public void add(int index, E element),向指定位置插入元素;
public boolean addAll(Collection<? extends E> c),将一个集合的所有元素添加到链表后面,返回是否成功;
public boolean addAll(int index, Collection<? extends E> c),将一个集合的所有元素添加到链表的指定位置后面,返回是否成功;
public void addFirst(E e),添加到第一个元素;
public void addLast(E e),添加到最后一个元素;
public boolean offer(E e),向链表末尾添加元素,返回是否成功;
public boolean offerFirst(E e),头部插入元素,返回是否成功;
public boolean offerLast(E e),尾部插入元素,返回是否成功;
2.删
public void clear(),清空链表;
public E removeFirst(),删除并返回第一个元素;
public E removeLast(),删除并返回最后一个元素;
public boolean remove(Object o),删除某一元素,返回是否成功;
public E remove(int index),删除指定位置的元素;
public E poll(),删除并返回第一个元素;
public E remove(),删除并返回第一个元素;
3.查
public boolean contains(Object o),判断是否含有某一元素;
public E get(int index),返回指定位置的元素;
public E getFirst(), 返回第一个元素;
public E getLast(),返回最后一个元素;
public int indexOf(Object o),查找指定元素从前往后第一次出现的索引;
public int lastIndexOf(Object o),查找指定元素最后一次出现的索引;
public E peek(),返回第一个元素;
public E element(),返回第一个元素;
public E peekFirst(),返回头部元素;
public E peekLast(),返回尾部元素;
4.改
public E set(int index, E element),设置指定位置的元素;
4、Set集合
Set
是一个不能包含重复元素的Collection
。它模拟了数学集合抽象。
Set
接口仅包含从Collection
接口继承的方法,并添加禁止重复元素的限制。
Set
还为equals
和hashCode
操作的行为添加了一个更强的规范,允许Set
实例有意义地进行比较,即使它们的实现类型不同。
Set在HashSet
,TreeSet
,LinkedHashSet
等各种类中都有实现。
Set
声明的方法如下表中所示 -
编号 | 方法 | 描述 |
---|---|---|
1 | add() | 添加一个对象到集合中。 |
2 | clear() | 从集合中删除所有对象。 |
3 | contains() | 如果指定的对象是集合中的元素,则返回true 。 |
4 | isEmpty() | 如果集合没有元素,则返回true 。 |
5 | iterator() | 返回集合的Iterator 对象,该对象可用于检索对象。 |
6 | remove() | 从集合中删除指定对象。 |
7 | size() | 返回集合中的元素数。 |
8 | first() /last() | 返回集合第一个元素/返回集合最后一个元素。这是在TreeSet中的方法 |
4.2 hashSet
HashSet的要点:
- 实现Set接⼝
- 不保证迭代顺序
- 允许元素为null
- 底层实际上是⼀个HashMap实例
- ⾮同步
- 初始容量⾮常影响迭代性能
4.3 LinkedHashSet
解决了hasSet的无序
5、 Map集合
Alt+7查看当前类的所有方法属性
注意Map同样和set是一个接口
Map接口的常用方法
V和Set代表返回的数据类型
方法名称 | 说明 |
---|---|
V get(Object key) | 返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型 |
V put(K key, V value) | 向 Map 集合中添加键-值对,返回 key 以前对应的 value,如果没有, 则返回 null |
V remove(Object key) | 从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果没有,则返回null |
Set entrySet() | 返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry |
Set keySet() | 返回 Map 集合中所有键对象的 Set 集合 |
可见Map的子类有这些
hashMap
和LinkedHashMap
-
HashMap:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,==需要重写键的hashCode()方法、equals()方法。 ==
-
LinkedHashMap:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。