集合——List

本文介绍了Java集合中的List接口,包括其特点、常用方法和实现类如ArrayList与LinkedList。List是一个有序列表,允许重复元素和null,提供get、set、add、remove等操作。ArrayList基于数组实现,LinkedList则使用双向链表。遍历List可通过Iterator或for-each循环。此外,文章提到了List与其他数据结构的转换以及equals()方法的重要性。

集合(Collection)的概念:

在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,把这种Java对象称为集合。

String[] ss = new String[10]

定义数组可以存储10个String对象,但是数组有以下限制:

  1. 初始化后大小不可变
  2. 只能按索引顺序存取
  3. 数组用来存放基本类型的数据

但如果需要处理:

  1. 可变大小的顺序链表
  2. 无重复元素的集合...
  3. 集合可以存放对象的引用

就需要使用到集合(List, Map, Set等)

Collection接口的常用方法:

 

List: 一种有序列表的集合接口,具体的实现类有ArrayList和LinkedList等。

Set:一种保证没有重复元素的集合

Map:一种通过键值对(key-value)查找的映射表集合

 

Java集合设计的特点:

  1. 实现了接口和实现类相分离
  2. 支持泛型,限制一个集合中只能放入同一种数据类型的元素

List<String> list = new ArrayList<>(); //只能放入String类型

 

List的特点

  1. List接口继承了Collection接口,因此包含Collection的所有方法,此外,List接口还定义了以下两个重要的方法   get(int index):获取指定索引位置的元素  set(int index, Object obj):将集合中指定索引位置的对象修改为指定的对象
  2. 允许添加重复的元素
  3. 各个元素的顺序就是元素插入的顺序
  4. 允许添加null
  5. 通过索引确定元素的位置,索引从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中,它的内部每个元素都指向下一个元素;

 ArrayListLinkedList
获取指定元素速度很快需要从头开始查找元素
添加元素到末尾速度很快速度很快
在指定位置添加/删除需要移动元素不需要移动元素
内存占用较大

 

通常情况下,优先使用ArrayList

创建List

  1. 使用ArrayList和LinkedList创建     List<Integer> list = new ArrayList<>();  List<String> list = new LinkedList<>();
  2. List.of()方法  List<Integer> list = List.of(1,2,3);

遍历List

使用迭代器Iterator来访问,Iterator本身也是一个对象,它是由List实例调用iterator()方法的时候创建的,Iterator对象有两个方法:

  1. boolean hasNext() 判断是否有下一个元素
  2. 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()方法:

  1. 先确定实例相等的逻辑,即哪些字段相等,就认为实例相等;
  2. 用instanceof()方法判断传入的对象o是不是Person类型,如果是继续比较,如果不是直接返回false;
  3. 对引用类型使用Objects.equals()比较,对基本类型使用==比较;

如果不调用List的contains(),indexOf()方法,那么就不需要实现equals()方法。

 

参考:廖雪峰Java教程;Java从入门到精通第5版;

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值