一、List接口

  List集合为列表类型,列表的主要特征是以线性方式存储对象。

  1.实例化List集合

  List接口的常用实现类有ArrayList和LinkedList,根据实际需要可以使用两种方式进行List集合实例化

List<String> list_1 = new ArrayList<>();
List<String> list_2 = new LinkedList<>();

  由于List集合可以通过索引位置访问对象,因此,遍历List集合的方法有两种:

        Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.println(string);
} for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

  2.List接口除了拥有Collection接口提供的所有方法,还拥有一些适合于自身的常用方法。

  

  可以看出,List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。

  3.常用方法

  (1)add(int index, Object obj)向指定索引位置添加对象,set(int index, Object obj)是替换指定索引位置的对象。

package list.jun.iplab;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class MethodTest_addAndset { public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E"; List<String> list = new LinkedList<>(); list.add(a);
list.add(e);
list.add(d); list.set(1, b); // 将e换成b
list.add(2, c); // 在索引值为2的位置插入c,也就是d的前面 Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.println(string);
}
}
} 输出:
A
B
C
D

  (2)indexOf(Object obj)获得指定对象的最小索引位置,lastIndexOf(Object obj)获得指定对象的最大索引位置。

package list.jun.iplab;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class MethodTest_addAndset { public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E", repeat = "Repeat"; List<String> list = new LinkedList<>(); list.add(a);
list.add(repeat);
list.add(b);
list.add(repeat);
list.add(c);
list.add(repeat);
list.add(d);
list.add(repeat); Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.print(string + " ");
} System.out.println(); System.out.println(list.indexOf(repeat));
System.out.println(list.lastIndexOf(repeat));
System.out.println(list.indexOf(b));
System.out.println(list.lastIndexOf(b)); }
} 输出:
A Repeat B Repeat C Repeat D Repeat
1
7
2
2

  (3)subList(int fromIndex, int toIndex)用来截取现有List集合中的部分对象,生成新的List集合。

package list.jun.iplab;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class MethodTest_addAndset { public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E", repeat = "Repeat"; List<String> list = new LinkedList<>(); list.add(a);
list.add(repeat);
list.add(b);
list.add(repeat);
list.add(c);
list.add(repeat);
list.add(d);
list.add(repeat); Iterator<String> it = list.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.print(string + " ");
} System.out.println(); list = list.subList(1, 3); Iterator<String> it_1 = list.iterator();
while (it_1.hasNext()) {
String string = (String) it_1.next();
System.out.print(string + " ");
}
}
} 输出:
A Repeat B Repeat C Repeat D Repeat
Repeat B

  二、ArrayList类

  ArrayList类实现了List接口,由ArrayList类实现的List集合采用数组结构保存对象。

  数组结构的优点是便于对集合进行快速的随机访问,如果经常需要根据索引位置访问集合中的对象,使用由ArrayList类实现的List集合的效率较好。

  数组结构的缺点是向指定索引位置插入对象和删除指定索引位置对象的速度较慢。

package list.jun.iplab;

import java.util.ArrayList;
import java.util.List; public class ArrayListTest { public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E"; List<String> list = new ArrayList<>(); list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e); System.out.println(list.get((int) (Math.random()*5)));
}
}

  三、LinkedList类

  LinkedList(链式队列)类实现了List接口,同时还实现了Queue接口,由Linkedlist类实现的List集合采用链表结构保存对象。

  链表结构的优点是便于向集合中插入和删除对象,如果经常需要向集合中插入对象,或者从集合中删除对象,使用由LinkedList类实现的List集合的效率较高。

  链表结构的缺点是随机访问对象的速度较慢,如果经常需要随机访问集合中的对象,使用由LinkedList类实现的List集合的效率则较低。

  1.常用方法

  LinkedList类还根据采用链表结构保存对象的特点,提供了几个专有的操作集合的方法。

  

  2.基本使用

  在使用LinkedList类特有的操作集合的方法时,要在创建集合对象时声明对象的类型为LinkedList类型

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

  基本使用:

    public static void main(String[] args) {

        String a = "A", b = "B", c = "C", d = "D", e = "E";
String f = "F", g = "G"; LinkedList<String> list = new LinkedList<>(); list.add(a);
list.add(b);
list.add(c);
list.add(d);
list.add(e); Iterator<String> it = list.iterator(); // 打印 A B C D E
while (it.hasNext()) {
String string = (String) it.next();
System.out.print(string + " ");
} System.out.println(); System.out.println(list.getFirst()); // 打印A
list.addFirst(e);
System.out.println(list.getFirst()); // 打印E
list.removeFirst();
System.out.println(list.getFirst()); // 打印F

  

  3.使用迭代器删除LinkedList集合中间的元素

  例如:链式队列中原有元素A B C D E F,使用迭代器删除第2个元素的操作是:

        Iterator<String> it_2 = list.iterator();
String first = it_2.next();
System.out.println(first);      // 打印:A
String second = it_2.next();
System.out.println(second);    // 打印:B
it_2.remove(); Iterator<String> it_3 = list.iterator();
while (it_3.hasNext()) {            // 打印:A C D E F
String string = (String) it_3.next();
System.out.print(string + " ");
}

  4.在链表队列的中间位置添加元素

  链表队列是一个有序集合,每个对象的位置十分重要。LinkedList类中的add方法(包括addFirst和AddLast)将对象添加到链表的尾部。但是,常常需要将元素添加到链表的中间。

  由于迭代器是描述集合中位置的,因此这种依赖于位置的add方法将由迭代器负责。

  只有对自然有序的集合使用迭代器的add方法添加元素才有实际意义,而无需的集合(例如:Set)就没有add方法。

  例如,执行add方法后,将新添加的元素添加到链表的尾部。

        list.add(f);
Iterator<String> it_1 = list.iterator();
while (it_1.hasNext()) {          // 打印结果:A B C D E F
String string = (String) it_1.next();
System.out.print(string + " ");
}

  回顾一下集合框架中的接口:四大类接口Collection、Map、Iterator和RandomAccess。

  其中,ListIterator接口是Iterator接口的子接口,其中也包含add方法。

  使用LinkedList类的listIterator方法返回一个实现了ListIterator接口的迭代器对象:

ListIterator<String> lIt = list.listIterator();

  使用ListIterator的add方法在迭代器位置之前添加一个新对象:原有元素为(A C D E F)

        ListIterator<String> lIt = list.listIterator();
lIt.next();      // 越过第一个元素
lIt.add(g); // 在第二个元素之前插入g Iterator<String> it_4 = list.iterator();
while (it_4.hasNext()) {                    // 打印:A G C D E F
String string = (String) it_4.next();
System.out.print(string + " ");
}

Java基础(二十一)集合(3)List集合的更多相关文章

  1. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  2. Bootstrap <基础二十一>徽章(Badges)

    Bootstrap 徽章(Badges).徽章与标签相似,主要的区别在于徽章的边角更加圆滑. 徽章(Badges)主要用于突出显示新的或未读的项.如需使用徽章,只需要把 <span class= ...

  3. Java面试题总结之Java基础(二)

    Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...

  4. Java入土--Java基础(二)

    Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...

  5. Java基础学习笔记(六) - 数据结构和集合

    一.认识数据结构 1.数据结构有什么用? 合理的使用数据结构,可以更方便的查找存储数据. 2.常见的数据结构 数据存储常用结构有:栈.队列.数组.链表和红黑树. 栈:堆栈(stack),它是运算受限的 ...

  6. java基础(7):自定义类、ArrayList集合

    1. 引用数据类型(类) 1.1 引用数据类型分类 提到引用数据类型(类),其实我们对它并不陌生,如使用过的Scanner类.Random类. 我们可以把类的类型为两种: 第一种,Java为我们提供好 ...

  7. Java基础(二) 基本类型数据类型、包装类及自动拆装箱

    我们知道基本数据类型包括byte, short, int, long, float, double, char, boolean,对应的包装类分别是Byte, Short, Integer, Long ...

  8. [ 转载 ] Java基础二

    前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...

  9. java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  10. 夯实Java基础(十一)——内部类

    1.内部类的概念 内部类顾名思义:将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类.对于很多Java初学者来说,内部类学起来真的是一头雾水,根本理解不清楚是个什么东西,包括我自己(我太菜 ...

随机推荐

  1. java算法基础范例

    题目1:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?  1.程序分析: 兔子的规律为数列1,1,2,3 ...

  2. JAVA线程通信之生产者与消费者

    package cn.test.hf.test3; import java.util.concurrent.locks.Condition;import java.util.concurrent.lo ...

  3. SharePoint 2013 Sandbox Solution

    昨天在写SharePoint EventReceiver的时候遇到一个问题,创建了一个local farm SharePoint solution,添加了一个ItemAdded(SPItemEvent ...

  4. SLES15SP1 AutoYast - PXE 技术

    由于最近在做几个Ceph项目,基本都是50个节点起,那我们在项目中经常使用PXE技术来实现系统自动化安装,提高效率,可能有会说PXE技术太老了没什么好了解,但我觉得的很实用,尤其在项目型工程中,通过P ...

  5. P3515 [POI2011]Lightning Conductor

    首先进行一步转化 $a_j \leq a_i + q - sqrt(abs(i - j))$ $a_i + q \geq a_j + sqrt(abs(i-j))$ 即 $q = max (a_j + ...

  6. .Net Core自动化部署系列(二):使用Jenkins打造镜像发布流水线

    一.简介 之前写过一篇关于Jenkins搭配GitLab实现.net core项目自动发布到IIS的博文,比较简单哈,只是个Demo.本篇我们将会使用Jenkins搭配GitLab实现镜像的自动打包和 ...

  7. 使用.Htaccess文件实现301重定向常用的七种方法

    使用.Htaccess文件实现301重定向常用的七种方法   301重定向对广大站长来说并不陌生,从网站建设到目录优化,避免不了对网站目录进行更改,在这种情况下用户的收藏夹里面和搜索引擎里面可能保存的 ...

  8. 一文彻底理解Redis序列化协议,你也可以编写Redis客户端

    前提 最近学习Netty的时候想做一个基于Redis服务协议的编码解码模块,过程中顺便阅读了Redis服务序列化协议RESP,结合自己的理解对文档进行了翻译并且简单实现了RESP基于Java语言的解析 ...

  9. MongoDB 学习笔记之 DBRef

    DBRef: MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).内嵌比较好理解,就是字段内容是个数组,数组内再包含文档,而我们今天介绍的是另一种,称为链接DBRef.由 ...

  10. (八十四)c#Winform自定义控件-导航菜单(类Office菜单)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...