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

1万+

被折叠的 条评论
为什么被折叠?



