一.List集合
List集合为列表类型,以线性方式存储对象。List集合中的元素允许重复,各元素的顺序就是对象插入的顺序。用户可以通过使用索引来访问List集合中的元素。
1主要方法
方法 | 说明 |
---|---|
void add(int index,Object obj) | 将obj插入调用列表,插入位置的下标由index传递。任何已存在的,在插入点以及插入点以后的元素将前移,因此没有元素被覆写。 |
Boolean addAll(int index,Collection c) | 将c中的所有元素插入到调用列表中,插入点的下标由index传递。 |
Object get(int index) | 返回指定下标的对象 |
Object set(int index,Object obj) | 对由index指定的位置进行赋值 |
int indexOf(Object obj) | 返回调用列表obj的第一个实例的下标。如果obj不是列表元素,返回-1. |
对于由Collection定义的add()和addAll()方法外,List增加了方法add(int,Object)和addAll(int,Collection),这俩方法可以在指定的下标处插入元素。
List集合的特点就是存取有序,可以存储重复的元素,可以用下标进行元素的操作
2.ArrayList集合
ArrayList支持可随需要而增长的动态数组。在Java数组中,长度是固定的,因此在数组被创建后,不能修改长度,这意味着开发者需要实现知道数组的长度。但在一般情况下,只有在运行时才知道数组长度。为了解决这个问题,ArrayList因此而生。
2.1代码演示
class Test{
public static void main(String[] args) {
ArrayList<String> list1 = new ArrayList<>();
System.out.println("list1初始长度为:"+ list1.size());
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");
list1.add("E");
list1.add("F");
//将B2添加在list1的index=1的位置
list1.add(1, "B2");
System.out.println("list1加入元素后的大小:" + list1.size());
System.out.println("list1元素为:"+ list1);
list1.remove("A");
list1.remove(2);
System.out.println("list1删除元素后的大小:" + list1.size());
System.out.println("list1元素为:" + list1);
}
}
Output:
list1初始长度为:0
list1加入元素后的大小:7
list1元素为:[A, B2, B, C, D, E, F]
list1删除元素后的大小:5
list1元素为:[B2, B, D, E, F] // 需要移动数据,使得B2作为index=0的元素。
注意,list1开始为空,随着元素的加入,大小增加。当每个元素被删除时,大小会每次变小。
底层是使用数组实现,所以查询速度快,增删速度慢
3.ArrayList如何存入自定义的数据?
import java.util.ArrayList;
import java.util.Iterator;
public class Student{
private String name;
private int id;
public Student(){}
public Student(String name, int id)
{
super();
this.name = name;
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
class Test{
public static void main(String []args) {
ArrayList<Student> list1 = new ArrayList<>();
list1.add(new Student("lili",001));
list1.add(new Student("haha",002)); //匿名对象存入集合
list1.add(new Student("wawa",003));
Iterator<Student> it=list1.iterator();
while(it.hasNext()) {
Student stu = it.next();
System.out.println(stu.getName()+stu.getId());
}
4.LinkedList集合
除了LinkedList继承的方法以外,它本身还定义了一些有用的方法。
addFirst()可以在列表头增加元素
addLast()可以在列表尾部增加元素
getFirst()可以获取第一个元素
removeFirst()可以删除第一个元素
removeLast()可以删除最后一个元素
getFirst() 返回此列表的第一个元素
getLast() 返回此列表的最后一个元素
LinkedList:是基于链表结构实现的,所以查询速度慢,增删速度快,提供了特殊的方法,对头尾的元素操作(进行增删查)
使用LinkedList实现栈
import java.util.LinkedList;
public class MyStack {
private LinkedList<String> linkList = new LinkedList<String>();
// 压栈
public void push(String str){
linkList.addFirst(str);
}
// 出栈
public String pop(){
return linkList.removeFirst();
}
// 查看
public String peek(){
return linkList.peek();
}
// 判断是否为空
public boolean isEmpty(){
return linkList.isEmpty();
}
}
public class Test {
public static void main(String[] args) {
StackTest stack = new StackTest();
stack.push("first");
stack.push("second");
stack.push("third");
stack.push("forth");
stack.push("fifth");
// 取出
while (!stack.isEmpty()){
String pop = stack.pop();
System.out.println(pop);
}
}
}
Output
fifth
fourth
third
second
first
也可实现队列。
5.ArrayList与LinkedList
- ArrayList和LinkedList顾名思义,ArrayList是Array(动态数组)的数据结构,相当于动态数组;LinkedList是Link(链表)的双向数据结构,也可当作堆栈、队列、双端队列。
- 对于随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据(可以在上述ArrayList代码中体现)。
- 两者缺点都为线性不安全
ArrayList和LinkedList线程不安全,在多线程中不建议使用。