集合(Collection)的概念:
在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,把这种Java对象称为集合。
String[] ss = new String[10]
定义数组可以存储10个String对象,但是数组有以下限制:
- 初始化后大小不可变
- 只能按索引顺序存取
- 数组用来存放基本类型的数据
但如果需要处理:
- 可变大小的顺序链表
- 无重复元素的集合...
- 集合可以存放对象的引用
就需要使用到集合(List, Map, Set等)

Collection接口的常用方法:

List: 一种有序列表的集合接口,具体的实现类有ArrayList和LinkedList等。
Set:一种保证没有重复元素的集合
Map:一种通过键值对(key-value)查找的映射表集合
Java集合设计的特点:
- 实现了接口和实现类相分离
- 支持泛型,限制一个集合中只能放入同一种数据类型的元素
List<String> list = new ArrayList<>(); //只能放入String类型
List的特点
- List接口继承了Collection接口,因此包含Collection的所有方法,此外,List接口还定义了以下两个重要的方法 get(int index):获取指定索引位置的元素 set(int index, Object obj):将集合中指定索引位置的对象修改为指定的对象
- 允许添加重复的元素
- 各个元素的顺序就是元素插入的顺序
- 允许添加null
- 通过索引确定元素的位置,索引从0开始
List的实现类:
ArrayList
ArrayList内部使用数组来存储数据,添加元素的时候,如果数组已满,没有空闲位置的时候,ArrayList会创建一个更大的数组,然后把旧数组的所有元素复制到新数组中,然后用新数组取代旧数组。
考察List接口,主要有以下几个方法:
在末尾添加一个元素 :void add(E e)
在指定索引添加一个元素:void add(int index, E e)
删除某个元素:int remove(Object e)
删除指定索引的元素:int remove(int index)
获取指定索引的元素:E get(int index)
获取链表大小:int size()
LinkedList
在LinkedList中,它的内部每个元素都指向下一个元素;
| ArrayList | LinkedList | |
| 获取指定元素 | 速度很快 | 需要从头开始查找元素 |
| 添加元素到末尾 | 速度很快 | 速度很快 |
| 在指定位置添加/删除 | 需要移动元素 | 不需要移动元素 |
| 内存占用 | 少 | 较大 |
通常情况下,优先使用ArrayList
创建List
- 使用ArrayList和LinkedList创建 List<Integer> list = new ArrayList<>(); List<String> list = new LinkedList<>();
- List.of()方法 List<Integer> list = List.of(1,2,3);
遍历List
使用迭代器Iterator来访问,Iterator本身也是一个对象,它是由List实例调用iterator()方法的时候创建的,Iterator对象有两个方法:
- boolean hasNext() 判断是否有下一个元素
- E next() 返回下一个元素
List<Integer> list = List.of(1,2,3,4,5);
for(Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
Integer i = it.next();
System.out.println(i);
}
通过Iterator遍历集合是最高效的方式
也可以用for each循环遍历
List<String> list = List.of("a","b","c");
for(String str : list){
System.out.println(str);
}
List和Array互相转换
- Array转List
String[] ss = new String[] {"a","b","c","d","e"};
List<String> list1 = List.of(ss);
for(String str : list1) {
System.out.println(str);
}
- List.toArray()
返回的是一个Object[]数组,丢失了类型信息,很少用;
- List.toArray(T[]) 传入一个类型相同的Array,List会把元素复制到传入的数组中
List<Integer> list = List.of(1,2,3,4,5);
Integer[] array = list.toArray(new Integer[list.size()]);
for(Integer n : array) {
System.out.println(n);
}
传入数组的长度,如果不够大,那么List内部会创建一个刚好够大的数组,填充后返回;
如果传入的数组长度大于list的长度,那么填充完元素后,剩下的一律填充null;
- List接口定义的: T[] toArray(IntFunction<T[]> generator)
编写equals()方法
List还提供了
boolean contains(Object o) :判断List是否包含某个指定元素;
int indexOf(Object o):返回某个元素的索引,如果元素不存在,返回-1;
List内部不是通过 == 判断两个元素相等,而是使用equals()方法判断,所以,如果要使用List的contains(),indexOf()方法,放入的实例必须正确覆写equals()方法,否则放进去的实例会查找不到,之所以能查到String, Integer这些对象,是因为java标准库定义的这些类已经正确实现了equals()方法。
class Person{
String name;
String id;
int age;
Person(String name, String id, int age){
this.name = name;
this.id = id;
this.age = age;
}
public boolean equals(Object o) {
if(o instanceof Person) {
Person p = (Person) o;
return Objects.equals(this.name, p.name) && Objects.equals(this.id, p.id) && this.age == p.age;
}else {
return false;
}
}
}
例如上面的Person类,定义了name,id,age三个字段,那么怎么正确覆写equals()方法:
- 先确定实例相等的逻辑,即哪些字段相等,就认为实例相等;
- 用instanceof()方法判断传入的对象o是不是Person类型,如果是继续比较,如果不是直接返回false;
- 对引用类型使用Objects.equals()比较,对基本类型使用==比较;
如果不调用List的contains(),indexOf()方法,那么就不需要实现equals()方法。
参考:廖雪峰Java教程;Java从入门到精通第5版;
本文介绍了Java集合中的List接口,包括其特点、常用方法和实现类如ArrayList与LinkedList。List是一个有序列表,允许重复元素和null,提供get、set、add、remove等操作。ArrayList基于数组实现,LinkedList则使用双向链表。遍历List可通过Iterator或for-each循环。此外,文章提到了List与其他数据结构的转换以及equals()方法的重要性。
964

被折叠的 条评论
为什么被折叠?



