Java集合之List超详细讲解

一.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线程不安全,在多线程中不建议使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值