Java/List接口常用的实现类ArrayList、LinkedList和Vector

1.ArrayList

ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它。
根据源码可以看出ArrayList底层使用Object数组来存储元素数据。所有的方法,都围绕着核心的Object数组来开展。
而ArrayList是可以存放任意数量的对象,长度不受限制,本质上就是通过定义新的更大的数组,将旧数组中的内容拷贝到新数组,来实现扩容。 ArrayList的Object数组初始化长度为10,如果存储满了这个数组,需要存储第11个对象,就会定义新的长度更大的数组,并将原数组内容和新的元素一起加入到新数组中(默认NewCapacity=OldCapacity*3/2+1)。
增删效率低是因为增删操作都是通过拷贝实现的,牵一发而动全身。
ArrayList类

4.1 引入——对象数组
使用学生数组,存储三个学生对象,代码如下:

public class Student {
	 private String name; 
	 private int age; 
	 public Student() {
	}
	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;
	}
}
	public class Test01StudentArray {
		public static void main(String[] args) {
		//创建学生数组
		Student[] students = new Student[3];

		//创建学生对象
		Student s1 = new Student("曹操",40); 
		Student s2 = new Student("刘备",35); 
		Student s3 = new Student("孙权",30);

		//把学生对象作为元素赋值给学生数组 students[0] = s1;
		students[1] = s2; students[2] = s3;

		//遍历学生数组
		for(int x=0; x<students.length; x++) { 
		Student s = students[x];
		System.out.println(s.getName()+"‐‐‐"+s.getAge());
		}
	}
}

到目前为止,我们想存储对象数据,选择的容器,只有对象数组。而数组的长度是固定的,无法适应数据变化的需求。为了解决这个问题,Java提供了另一个容器java.util.ArrayList集合类,让我们可以更便捷的存储和操作对象数据。
4.2 什么是ArrayList类
java.util.ArrayList是大小可变的数组的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。ArrayList中可不断添加元素。其大小也自动增长。

4.3 ArrayList使用步骤
查看类
—java.util.ArrayList :该类需要 import导入使后使用。
,表示一种指定的数据类型,叫做泛型。 E,取自Element(元素)的首字母。在出现 用一种引用数据类型将其替换即可,表示我们将存储哪种引用类型的元素。代码如下:

ArrayList<String>,ArrayList<Student>

查看构造方法
public ArrayList():构造一个内容为空的集合。
基本格式:

ArrayList<String> list = new ArrayList<String>();

在JDK 7后,右侧泛型的尖括号之内可以留空,但是<>仍然要写。简化格式:

ArrayList<String> list = new ArrayList<>();

查看成员方法

public boolean add(E e):将指定的元素添加到此集合的尾部。
参数E e,在构造ArrayList对象时,制定了什么数据类型,那么add(E e)方法中,只能添加什么数据类型的对象。
使用ArrayList类,存储三个字符串元素,代码如下:

public class Test02StudentArrayList { 
	public static void main(String[] args) {
	//创建学生数组
	ArrayList<String> list = new ArrayList<>();
	//创建学生对象 
	String s1 = "曹操"; 
	String s2 = "刘备"; 
	String s3 = "孙权";
	//打印学生ArrayList集合 
	System.out.println(list);
	//把学生对象作为元素添加到集合 
	list.add(s1);
	list.add(s2);
	list.add(s3);

4.4 常用方法和遍历
对于元素的操作,基本体现在——增、删、查。常用的方法有:
public boolean add(E e):将指定的元素添加到此集合的尾部。
public E remove(int index):移除此集合中指定位置上的元素。返回被删除的元素。
public E get(int index):返回此集合中指定位置上的元素。返回获取的元素。
public int size():返回此集合中的元素数。遍历集合时,可以控制索引范围,防止越界。
这些都是最基本的方法,操作非常简单,代码如下:

public class Demo01ArrayListMethod { 
	public static void main(String[] args) {
	//创建集合对象
	ArrayList<String> list = new ArrayList<String>();
	//添加元素 list.add("hello");
	list.add("world");
	list.add("java");
	//public E get(int index):返回指定索引处的元素
	System.out.println("get:"+list.get(0)); 
	System.out.println("get:"+list.get(1)); 
	System.out.println("get:"+list.get(2));
	//public int size():返回集合中的元素的个数 
	System.out.println("size:"+list.size());
	//public E remove(int index):删除指定索引处的元素,返回被删除的元素 
	System.out.println("remove:"+list.remove(0));
	//遍历输出
	for(int i = 0; i < list.size(); i++){
		System.out.println(list.get(i));
		}
	}
}

4.5 如何存储基本数据类型
ArrayList对象不能存储基本类型,只能存储引用类型的数据。类似 不能写,但是存储基本数据类型对应的
包装类型是可以的。所以,想要存储基本类型数据, 中的数据类型,必须转换后才能编写,转换写法如下:

基本类型	  基本类型包装类
byte		Byte
short		Short
int	    	Integer
long		Long
float		Float
double		Double
char		Character
boolean		Boolean

代码如下:

public class Demo02ArrayListMethod { 
	public static void main(String[] args) {
	ArrayList<Integer> list = new ArrayList<Integer>(); 
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	System.out.println(list);
	}
}

4.6 ArrayList练习
数值添加到集合
生成6个1~33之间的随机整数,添加到集合,并遍历

public class Test01ArrayList {
public static void main(String[] args) {
// 创建Random 对象
Random random = new Random();
// 创建ArrayList 对象
ArrayList<Integer> list = new ArrayList<>();
// 添加随机数到集合
for (int i = 0; i < 6; i++) {
int r = random.nextInt(33) + 1;
list.add(r);
}
//遍历集合输出
foe(int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}

对象添加到集合
自定义4个学生对象,添加到集合,并遍历

public class Test02ArrayList {
	public static void main(String[] args) {
	//创建集合对象
	ArrayList<Student> list = new ArrayList<Student>();

	//创建学生对象
	Student s1 = new Student("赵丽颖",18); 
	Student s2 = new Student("唐嫣",20); 
	Student s3 = new Student("景甜",25); 
	Student s4 = new Student("柳岩",19);

	//把学生对象作为元素添加到集合中 list.add(s1);
	list.add(s2);
	list.add(s3);
	list.add(s4);

	//遍历集合
	for(int x = 0; x < list.size(); x++) { 
		Student s = list.get(x);
		System.out.println(s.getName()+"‐‐‐"+s.getAge());
		}
	}
}

打印集合方法
定义以指定格式打印集合的方法(ArrayList类型作为参数),使用{}扩起集合,使用@分隔每个元素。格式参照 {元素
@元素@元素}。

public class Test03ArrayList {
	public static void main(String[] args) {
	// 创建集合对象
	ArrayList<String> list = new ArrayList<String>();
	
	// 添加字符串到集合中
	list.add("张三丰");
	list.add("宋远桥");

在这里插入图片描述

获取集合方法
定义获取所有偶数元素集合的方法(ArrayList类型作为返回值)

2.LinkedList

LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
每个节点都应该有3部分内容:

 class  Node {
        Node  previous;     //前一个节点
        Object  element;    //本节点保存的数据
        Node  next;         //后一个节点
}

3.Vector

Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。

使用建议:

  1. 需要线程安全时,用Vector。
  2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
  3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值