在介绍List接口之前,我们先来看看 Collection 接口,因为Collection接口是 List / Set / Queue 接口的父接口,List / Set / Queue 的实现类中很多的操作方法其实还是调用Collection类定义的方法。

一、Collection接口

在Collection接口中,定义了如下的方法:

其中方法可以分为以下几类:

数据操作类方法:add/addAll/remove/removeAll/clear/retainAll/iterator

判断类方法:contains/containsAll/equals/hashcode/isEmpty/size

所有继承 Collection 接口的集合都可以用 Collection 中的方法进行元素操作,而具体的集合类有根据其特性增加了一些其特有的方法。

1、数据操作类方法:add/addAll/remove/removeAll/clear/retainAll/iterator

Collection接口-数据操作类方法MARK

2、判断类方法:contains/containsAll/equals/hashcode/isEmpty/size

package com.chanshuyi.collection;

import java.util.ArrayList;
import java.util.Collection; /**
* Collection接口-判断类方法
* contains/containsAll/equals/hashcode/isEmpty/size
* @author Administrator
*
*/
public class CollectionTest2 { public static void main(String[] args) {
Collection<String> listCol = new ArrayList<String>();
listCol.add("1");
listCol.add("2");
listCol.add("3");
Collection<String> addCol = new ArrayList<String>();
addCol.add("4");
addCol.add("5");
addCol.add("6"); //1.是否包含 contains() //true
System.out.println("listCol是否包含1:" + listCol.contains("1"));
//2.是否包含集合中所有元素 containAlls() //false
System.out.println("listCol是否包含addCol中所有元素:" + listCol.containsAll(addCol));
//3.listCol与addCol是否相等 equals() //false
System.out.println("listCol与addCol是否相等:" + listCol.equals(addCol));
//4.listCol与addCol的哈希码是否相等 hashcode() //78481,81460
System.out.println("listCol与addCol的哈希码是否相等:" + listCol.hashCode() + "," + addCol.hashCode());
//5.listCol是否为空 isEmpty() //false
System.out.println("listCol是否为空:" + listCol.isEmpty());
//6.listCol的大小 size() //
System.out.println("listCol大小:" + listCol.size());
System.out.println("====================================="); addCol.clear();
addCol.add("1");
addCol.add("2");
addCol.add("3");
//true
System.out.println("listCol是否包含1:" + listCol.contains("1"));
//true
System.out.println("listCol是否包含addCol中所有元素:" + listCol.containsAll(addCol));
//true
System.out.println("listCol与addCol是否相等:" + listCol.equals(addCol));
//78481,78481
System.out.println("listCol与addCol的哈希码是否相等:" + listCol.hashCode() + "," + addCol.hashCode());
//false
System.out.println("listCol是否为空:" + listCol.isEmpty());
//
System.out.println("listCol大小:" + listCol.size());
System.out.println("=====================================");
}
}

Collection接口-判断类方法

二、List接口

List接口在Collection接口的基础上拓展了一些方法,增加了一些自己独有的方法,主要是增加了这样的几类方法:

1、在 add / remove / addAll 中增加了 index 参数,使其可以在任意位置插入删除

add(int index, E element) / addAll(int index, E element)

可以在特定位置插入删除元素,而不只是插入集合末尾

remove(int index)  

删除集合中特定下标的元素(removeAll() 是移除集合所有元素,暂时没有移除一个区间的元素的 API。但 ArrayList 类实现了,对应的方法是: removeRange(int fromIndex, int toIndex) )

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; public class ListTest1 { public static void main(String[] args) {
Collection<String> addCol = new ArrayList<String>();
addCol.add("4");
addCol.add("5");
addCol.add("6"); List<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("3"); //1.在特定位置插入删除元素 add(int index, E element)
strList.add(1, "2"); //在index前加而不是后
printCol(strList); //1 2 3
strList.remove(0);
printCol(strList); //2 3 //2.在特定位置插入删除集合 addAll(int index, E element)
strList.addAll(addCol);
printCol(strList); //2 3 4 5 6 //3.删除集合中特定下标的元素 remove(int index)  
strList.remove(0);
printCol(strList); //3 4 5 6 //4.获取(更新)特定位置上的元素 get(int index)
System.out.println("第一个元素:" + strList.get(0)); //第一个元素:3
strList.set(0, "1"); //5.设置特定位置元素的值 set(int index,Element e)
printCol(strList); //1 4 5 6 //获取子集合
List<String> subList = strList.subList(1, strList.size());
printCol(subList); //4 5 6 //获取特定元素下标 indexOf()
//5的下标是:2
System.out.println("5的下标是:" + strList.indexOf("5"));
//获取元素最后一次出现的下标 lastIndexOf()
//5的下标是:2
System.out.println("5的下标是:" + strList.lastIndexOf("5"));
printCol(strList); //1 4 5 6 //获取一个ListIterator对象 listIterator()
/*没有前一个值 本对象是:1
前一个对象值:1 本对象是:4
前一个对象值:4 本对象是:5
前一个对象值:5 本对象是:6*/
System.out.println("======================================");
ListIterator<String> it = strList.listIterator();
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一个对象值:" + it.previous());
it.next();
}else{
System.out.print("没有前一个值");
}
System.out.print(" 本对象是:" + it.next() + "\n");
}
System.out.println("======================================"); //获取一个ListIterator对象 listIterator(int index)
/*
* 前一个对象值:1 本对象是:4
前一个对象值:4 本对象是:5
前一个对象值:5 本对象是:6
*/
it = strList.listIterator(1); //从第一个开始迭代遍历
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一个对象值:" + it.previous());
it.next();
}else{
System.out.print("没有前一个值");
}
System.out.print(" 本对象是:" + it.next() + "\n");
}
} public static <E> void printCol(Collection<E> col){
Iterator<E> it = col.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

2、增加了获取元素以及设置元素值的方法

get(int index) / set(int index, E element)      

可以获取(设置)特定位置上的元素

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; public class ListTest2 { public static void main(String[] args) {
Collection<String> addCol = new ArrayList<String>();
addCol.add("4");
addCol.add("5");
addCol.add("6"); List<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("3"); //4.获取(更新)特定位置上的元素 get(int index)
System.out.println("第一个元素:" + strList.get(0)); //第一个元素:3
strList.set(0, "1"); //5.设置特定位置元素的值 set(int index,Element e)
printCol(strList); //1 4 5 6
}
public static <E> void printCol(Collection<E> col){
Iterator<E> it = col.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

3、其他方法

subList(int fromIndex, int toIndex)  获取子集合

indexOf(Object o) / lastIndexOf(Object o)  获取特定元素下标

listIterator() / listIterator(int index)  获取一个ListIterator对象(ListIterator对象具有比Iterator更强大的遍历集合功能。Iterator只能向后遍历,但ListIterator扩展了Iterator接口,不仅可以向后遍历也可以向前遍历)

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator; public class ListTest3 { public static void main(String[] args) {
Collection<String> addCol = new ArrayList<String>();
addCol.add("4");
addCol.add("5");
addCol.add("6"); List<String> strList = new ArrayList<String>();
strList.add("1");
strList.add("3"); //5.获取子集合
List<String> subList = strList.subList(1, strList.size());
printCol(subList); //4 5 6 //6.获取特定元素下标 indexOf()
System.out.println("5的下标是:" + strList.indexOf("5")); //2
//7.获取元素最后一次出现的下标 lastIndexOf()
System.out.println("5的下标是:" + strList.lastIndexOf("5")); //
printCol(strList); //1 4 5 6 //8.获取一个ListIterator对象 listIterator()
/*没有前一个值 本对象是:1
前一个对象值:1 本对象是:4
前一个对象值:4 本对象是:5
前一个对象值:5 本对象是:6*/
System.out.println("======================================");
ListIterator<String> it = strList.listIterator();
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一个对象值:" + it.previous());
it.next();
}else{
System.out.print("没有前一个值");
}
System.out.print(" 本对象是:" + it.next() + "\n");
}
System.out.println("======================================"); //9.获取一个ListIterator对象 listIterator(int index)
/*
* 前一个对象值:1 本对象是:4
前一个对象值:4 本对象是:5
前一个对象值:5 本对象是:6
*/
it = strList.listIterator(1); //从第一个开始迭代遍历
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一个对象值:" + it.previous());
it.next();
}else{
System.out.print("没有前一个值");
}
System.out.print(" 本对象是:" + it.next() + "\n");
}
}
public static <E> void printCol(Collection<E> col){
Iterator<E> it = col.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

 三、ArrayList实现类

在ArayList实现类中,我们通常用Collection接口提供的add/addAll/remove/removeAll/iterator方法进行数据的增删改查:

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Iterator; public class ArrayListTest1 { public static void main(String[] args) {
//增加
ArrayList<String> listCol = new ArrayList<String>();
listCol.add("1");
listCol.add("2");
listCol.add("3");
//删除
listCol.remove("1");
//修改 List接口方法
//迭代
Iterator<String> it = listCol.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

然而ArrayList实现类比起List接口,ArrayList实现类拥有了以下几个特有的方法:

clone()  复制一个集合实例

removeRange(int fromIndex, int toIndex)   移除指定范围内的元素

ensureCapacity(int minCapacity)   扩大集合大小,使其至少容纳minCpacity个元素

trimToSize()   缩小集合大小到其现在的大小

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; /**
* ArrayList 有序允许重复 非线程同步
* @author Administrator
*/
public class ArrayListTest{ public static void main(String[] args) {
//增加
ArrayList<String> nameList = new ArrayList<String>();
nameList.add("Tom");
nameList.add("Marry");
nameList.add("Henry");
nameList.add("Jensus"); //1.复制集合
@SuppressWarnings("unchecked")
ArrayList<String> copyList = (ArrayList<String>) nameList.clone();
//Tom Marry Henry Jensus
printCol(nameList);
//Tom Marry Henry Jensus
printCol(copyList); //2.扩大集合大小
nameList.ensureCapacity(8); //3.缩小集合大小
//集合大小:4
System.out.println("集合大小:" + nameList.size());
nameList.trimToSize();
//集合大小:4
System.out.println("集合大小:" + nameList.size());
} public static <E> void printCol(Collection<E> col){
Iterator<E> it = col.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

removeRange(int fromIndex, int toIndex) 方法是protected方法,只能在包内或子类中使用,因此如果要使用removeRange方法,只能用继承ArrayList类的方法构造一个类,然后用这个类去调用removeRange()方法,如:

package com.chanshuyi.collection.list;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; @SuppressWarnings("serial")
public class ArrayListTest2<E> extends ArrayList<E> { public static void main(String[] args) {
ArrayListTest2<String> list = new ArrayListTest2<String>();
list.add("1");
list.add("2");
list.add("3"); list.removeRange(1, 2);
printCol(list); //1 3
}
public static <E> void printCol(Collection<E> col){
Iterator<E> it = col.iterator();
while(it.hasNext()){
System.out.print(it.next().toString() + " ");
}
System.out.println();
}
}

四、LinkedList实现类

LinkedList同样实现了Collection和List接口,所以同样可以用这两个接口中的方法进行数据操作:

package com.chanshuyi.collection.list;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List; public class LinkedListTest { public static void main(String[] args) {
//增加
List<String> linkedList = new LinkedList<String>();
linkedList.add("one");
linkedList.add("two");
linkedList.add("three");
linkedList.add("four");
linkedList.add("five");
linkedList.add(0, "Middle"); //删除
linkedList.remove(4);
linkedList.remove("five"); //修改
linkedList.set(1, "1"); //查询
System.out.println(linkedList.get(0)); //Middle //迭代1
//Middle 1 two three
for(String numStr : linkedList){
System.out.print(numStr + " ");
}
System.out.println(); //迭代2
//Middle 1 two three
Iterator<String> it = linkedList.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
}
}

但其实LinkedList类也实现了DQueue接口,所以LinkedList也可以使用push/pop等方法进行堆栈结构的操作,但这不属于Collection和List的范围,因此我们将在Queue接口时进行介绍。

五、Vector实现类

Vector实现类与ArrayList实现类的区别就是Vector是线程安全的,而ArrayList是线程不安全的,因此Vector效率较低。因此在非多线程的情况下推荐用ArrayList,而在多线程环境下适合用Vector。

一般操作Vector时也是使用Collection接口和List接口提供的方法:

package com.chanshuyi.collection.list;

import java.util.Iterator;
import java.util.Vector; public class VectorTest { public static void main(String[] args) {
//增加 add()
Vector<String> vector = new Vector<String>();
vector.add("Tom");
vector.add("Marry");
vector.add("Jesus");
vector.add("Json"); //删除 remove()
vector.remove(0);
vector.remove("Marry"); //修改
vector.set(0, "JesusCopy"); //查询 get()
System.out.println(vector.get(0)); //迭代1
for(String name : vector){
System.out.print(name + " ");
} System.out.println(); //迭代2
Iterator<String> it = vector.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
}
}

六、Stack实现类

Stack类是Vector类的子类,因此它也可以用Collection和List接口提供的add/remove等方法。

Stack类是堆栈结构的一个模拟,实现了自己独有的进栈、出栈等方法。

package com.chanshuyi.collection.list;

import java.util.Stack;

public class StackTest {

    public static void main(String[] args) {
//入栈 push()
Stack<String> stack = new Stack<String>();
stack.push("1");
stack.push("2");
stack.push("3"); //出栈 pop()
stack.pop(); //取得栈顶元素 peek()
System.out.println(stack.peek()); //通过堆栈是否为空来迭代 isEmpty()
while(!stack.isEmpty()){
System.out.print(stack.pop() + " ");
}
}
}

2.Java集合总结系列:List接口及其实现的更多相关文章

  1. 转:深入Java集合学习系列:HashSet的实现原理

    0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

  2. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  3. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  4. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  5. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  6. Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...

  7. Java集合框架之List接口浅析

    Java集合框架之List接口浅析 一.List综述: 毫无疑问List接口位于java.util包下,继承自 Collection接口 存储元素的特点: 有序可重复(有序:即存进去是什么顺序,取出来 ...

  8. Java集合总结系列2:Collection接口

    Collection 接口是 Java 集合类的一个根接口,Java 在 Collection 接口中定义了许多通用的数据操作类方法以及判断类方法. 通过查看 API 文档或源码的方式,我们可以了解到 ...

  9. 3.Java集合总结系列:Set接口及其实现

    一.Set接口 Set 接口与 List 接口相比没有那么多操作方法,比如: 1.List 接口能直接设置或获取某个元素的值,而Set接口不能. 2.List 接口能直接在指定位置删除.增加元素,而S ...

  10. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

随机推荐

  1. ajaxFileUpload.js 无刷新上传图片,支持多个参数同时上传,支持 ie6-ie10

    /* 131108-xxj-ajaxFileUpload.js 无刷新上传图片 jquery 插件,支持 ie6-ie10 依赖:jquery-1.6.1.min.js 主方法:ajaxFileUpl ...

  2. Uip学习简介及网址

    http://www.ichanging.org/uip-stm32.html http://www.ichanging.org/share/ http://bbs.eeworld.com.cn/th ...

  3. iOS 推送问题全解答《十万个为啥吖?》

    Q 1:为啥收不到推送(1)? 如果收到推送时,App 在前台运行,那么: iOS 10 before 顶部横幅不会弹出.没有任何展示,你以为「没有收到推送」. iOS 10 after 如果没有实现 ...

  4. Android SDK教程

    Android SDK 网络问题解析 Android 客户端网络不稳定,会导致App 有时候无法及时收到 Push 消息. 很多开发者认为这是因为 JPush 推送不稳定.延迟,甚至有时候认为 JPu ...

  5. react 组件的生命周期

    组件的生命周期 过程 装载(Mounting) :组件被插入到 DOM 中: 更新(Updating) :组件重新渲染以更新 DOM: 卸载(Unmounting) :组件从 DOM 中移除. 过程 ...

  6. Ajax页面的加载数据与删除

    1.数据库找一张表: 颜色表2.主页面主页面的代码用到tbody:TBODY作用是:可以控制表格分行下载,从而提高下载速度.(网页的打开是先表格的的内容全部下载完毕后,才显示出来,分行下载可以先显示部 ...

  7. C++ protected访问权限思考

    看了云风关于protected的思考,自己也总结了下. C++的访问权限有三个 private.protected.public. 如果不包括继承的话,比较好理解,可以分为类外和类内两部分.类外不能访 ...

  8. 1602: [Usaco2008 Oct]牧场行走

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1211  Solved: 616 [Submit][ ...

  9. NSPredicate 查询/搜索

    IOS NSPredicate 查询.搜索   简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 最常用到的函数 + (NSP ...

  10. 基于Spring-WS的Restful API的集成测试

    在很多Java企业级应用中,Spring占据了非常重要的位置,这就导致了基本上的技术选型都是围绕着Spring来, 比方说笔者最近的项目需要开发一个Restful的API接口,选型的时候就说,客户架构 ...