java集合之List接口的常用实现类、ArrayList、LinkedList、Vector

本文深入讲解Java中的Collection和List接口,包括ArrayList、LinkedList和Vector的特点与应用场景,对比不同集合类的性能差异,并提供实例代码。

Collection接口的常用方法,
以子类ArrayList实现类来演示:

add():添加单个元素
remove():删除指定元素
contains():查找元素是否存在
size():获取元素个数
isEmpty()判断是否为空
clear():清空
addAll():添加多个元素
contaisnAll():查找多个元素是否都存在
removeAll():删除多个元素

如下演示:

import java.util.Collection;
import java.util.ArrayList;
import java.util.Arrays;
public class Function {
	public static void main(String[] args) {
		Collection coll1=new ArrayList(Arrays.asList(12,"你",12,5));
		Collection coll2=new ArrayList(Arrays.asList(12,42,12,5));
		Collection coll3=new ArrayList(Arrays.asList(12,42));
		System.out.println(coll1);//输出[12, 你, 12, 5]
		coll1.add(23);//添加多个元素
		System.out.println(coll1);//输出[12, 你, 12, 5, 23]
		coll1.remove(12);//删除coll1里的第一个出现的12元素
		System.out.println(coll1);//输出[你, 12, 5, 23]
		System.out.println(coll1.size());//返回coll1的长度
		System.out.println(coll1.isEmpty());//返回这个集合是否为空;返回值为boolean 输出false
		coll1.addAll(coll2);//添加多个元素,参数为一个链表
		System.out.println(coll1);//输出[你, 12, 5, 23, 12, 42, 12, 5]
		coll1.removeAll(coll3);//删除多个元素,参数是一个链表
		System.out.println(coll1);//输出[你, 5, 23, 5]
		System.out.println(coll1.containsAll(coll3));//传入一个链表返回一个boolean 输出为fales
		coll1.clear();//清空这个链表
		System.out.println(coll1);
	}
}

输出结果:
在这里插入图片描述

Iterator(迭代器)

基本介绍

1)Iterator对象称为迭代器,主要用于遍历 Collection 集合中的元素。

2)所有实现了Collection接口的集合都有一个interator()方法,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器。

3)Iterator 仅用于遍历集合,Iterator 本身并不存放对象。

迭代器执行原理:

Iterator iterator=coll.iterator();//会得到一个集合的迭代器
hasNext();//会返回以个boolean 判断是否还有下一个元素 有的话返回tue 没有的话返回false
nest();//指针下移,返回该指针所指向的元素 ,每执行一次指针就会下移一个
remove;//删除当前指针所指向的元素,一般和next方法一起用,这时候的作用就是删除next方法返回的元素
小结:1.所以nest()一般情况下是和hasNext配合使用的
    2.当集合没有下一个元素时,使用了nest() 就会报	      java.util.NoSuchElementException异常
    3.Iterator迭代时第一个指针指向的并不时集合的第一个元素而是第一个元素的上方即 空

代码演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
public class Iterator_ {
	public static void main(String[] args) {
        //不写泛型的话默认泛型是Object
		Collection coll=new ArrayList(Arrays.asList(12,42,12,5));
		Iterator iterator=coll.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());//输出返回的元素
            iterator.remove();//删除集合里的当前元素
		}
        //当循环执行完毕的时候指针就指向了集合里的最后一个元素如果想要重新遍历那么就必须重置我们的迭代器 如下
        iterator = coll.iterator();
        while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
        //当上面的循环结束后并不会输出什么内容因为在第一个循环的时候我们将元素给删除了
	}
}

在这里插入图片描述

增强for:

增强for循环,可以替代iterator迭代器,特点:增强for就时简化版的iterator,本质一样。只能用于遍历集合或数组。

基本语句如下:

for(元素类型 元素名:集合名或数组名){
	访问元素
}

注意:

增强for的底层依赖的是迭代器。

也就是说增强for就是迭代器的简写形式。

下边我们通过案例演示一下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class Iterator_ {
	public static void main(String[] args) {
        //不写泛型的话默认泛型是Object
		Collection coll=new ArrayList(Arrays.asList(12,42,12,5));
		for(Object i:coll) {
			System.out.println(i);
		}
	}
}

List接口:

List接口基本介绍

List接口是Collection接口的子接口

1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可重复

2)List集合中的每个元素都有其对应的顺序索引、即支持索引。

3)List容器中的元素都对应一个整数类型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。

4)JDK API中List接口的实现类有:AbstractList、AbstractSequenTialList、ArrayList、AttributeList、CopyOnWriteArrayList、LinkedList、RoleList、RoleUnresovedList、Stack、Vector

常用List实现类有ArrayList、LinkedList和Vector

List接口的常用方法

//Collection接口的常用方法,
//以子类ArrayList来实现的方法:
add(int index,Object ele):在index位置插入ele元素
addAll(int index,Collection eles):index位置开始将eles中的所有元素添加进来
get(int index):获取指定的index位置的元素
indexOf(Object obj):返回obj在当前集合中首次出现的位置
lastIndexOf(Object obj):返回obj在当前集合中末次出现位置
remove(int index):移除指定index位置的元素,并返回此元素
set(int index,Object ele):设置指定index位置的元素为ele,相当于是替换
subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的子集合

代码演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class List_ {
	public static void main(String[] args) {
        //不写泛型的话默认泛型是Object
		List list1=new ArrayList(Arrays.asList(2,5,23,2));
		List list2=new ArrayList(Arrays.asList("令狐冲","岳不群"));
        //在位置为2的元素前面添加一个引用类型
		list1.add(2,"Null");
        //输出[2, 5, Null, 23, 2]
		System.out.println(list1);
        //在位置为3的位置添加多个元素,参数是一个集合
		list1.addAll(3,list2);
        //输出[2, 5, Null, 令狐冲, 岳不群, 23, 2]
		System.out.println(list1);
        //list.get(4)返回一个位置为4的元素内容“岳不群”
        System.out.println(list1.get(4));
        //返回一个元素首次出现位置的 “3”
        System.out.println(list1.indexOf("令狐冲"));
        //返回一个元素最后出现的位置 “6”
        System.out.println(list1.lastIndexOf(2));
        //返回以个位置为2的元素,并将其删除 “Null”
        System.out.println(list1.remove(2));
        //将一个位置为6的元素原来的值改为“行者孙”
        list1.set(6,"行者孙");
        //返回list1里位置2到4的元素,找的范围是<=2和>4的内容
        System.out.println(list1.subList(2,4));
	}
}

List的三种遍历方式

方式一:使用iterator

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Iterator;
public  class Iterator_ {
	public static void main(String[] args) {
		List coll=new ArrayList(Arrays.asList(12,42,12,5));
		Iterator it=coll.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}

方式二:使用增强for

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public  class Iterator_ {
	public static void main(String[] args) {
		List coll=new ArrayList(Arrays.asList(12,42,12,5));
		for(Object i:coll){
            System.out.println(i);
        }
	}
}

方式三:使用普通forimport java.util.ArrayList;

import java.util.Arrays;
import java.util.List;
public  class Iterator_ {
	public static void main(String[] args) {
		List coll=new ArrayList(Arrays.asList(12,42,12,5));
		for(int i=0;i<coll.size;i++){
            System.out.println(coll.get(i));
        }
	}
}

ArrayList,LinkedList,Vector这些List接口下的集合都可以用这三种方式遍历

list排序练习:将西游记使徒四人按照身高进行排序

代码实现:

import java.util.ArrayList;
import java.util.List;
class Guest {
	private String name;
	private double height;
	private int age;
     //创建一个有参构造
	public Guest(){
		
	}
    //创建一个有参构造
	public Guest(String name,double height,int age){
		this.name=name;
		this.height=height;
		this.age=age;
	}
	@Override
	public String toString() {
		return "姓名:"+this.name + "\t身高:"+height+"\t年龄:"+age;
	}
    //用来获取这个里的private变量
	public String getName() {
		return name;
	}
	public double getHeight() {
		return height;
	}
	public int getAge() {
		return age;
	}
}

public class Test {

	public static void main(String[] args) {
        //这里使用list接口,以下三个实现类都实现
		List list=new ArrayList();
//		List list=new LinkedList();
//		List list=new Vector();
		//给list添加五个对象元素
		list.add(new Guest("唐三藏",184.5,32));
		list.add(new Guest("沙悟净",193.23,132));
		list.add(new Guest("猪八戒",191.2,121));
		list.add(new Guest("孙悟空",151.2,500));
		System.out.println("排序前:");
		for(Object t:list) {
			//当直接输出一个对象的时候会默认调用这个对象的toString方法
			System.out.println(t);
		}
        //调用方法进行排序
		sort(list);
		System.out.println("排序后:");
		for(Object f:list) {
			System.out.println(f);
		}
	}
	//冒泡排序 传入的是实现了list接口的对象
	public static void sort(List list) {
		//获取传入的list集合长度
		int num=list.size();
		//循环里的sum-1是为了list.get(j+1)的时候不会越界
		for(int i=0;i<num-1;i++) {
			for(int j=0;j<num-1-i;j++) {
				Guest guest1= (Guest) list.get(j);
				Guest guest2= (Guest) list.get(j+1);
				//每循环一次进行判断,如果满足条件就会将j和j+1里的值进行交换
				if(guest1.getHeight()>guest2.getHeight()) {
					list.set(j,guest2);
					list.set(j+1,guest1);
				}
			}
		}	
	}
}

输出结果:

在这里插入图片描述

ArrayList

1)ArrayList可以存放很多的元素包括 null

2)ArrayList是由数组来实现数据存储的

3)ArrayList基本等同于Vector,除了ArrayList是线程不安全但是ArrayList执行效率比较高,在多线程的情况下,不建议使用ArrayList

ArrayList详细解读:

ArrayList中维护了一个Object类型的数组elementData这数组是一个Object类型的数组并且是被transient修饰的表示 transient表示瞬间,短暂的,被它修饰的不会被序列化

当创建ArrayList对象是,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如果要再次扩容,则扩容elementData为1.5倍。

如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍

Vector

vector类他继承了AbstractList类实现了implements、RandomAccess、Cloneable、Java.io.Serializeble接口

vector底层也是一个对象数组,

Vector是线程同步的,即线程安全,Vector类的操作方法带有synchronized

在开发中,需要线程同步安全时,考虑使用Vector

Vector和ArrayList 的比较

底层结构版本线程安全(同步)效率扩容倍数
ArrayList可变数组jdk1.2不安全,效率高如果有参构造1.5倍 如果无参 第一次是10个长度 第二次开始按照1.5倍扩容
Vector可变数组jdk1.0安全,效率不高如果是无参,默认10,满后,就按2倍扩容 如果指定大小,则每次直接按2倍扩容

linkedList

  • linkedList底层实现了双向链表和双端队列特点
  • 可以添加任意元素(元素可以重复),包括null
  • 线程部安全没有实现同步
  • LinkedList底层维护了一个双向链表
  • LinkedList中维护了两个属性First和Last分别指向 首节点和尾节点
  • 每个节点(Node对象),里面又维护了prev、next、item三个 属性,其中通过prev指向前一个,通过next指向后一个节点。最终实现双向链表,
  • LinkedList的元素添加和删除,不是通过数组完成的,所以添加和删除的效率比较高。

ArrayList和LinkedList的比较:

底层结构增删的效率改查的效率
ArrayList可变数组较低、通过数组扩容较高
LinkedList双向链表较高、通过链表追加.较低

小结:

1)如果我们改查操作多,选择ArrayList

2)如果我们的增,删操作较多,选择LinkedList

3)如果要保证线程安全的话可以使用Vector

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值