Java 集合框架(List篇)

本文详细介绍了Java集合框架中的List接口及其主要实现类ArrayList、LinkedList和Vector。List允许存储重复元素并按索引访问,ArrayList基于动态数组,适合随机访问,而LinkedList基于链表,插入删除高效。Vector是线程安全的ArrayList。文章还讨论了List的特点、遍历方式、删除操作以及ArrayList的数据结构,包括堆栈和队列的概念。此外,还提到了去重、迭代器原理、泛型、装拆箱以及ArrayList与LinkedList、Vector的区别,强调了在不同场景下选择合适集合类的重要性。
摘要由CSDN通过智能技术生成

1、List集合

当我们需要保存一组数据时,集合框架就是非常常用的工具之一。Java语言提供了许多不同类型的集合框架。其中最常用的是List集合框架。

List接口是Java集合框架中最基本的一种形式,它允许存储重复元素,并可以按照索引访问集合中的元素。List集合的实现类有ArrayList、LinkedListVector等。

ArrayList是基于动态数组实现的List集合。动态数组指的是在数组声明时无需给出数组大小,在运行时动态扩展。ArrayList支持常见的集合操作,如添加、获取、删除、清空和遍历等操作。由于ArrayList是基于动态数组实现的,所以随机访问元素的速度很快,但是插入和删除元素会导致数据移动,因此效率相对较低。

LinkedList是基于双向链表实现的List集合,它也支持常见的集合操作。由于LinkedList是基于链表实现的,所以插入和删除元素的效率很快,但是随机访问元素的效率相对较低。

Vector也是基于动态数组实现的List集合,但是它是线程安全的。Vector支持与ArrayList相同的操作,但是由于是线程安全的,所以在并发环境下效率相对较低。

总的来说,List集合框架是一个非常常用且重要的部分。选择不同的实现类可以根据需求来平衡不同的集合操作的效率。

在这里插入图片描述

1、list的特点

list集合有两个特点:

特点描述代码
有序List集合数据存进去的顺序和取出来的顺序一致在这里插入图片描述
不唯一List集合数据允许添加重复数据在这里插入图片描述

2、遍历方式

1、foreach

在这里插入图片描述

2、迭代器(Iterator )

在这里插入图片描述

3、for循环

根据下标获取
在这里插入图片描述

3、删除

删除有三种方式:

  1. 正向删除
  2. 逆向删除
  3. 迭代器删除

其实前两种方式都是差不多的,List集合删除推荐使用迭代器

1、正向删除

在这里插入图片描述

2、逆向删除

在这里插入图片描述

3、迭代器删除

在这里插入图片描述

先移动下标,在删除元素。

4.增长因子论证

概念:初始化大小10、负载因子1.5、向下取整
公式:容器大小*1.5倍
例如:10*1.5=15、15*1.5=22、22*1.5=33 …

在这里插入图片描述

List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。

如果定义成一定的数,只要在这个数内都会是你定义的这个数,超过了才会增加。
在这里插入图片描述
在这里插入图片描述

5、ArrayList的数据结构

1、堆栈

堆栈的特点:先进后出

public class Demo {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();
        ll.add("lisi");
        ll.add("zs");
        ll.add("ww");
        DuiZhan duizhan= new DuiZhan(ll);
        System.out.println(duizhan.pop());
        System.out.println(duizhan.pop());
        System.out.println(duizhan.pop());
    }
}
class DuiZhan{
    LinkedList ll = null;
    public DuiZhan(LinkedList ll){
        this.ll = ll;
    }

    public void add(String a){
        ll.add(a);
    }

    public String pop(){
        return (String) ll.removeLast();
    }
}

2、队列

队列的特点:先进先出

public class Demo {
    public static void main(String[] args) {
        LinkedList ll = new LinkedList();
        ll.add("lisi");
        ll.add("zs");
        ll.add("ww");
        Duilie duilie = new Duilie(ll);
        System.out.println(duilie.pop());
        System.out.println(duilie.pop());
        System.out.println(duilie.pop());
    }
}
class Duilie{
    LinkedList ll = null;
    public Duilie(LinkedList ll){
        this.ll = ll;
    }

    public void add(String a){
        ll.add(a);
    }

    public String pop(){
        return (String) ll.remove();
    }
}

3、集合框架ArrayList中的重复元素去重及其底层原理(去重)

public class Demo5 {
    	public static void main2(String[] args) {
		List list = new ArrayList();
		list.add("a");
		list.add("b");
		list.add("c");
		System.out.println("目前集合容器中的元素:" + list);
		if (!list.contains("b")) {
			list.add("b");
		}
		System.out.println("目前集合容器中的元素:" + list);
	}

	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new Student("zs", 16));
		list.add(new Student("ls", 17));
		list.add(new Student("ww", 18));
		System.out.println("目前集合容器中的元素:" + list);
		if (!list.contains(new Student("ls", 17))) {
			list.add(new Student("ls", 17));
		}
		System.out.println("目前集合容器中的元素:" + list);
		if (list.contains(new Student("ls", 17))) {
			list.remove(new Student("ls", 17));
		}
		System.out.println("目前集合容器中的元素:" + list);
	}
}

class Student {
	private String name;
	private int age;

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}


	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		System.out.println("调用了equals方法。。。");
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
}

ArrayList中可能有重复元素,用Stream API去重底层实现是将ArrayList转化为HashSet集合,重复元素会被自动去除。ArrayList底层是数组结构,在扩容时会创建新数组,重复元素虽然存在但无法被访问。

很简单的理解就是重写equals()方法

2、迭代器原理

在这里插入图片描述

3、泛型

JDK1.5以上才有。
1)以类型为参数的类叫做泛型
2)泛型的默认类型为Object
3)作用:提高程序的健壮性、简化代码

4、装拆箱

1、装箱

int a=10;
Integer b=new Integer(a);

装箱:值类型到引用类型

2、拆箱

Integer c=new Integer(10);
int d=c.intValue();

拆箱:引用类型到值类型

5、ArrayList、LinkedList和Vector的区别

1、ArrayList和LinkedList的区别

  • 相同点

1、LinkedeList和ArrayList都实现了List接口。

2、ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。

  • 不同点

1、ArrayList底层实现是数组,而LinkedList是双向链表。

2、ArrayList查询快(下标)、增删改慢、LinkedList是查询慢,但是在插入删除时效率比较高。

2、ArrayList和Vector的区别

  • 相同点

1、ArrayList和Vector都是用数组实现的

2、默认初始化大小都是10

  • 不同点

1、Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)

希望对你们有用!!!

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无法自律的人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值