Java基础-Collection子接口之List接口
Java基础-Collection子接口之List接口
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢?接下来我们一起Collection中的常用子类之一的:List集合。
一.List接口介绍
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。更确切地讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。难免有人希望通过在用户尝试插入重复元素时抛出运行时异常的方法来禁止重复的列表,但我们希望这种用法越少越好。
看完API我们可以做出如下总结:
1>.它是一个元素存取有序的集合。例如,存元素的顺序是11,22,33。那么集合中,元素的存储都是按照11,22,33的顺序完成的;
2>.它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
3>.集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List接口是继承了Collection接口,下面有很多实现类,常用的实现类有:ArrayList集合,LinkedList集合和Vector集合。
二.List接口的特有方法
List接口中的抽象方法,有一部分方法和他的父接口Collection是一样,List接口也有自己特有的方法,带有索引的功能。
1>.add(int index,E)方法【将元素插入到列表的指定索引上】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
System.out.println(list);
list.add(4,"yinzhengjie"); //这里是在当前集合中最后一个索引进行添加操作!
list.add(1,"尹正杰");
System.out.println(list);
}
} /*
以上代码执行结果如下:
[yinzhengjie1, yinzhengjie2, yinzhengjie3, yinzhengjie4]
[yinzhengjie1, 尹正杰, yinzhengjie2, yinzhengjie3, yinzhengjie4, yinzhengjie]
*/
2>.get(int index)方法【返回列表中指定位置的元素】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
System.out.println(list.get(2)); //获取指定索引的值
}
} /*
以上代码执行结果如下:
yinzhengjie3
*/
3>.remove(Object o)方法【从此列表中移除第一次出现的指定元素(可选操作,如果存在就删除第一此匹配到的元素,如果没有匹配到就不做任何操作)】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
System.out.println(list);
System.out.println(list.remove("yinzhengjie4")); //删除指定的元素,删除后返回布尔值表示是否删除成功。
System.out.println(list);
}
} /*
以上代码执行结果如下:
[yinzhengjie1, yinzhengjie2, yinzhengjie3, yinzhengjie4]
true
[yinzhengjie1, yinzhengjie2, yinzhengjie3]
*/
4>.remove(int index)方法【移除列表中指定位置(索引)的元素】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
System.out.println(list);
System.out.println(list.remove(0)); //返回被删除的元素
System.out.println(list);
}
} /*
以上代码执行结果如下:
[yinzhengjie1, yinzhengjie2, yinzhengjie3, yinzhengjie4]
yinzhengjie1
[yinzhengjie2, yinzhengjie3, yinzhengjie4]
*/
5>.set(int index, E)方法【修改指定索引上的元素,返回被修改之前的元素】
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
System.out.println(list);
System.out.println(list.set(3, "尹正杰")); //返回被修改的修改之前的元素。
System.out.println(list);
}
} /*
以上代码执行结果如下:
[yinzhengjie1, yinzhengjie2, yinzhengjie3, yinzhengjie4]
yinzhengjie4
[yinzhengjie1, yinzhengjie2, yinzhengjie3, 尹正杰]
*/
6>.List常见的三种遍历方式
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
//遍历方式一:
System.out.println("第一种遍历方式:");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println("\t"+it.next());
}
//第二种遍历方式:
System.out.println("第二种遍历方式:");
for (int index = 0; index < list.size(); index++) {
System.out.println("\t"+list.get(index));
}
//第三种遍历方式:(可以理解是第一种遍历方式的简写模式,推荐使用)
System.out.println("第三种遍历方式:");
for (String string : list) {
System.out.println("\t"+string);
}
//第四种遍历方式:
System.out.println("第四种遍历方式:");
for(Iterator<String> it2 = list.iterator();it2.hasNext();) {
System.out.println("\t"+it2.next());
}
}
} /*
以上代码执行结果如下:
第一种遍历方式:
yinzhengjie1
yinzhengjie2
yinzhengjie3
yinzhengjie4
第二种遍历方式:
yinzhengjie1
yinzhengjie2
yinzhengjie3
yinzhengjie4
第三种遍历方式:
yinzhengjie1
yinzhengjie2
yinzhengjie3
yinzhengjie4
第四种遍历方式:
yinzhengjie1
yinzhengjie2
yinzhengjie3
yinzhengjie4
*/
三.迭代器的并发修改异常
迭代器并发异常:java.util.ConcurrentModificationException
就是在遍历的过程中,使用了集合方法修改了集合的长度是不允许的!如果你用set命令修改元素的value的话是可以的,但是只要你修改长度就会抛异常!
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
List<String> list = new ArrayList<String>();
list.add("yinzhengjie1");
list.add("yinzhengjie2");
list.add("yinzhengjie3");
list.add("yinzhengjie4");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
String s = it.next();
if(s.equals("yinzhengjie1")) {
list.add("尹正杰"); //在遍历的过程中,使用集合方法修改集合的长度是不允许的(存在异常:java.util.ConcurrentModificationException)。但是你可以用set命令进行修改哟!
}
}
}
} /*
以上代码执行结果如下:
Exception in thread "main" java.util.ConcurrentModificationException
at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:939)
at java.base/java.util.ArrayList$Itr.next(ArrayList.java:893)
at cn.org.yinzhengjie.note.ListDemo.function(ListDemo.java:26)
at cn.org.yinzhengjie.note.ListDemo.main(ListDemo.java:15)
*/
四.数据的存储结构
List接口下有很多集合,他们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。数据存储的常用结构有:堆栈,队列,数组和链表。我们分别来了解一下:
1>.堆栈,采用该结构的集合,对元素的存取有如下的特点:
a>.先进后出(即,存进去的元素,要在它后面的元素异常取出后,才能取出该元素),例如:子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹;
b>.栈的入口,出口的都是栈的顶端位置;
c>.压栈:就是存元素。即把元素存储到栈的顶端位置,栈中已有元素依次向栈低方向移动一个位置;
d>.弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置

2>.队列,采用该结构的结合,对元素的存取有如下的特点:
a>.先进先出(即存进去的元素要在它前面的元素异常取出后,才能取出该元素),例如:安检,排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查。
b>.队列的入口,出口各占一侧。例如:下图中的左侧为入口。右侧则为出口。

3>.数组,采用该结构的结合,对元素的存取有如下的特点:
a>.查找元素块,通过索引,可以快速访问指定位置元素;
b>.增删元素慢原因之一:指定索引位置增加元素
需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到薪数组对应索引的位置。
c>.增删元素慢原因之二:指定索引位置删除元素
新数组对应索引的位置,原数组中指定索引位置元素不赋值到新数组中

4>.链表,采用该结构的集合,对元素的存取有如下的特点:
a>.多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了;
b>. 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素;
c>.增删元素快原因之增加元素:操作如左图,只需要修改连接下个元素的地址即可;
d>.增删元素快原因之删除元素:操作如右图,只需要修改连接下个元素的地址即可;

五.ArrayList集合的自身特点
ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。许多程序员开发时非常随意地使用ArrayList完成任何需求,并不严谨,这种用法是不提倡的。
六.LinkList特有方法
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。
/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note; import java.util.LinkedList; public class ListDemo {
public static void main(String[] args) {
function();
} public static void function() {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("yinzhengjie1");
link.addFirst("yinzhengjie2");
link.addFirst("yinzhengjie3");
link.addFirst("yinzhengjie4");
//获取元素
System.out.println("当前元素的成员:"+link);
System.out.println("获取元素:");
System.out.println("\t"+link.getFirst());
System.out.println("\t"+link.getLast());
//删除元素
System.out.println("当前元素的成员:"+link);
System.out.println("删除元素:");
System.out.println("\t"+link.removeFirst()); //移除并返回链表的开头
System.out.println("\t"+link.removeLast()); //异常并返回链表的结尾
System.out.println("当前元素的成员:"+link);
System.out.println("遍历元素:");
while(!link.isEmpty()){ //判断集合是否为空
System.out.println("\t"+link.pop()); //弹出集合中的栈顶元素,依次删除索引较小的元素
System.out.println("当前元素的成员:"+link);
}
System.out.println("当前元素的成员:"+link);
}
} /*
以上代码执行结果如下:
当前元素的成员:[yinzhengjie4, yinzhengjie3, yinzhengjie2, yinzhengjie1]
获取元素:
yinzhengjie4
yinzhengjie1
当前元素的成员:[yinzhengjie4, yinzhengjie3, yinzhengjie2, yinzhengjie1]
删除元素:
yinzhengjie4
yinzhengjie1
当前元素的成员:[yinzhengjie3, yinzhengjie2]
遍历元素:
yinzhengjie3
当前元素的成员:[yinzhengjie2]
yinzhengjie2
当前元素的成员:[]
当前元素的成员:[]
*/
七.Vector类的特点
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。
Vector集合的特点就是线程安全运行速度慢!
1>.Vector常见的方法

2>.Enumeration枚举常见的方法

3>.Vector集合对ArrayList集合使用的对比

Java基础-Collection子接口之List接口的更多相关文章
- Java基础-Collection子接口之Set接口
Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
- Java基础 -- Collection和Iterator接口的实现
Collection是描述所有序列容器(集合)共性的根接口,它可能被认为是一个“附属接口”,即因为要表示其他若干个接口的共性而出现的接口.另外,java.util.AbstractCollection ...
- Java基础——collection接口
一.Collection接口的定义 public interfaceCollection<E>extends iterable<E> 从接口的定义中可以发现,此接口使用了泛型 ...
- Java基础系列4:抽象类与接口的前世今生
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...
- Java基础学习笔记(三) - 抽象类和接口
一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...
- Java基础知识强化104:Serializable接口 与 Parcelable接口
1. 什么是 序列化 和 反序列化 ? 序列化 :序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间.序 ...
- JAVA基础知识总结7(抽象类 | 接口)
抽象类: abstract 1.抽象:不具体,看不明白.抽象类表象体现. 2.在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abs ...
- Java基础学习总结(2)——接口
一.接口的概念 JAVA是只支持单继承的,但现实之中存在多重继承这种现象,如"金丝猴是一种动物",金丝猴从动物这个类继承,同时"金丝猴是一种值钱的东西",金丝猴 ...
随机推荐
- 构造一个简单的Linux内核的MenuOS
构造一个简单的Linux内核的MenuOS 20135109 高艺桐 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000 ...
- spring 原理
1.spring原理 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建.调用对象,Spring就是在运 ...
- GIT理解
以前从来没听过GIT,根本不知道是什么东西.老师突然让注册一个GIT帐号,不知道怎么注册, 真有点不知所措了,又听说是全英文的,感觉也是醉了!登录进去看了看,看的似懂非懂,自己 也不敢妄下定论于是上网 ...
- 四则运算(window窗体程序)
我的第一个程序 忙活了半个下午做出来了,勉强可以见人,虽然还有些瑕疵,但是我也尽力了...... 我做的是一个能对0--10之间的整数进行四则运算的,题目的数据是程序自动生成的,而且程能接收用户输入的 ...
- 第三次作业---excel导入数据库及显示
好吧首先承认这次作业失败了,而且我并不知道原因.另外,我也没有采用PowerDesigner 设计所需要的数据库,代码就用了全部的时间.感觉自己就像一个刚学会爬着走路的小孩去参加一百一十米跨栏,能不能 ...
- python learning Exception & Debug.py
''' 在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返 ...
- Software Defined Networking(Week 1)
前言 课程名称:软件定义网络 课程地址 Coursera上新的一期还没开课,所以是YouTube. Instructor:Nick Feamster Get Started 对于本次课程,主要的新内容 ...
- Beta 冲刺 (6/7)
队名:Boy Next Door 燃尽图 代码写入 https://github.com/mangoqiqi/paybook/tree/master/Desktop/Web%E8%B4%A6%E5%8 ...
- python下的Box2d物理引擎的配置
/******************************* I come back! 由于已经大四了,正在找工作 导致了至今以来第二长的时间内没有更新博客.向大家表示道歉 *********** ...
- Navicat for MySQL笔记1
1.MySQL数据库的基本操作 A.系统数据库 安装MySQL数据库服务器后,自带的数据库. B.用户数据库 用户根据实际需求所创建的数据库. C.数据库对象 表.视图.存储过程.函数.触发器以及事件 ...