java 接口和子类_Java 集合-List接口和三个子类实现

List

List:有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。

常用方法:

f51fdce10a40b1ccc0d877ee4ebc864a.png

775f8c073293f10ee6950c101b787281.png

List中的一些特有方法测试:

public void demo2()

{

List list = new ArrayList();

list.add("hello");

list.add("world");

list.add("!");

//在指定位置进行添加

list.add(1, "my");

// list.add(12,"错误") 会发生数组的越界

//删除指定位置的值

list.remove(1);

//修改指定位置的值

list.set(1, "test");

System.out.println(list);

}

List的特有遍历方法:

public void demo2()

{

List list = new ArrayList();

list.add("hello");

list.add("world");

list.add("!");

//List的特有遍历功能

for(int i=0;i

{

System.out.println(list.get(i));

}

}

List的特有迭代器ListIterator:该迭代器继承了Iterator接口

常用方法:

6017977ee8083dbb913a2ea00c7c2540.png

ListIterator中还提供了逆向遍历,不过需要先正向遍历之后才可以逆向,所以没有意义。一般不使用。

//报错代码

public void demo3()

{

List list = new ArrayList();

list.add("hello");

list.add("world");

list.add("!");

Iterator it = list.iterator();

while(it.hasNext())

{

String s = (String) it.next();

if("world".equals(s)) list.add("java");

}

}

这样写的话,会报ConcurrentModificationException的错误,也就是当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

产生的原因是:迭代器是依赖于集合而存在的,在判断成功后,集合中新添加了元素但是迭代器却是不知道的,所以会报错。

或者说通过迭代器遍历元素的时候,是不能通过集合修改元素的。

解决方法:迭代器迭代元素,迭代器修改元素(需要使用ListIterator);

集合遍历元素,集合修改元素(for+get);

public void demo3()

{

List list = new ArrayList();

list.add("hello");

list.add("world");

list.add("!");

ListIterator it = list.listIterator();

while(it.hasNext())

{

String s = (String) it.next();

if("world".equals(s)) it.add("java");

}

System.out.println(list);

}

这里的添加是添加在刚才迭代的元素后面。

List的三个子类

1、ArrayList:底层数据结构是数组,查询块,增删慢。

线程不安全,效率高。

2、Vector:底层数据结构是数组,查询块,增删慢。

线程安全,效率低。

3、LinkedList:底层数据结构是双向链表,查询慢,增删块。

线程不安全,效率高。

~ ArrayList

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。

*构造方法

f925d596239f64adb0e32c421dc62a19.png

*常用方法

840969a9c1de1c96f27f4e6388c2be30.png

6487a30e4206cf892fcec06803faa67d.png

~ Vector(基本不用了)

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。另外,Vector是线程安全的。

*构造方法

c9fbde62653a98fc05adcdf825612593.png

*常用方法

28045d9edfce948bb3a4e25fef139da9.png

7c1c0cc48dfafa27f8041f9b73e96fdd.png

a4c79a3ba2bb9af5b141d39623463892.png

public void demo4()

{

Vector v = new Vector();

v.addElement("Hello");

v.addElement("World");

v.addElement("!");

//遍历

for(int i=0;i

{

String s = (String) v.elementAt(i);

System.out.println(s);

}

System.out.println("---------------");

Enumeration en= v.elements();

while(en.hasMoreElements())

{

System.out.println(en.nextElement());

}

}

~ LinkedList

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。注意,此实现不是同步的。如果多个线程同时访问一个链接列表,而其中至少一个线程从结构上修改了该列表,则它必须 保持外部同步。

*构造方法

f3074131a8307f0ba143147a3bcc0441.png

*常用方法

fcb057d53b0a9001a3bddcc291c1a71c.png

5464f99c331295ba6f10b5afce578110.png

5613d46db1d51b524d4910b6bb0a1cc1.png

由于有addfirst,addlast方法,getfirst,getlast方法,所以可以用来做为双端队列。并且有pop,push方法,所以可以用来作为堆栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值