集合: List和Set
集合
java.util.Conllection
作用是用来存储多个数据, 集合中把每个数据叫元素
和数组的比较:
- 类型: 数组只能存相同类型的数据. 集合可以是多种数据类型
- 长度: 数组一旦创建长度就不能改变, 集合长度改变
- 遍历: 数组常用下标遍历, 方式单一. 插入, 删除操作繁琐. 集合则更加方便
集合的继承结构:
Conllection
(接口)List
(接口)ArrayList
(实现类)LinkedList
(实现类)
Set
(接口)HashSet
(实现类)TreeSet
(实现类)
如图:
Collection接口常用方法 (子类通用)
返回值 | 方法 | 说明 |
---|---|---|
boolean | add(E e) | 添加元素(泛型) |
void | clear() | 清空集合, 移除集合所有元素 |
boolean | contains(Object o) | 判断是否包含指定元素, 存在返回true, 否则返回false |
int | hashCode() | 返回集合在内存中的哈希码 |
boolean | isEmpty() | 是否为空, 是为true, 否则为flase |
boolean | remove(Object o) | 移除指定元素, 移除成返回true, 否则返回false(如果有重复, 移除第一次出现的元素) |
int | size() | 返回集合的大小 |
Object[] | toArray() | 把集合转为数组 |
boolean | addAll(Collection c) | 把c集合中的所有元素都添加进来, 添加成功为true |
boolean | containsAll(Collection c) | 如果集合包含c, 则返回true |
boolean | removeAll(Collection c) | 删除c中包含的所有元素, 删除成功返回boolean (交集) |
boolean | retainAll(Collection c) | 只保留集合中 c 包含的元素, 其余元素全部删除 (差集) |
Iterator | iterator() | 返回一个迭代器, 用来迭代(遍历)数组(使用方法如下) |
注意: iterator() 迭代方法使用
Collection c = new ArrayList();
c.add("艾迪");
c.add("杰克");
c.add("迪迦");
c.add("泰罗");
Iterator<String> it = c.iterator();
while (it.hasNext()) {// hasNext() 用来判断集合中是否还有下一个元素, 有就返回true
String value = it.next(); // 获取元素'
System.out.println(value);
}
结果:
艾迪
杰克
迪迦
泰罗
List (接口)
特点: 有序, 可重复, 有索引
List常用特有方法
返回值 | 方法 | 说明 |
---|---|---|
void | add(int index, E e) | 在指定下标处插入 |
boolean | addAll(int index, Collection c) | 插入一个集合到指定下标 |
E | get(int index) | 使用下标获取元素 |
int | indexOf(Object o) | 返回第一次出现指定元素的索引值 |
int | lastIndexOf(Object o) | 返回最后一次出现指定元素的索引 |
E | remove(int index) | 移除指定索引的元素, 并返回元素的值 |
ListIterator |
listIterator() | 获取迭代对象, 实例看下面, 拥有(向前遍历, 向后遍历等特有方法) |
E | set(int index, E e) | 替换指定下标的元素 |
List |
subList(int fromIndex, int toIndex) | 按下标截取集合, 包含头, 不包含尾 |
listTerator()方法的使用
// 定义list...略
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) { // 向后判断, 有没有元素
String value = it2.next(); // 获取后面的元素
System.out.println(value);
}
ArrayList(实现类)
特点:
- 是list接口的实现类, 拥有list接口的特点, 有序, 有索引, 底层使用数组实现, 方便查询
- 可以使用
Collection
抽象类和List
接口的通用方法
常用构造方法
方法 | 说明 |
---|---|
ArrayList() | 无参构造 |
常用特有方法
无
注意: remove() 可以按照下标删除, 也可以直接指定元素值, 如果元素是Integer类型, 哪么可能会出现意外的结果
如下实例:
// 创建ArrayList对象
List<Integer> a1 = new ArrayList<>();
a1.add(1);
a1.add(2);
a1.add(3);
a1.add(4);
a1.add(100);
// remove() 可以按照下标删除, 也可以直接指定元素值
System.out.println(a1.remove(2)); // 按照下标删除
System.out.println(a1.remove(Integer.valueOf(100))); // 按照元素进行删除
由上例可见: 直接传入数字会默认按照下标进行删除, 只有传入包装类型的时候才会按元素删除
LinkedList(实现类)
特点:
- List接口的实现类, 拥有List接口的特点, 可以重复, 有索引, 有序, 底层是一个链表结构的实现. 查询比
ArrayList
复杂, 但是适用于增删业务 - 可以使用
Collection
抽象类和List
接口的通用方法
常用构造方法
方法 | 说明 |
---|---|
LinkedList() | 无参构造 |
常用特有方法
返回值 | 方法 | 说明 |
---|---|---|
void | addFirst(E e) | 添加首元素 |
void | addLast(E e) | 添加尾元素 |
E | getFirst() | 获取首 元素 |
E | getLash() | 获取尾元素 |
E | removeFirst() | 移除首元素, 并返回被移除元素的值 |
E | removeLash() | 移除尾元素, 并返回被移除元素的值 |
Set(接口)
set是一个不包含重复元素的集合, 至少包含一个null, set中不能存放重复元素, 常用来去重
注意: 去重自定义对象的时候, equals()和hashCode()必须都重写, 这样的话才可以识别两个对象是否相等, 才能达到去重的目的
- hashCode() 是为了让底层运算哈希值是, 可以根据对象的属性值运算, 如果两个对象的属性值一样, 就可以认为是相等的hash值
- equals() 是为了让底层在判断两个对象是否相等时, 让equals()返回true
Set接口的特点: 不重复, 无序, 无索引
Set接口几乎没有特有常用方法, 主要继承使用Collection的方法
HashSet(实现类)
HashSet是Set接口的实现类, 可以使用Set接口的所有功能, 拥有Set接口的特点, 数据无序, 不重复, 无索引
HashSet底层是哈希表(也叫散列表). 实际上底层维护了一个HashMap
常用构造器
方法 | 说明 |
---|---|
HashSet() | 无参构造 |
特有方法
同Set接口的方法
Collections 工具类
针对集合的工具类
常用方法
返回值和修饰符 | 方法 | 说明 |
---|---|---|
static boolean | addAll(Collection<? super T> c, T... elements) | 添加多个数据 |
static T(泛型) | max(Collection<? extends T> coll) | 集合中的最大值 |
static T(泛型) | min(Collection<? extends T> coll) | 集合中的最小值 |
static void | reverse(List<?> list) | 把指定集合中的元素 反转 |
static void | sort(List |
给指定的list集合排序 |
static void | swap(List<?> list, int i, int j) | 将指定集合的指定下标元素进行交换 |
代码实例
public static void main(String[] args) {
// 创建List集合
List<Integer> list = new ArrayList<>();
// 添加元素
Collections.addAll(list, 1, 2, 3, 4, 5);
System.out.println(Collections.max(list)); // 最大值
System.out.println(Collections.min(list)); // 最小值
Collections.reverse(list); // 把指定集合中的元素 反转
System.out.println(list);
Collections.sort(list); // 给指定的list集合排序
System.out.println(list);
Collections.swap(list, 2, 4); // 将指定集合的指定下标元素进行交换
System.out.println(list);
}
结果
5
1
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
[1, 2, 5, 4, 3]