系列文章目录
文章目录
前言
本文介绍了Java中常用的集合框架ArrayList和LinkedList,本文为系列文章,接下来还会介绍Set和Map,如果喜欢的话,可以点赞,收藏,关注。
一、Java中的集合框架
1.为什么使用集合框架
2.集合框架的继承关系(简略)
List是可重复且有序的,Set是不可重复且无序的
二、List
1.List类型的特点
Java中的List是一种接口类型,它定义了一种有序的集合数据结构。List中的元素按照插入的顺序存储,并且可以通过索引来访问元素。以下是List类型的主要特点:
- 有序集合:List中的元素按照插入的顺序进行排序,因此元素的顺序是有意义的。可以通过索引来访问元素,索引从0开始。
- 可以包含重复元素:List允许包含重复元素,即多个元素可以具有相同的值。
- 动态性:List是动态的,可以在运行时添加、删除或修改元素。这使得List非常灵活,可以适应程序运行时的变化需求。
- 易于使用:List提供了一组简单而强大的方法来操作数据,例如add、get、remove等。这使得开发人员可以轻松地使用List来处理数据。
- 可扩展性:List接口具有良好的扩展性,可以通过实现List接口来创建自己的List实现。这使得List可以根据需求进行扩展和定制,以满足特定的应用程序需求。
2.ArrayList案例和LinkedList案例
ArrayList:
public class ArrayListTest {
public static void main(String[] args) {
//声明的时候最好采用多态的形式,也就是以父接口的形式去声明
//增加元素
List list=new ArrayList();
list.add("西瓜");
list.add("苹果");
list.add("草莓");
list.add("西瓜");
//修改元素
list.set(1,"面包");//下标从0开始,此处将‘苹果’修改成了‘面包’
//删除元素
list.remove(1);//remove可以直接通过对象删除,也可以通过下标删除
//查询元素
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
LinkedList:
public class LinkedListTest {
public static void main(String[] args) {
List list=new LinkedList();
list.add("西瓜");
list.add("苹果");
list.add("草莓");
list.add("西瓜");
//修改元素
list.set(1,"面包");
//删除元素
list.remove(1);
//查询元素
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
3.ArrayList底层原理和LinkedList底层原理
-
ArrayList底层是由数组实现的
其默认初始化容量为10
将elementData这个存储ArrayList元素的数组作为缓冲区
通过ensureCapacity()方法进行动态扩容
-
LinkedList底层是由双向链表实现的
其初始化时不需要申请内存空间
4.ArrayList和LinkedList如何选择
ArrayList可以根据索引直接访问元素,因此可以快速随机访问元素。在添加或删除元素时,需要移动后面的所有元素,因此这种操作的效率较低。如果需要高效的随机访问元素,并且添加或删除元素的频率较低,那么应该选择ArrayList。
LinkedList无法进行随机访问元素,但是添加或删除元素时只需要修改指针,因此它的效率相对较高。如果需要高效的添加或删除元素,并且对访问元素的顺序并没有特别的要求,那么应该选择LinkedList。
在开发时,主要的业务场景是追加和遍历,所以使用ArrayList的频率更高。
5.List存放复杂的数据类型
先定义一个Dog复杂数据类型
public class Dog {
private String name;
private String type;
//此处忽略了全参数构造方法和get,set方法
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dog dog = (Dog) o;
return Objects.equals(name, dog.name) && Objects.equals(type, dog.type);
}
@Override
public int hashCode() {
return Objects.hash(name, type);
}
}
将其存入ArrayList中
public class ArrayListTest {
public static void main(String[] args) {
List list=new ArrayList();
list.add(new Dog("a","a"));
list.add(new Dog("b","b"));
list.add(new Dog("c","c"));
System.out.println("共有"+list.size()+"条狗");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//判断list中是否包含某个对象,或者移除对象都需要重写equals方法
System.out.println(list.contains(new Dog("a", "a")));
System.out.println(list.remove(new Dog("a", "a")));
}
}
contain包含,remove移除,传入的对象都需要重写equals()方法,否则操作失败返回false
6.LinkedList独有的方法
因为LinkedList是链表实现,所以有一些方法针对其实现
方法名 | 说明 |
---|---|
void addFirst(Object o) | 在列表首部添加元素 |
void addLast(Object o) | 在列表尾部添加元素 |
Object getFirst() | 返回列表的第一个元素 |
Object getLast() | 返回列表的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
总结
Java中的集合框架是一个强大的工具,为Java应用程序提供了灵活且高效的方式来存储、操作和访问数据。它提供了一组接口和实现类,可以处理各种常见的数据结构,如列表、集合和映射等。
集合框架的出现对Java开发产生了深远的影响。在早期的Java版本中,程序员需要手动实现各种数据结构,这既复杂又容易出错。而集合框架的出现提供了一种统一的方式来进行数据操作,大大简化了代码的编写和维护。
同时还提高了代码的可读性和可维护性。通过使用标准的接口和类,开发者可以更容易地理解彼此的代码,同时也方便了代码的复用和扩展。
它的出现也解决了早期Java语言的一些问题。例如,早期版本的数据结构和集合类库存在诸多问题,如缺乏统一接口、难以扩展和难以维护等。而集合框架的出现提供了一种更为高效和灵活的方式来处理数据集合。