学习目标

掌握List接口与Collection接口的关系。
掌握List接口的常用子类:ArrayList、Vector。
掌握ArrayList与Vector类的区别。
 
 Collection下分为很多的子接口,其中有一个List接口,List接口中可以存放任意的数据。而且在List接口中内容是允许重复的。
 List接口的功能要比Collection接口强大很多,因为大量扩充了Collection接口的操作。

List接口的扩展方法

1、public void add(int index,E element)普通  在指定的位置增加元素。
2、public boolean addAll(int index, Collection<? extends E> c)  普通 在指定的位置增加一组元素。
3、E get(int index) 普通 返回指定位置的元素。
4、public int indexOf(Object o) 普通 查找指定元素的位置。
5、public int lastIndexOf(Object o) 普通 从后向前查找指定元素的位置。
6、public ListIterator<E> listIterator()普通 为ListIterator接口实例化。
7、public E remove(int index) 普通 按指定的位置删除元素。
8、public List<E> subList(int fromIndex, int toIndex) 普通 取出集合中的子集合。
9、public E set(int index, E element)普通 替换指定位置的元素。

List接口的常用子类——ArrayList

ArrayList是List子类,可以直接通过对象的多态性,为List接口实例化。
此类的定义如下:
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess, Cloneable, Serializable
AbstractList类的定义如下:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
 
如果要想使用接口,则肯定要使用对象的多态性进行实例化操作,那么对于List接口本身也是一样的。
ArrayList是List中最常用的子类。
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. import java.util.Collection ;
  4. public class ArrayListDemo01{
  5. public static void main(String args[]){
  6. List<String> allList = null ;
  7. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  8. allList.add("Hello") ;  // 此方法由Collection接口而来
  9. allList.add("World") ;  // 默认情况下是向后加入
  10. System.out.println(allList) ;
  11. }
  12. };

在指定的位置添加,添加的方法是List接口自己扩充的方法。
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. import java.util.Collection ;
  4. public class ArrayListDemo01{
  5. public static void main(String args[]){
  6. List<String> allList = null ;
  7. Collection<String> allCollection = null ;
  8. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  9. allCollection = new ArrayList<String>() ; // 指定一个集合
  10. allList.add("Hello") ;  // 此方法由Collection接口而来
  11. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  12. System.out.println(allList) ;
  13. allCollection.add("LIUXUN") ;   // 向Collection中加入内容
  14. allCollection.add("1993") ;
  15. allList.addAll(allCollection) ;
  16. System.out.println(allList) ;
  17. }
  18. };

注意:在指定的位置增加一个元素并不会替换原来的元素 而是后移。

在指定的位置上增加一组元素。
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. import java.util.Collection ;
  4. public class ArrayListDemo01{
  5. public static void main(String args[]){
  6. List<String> allList = null ;
  7. Collection<String> allCollection = null ;
  8. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  9. allCollection = new ArrayList<String>() ; // 指定一个集合
  10. allList.add("Hello") ;  // 此方法由Collection接口而来
  11. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  12. System.out.println(allList) ;
  13. allCollection.add("LIUXUN") ;   // 向Collection中加入内容
  14. allCollection.add("1993") ;
  15. allList.addAll(allCollection) ;
  16. allList.addAll(0,allCollection) ;
  17. System.out.println(allList) ;
  18. }
  19. };

既然可以增加数据,那么就可以删除数据。
   List中存在两种删除:根据对象内容、根据对象的编号。
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. public class ArrayListDemo02{
  4. public static void main(String args[]){
  5. List<String> allList = null ;
  6. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  7. allList.add("Hello") ;  // 此方法由Collection接口而来
  8. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  9. allList.add("liuxun") ; // 向Collection中加入内容
  10. allList.add("1993") ;
  11. allList.remove(0) ; // 删除第一个元素,指定删除的位置
  12. allList.remove("Hello") ;   // 此方法由Collection接口继承而来
  13. System.out.println(allList) ;
  14. }
  15. };


集合中的内容可以添加,可以删除,那么实际上最重要的就是输出。

在List接口中提供了get()方法,利用此方法就可以完成输出。
 
通过循环完成,循环的次数由size()方法取得。
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. public class ArrayListDemo03{
  4. public static void main(String args[]){
  5. List<String> allList = null ;
  6. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  7. allList.add("Hello") ;  // 此方法由Collection接口而来
  8. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  9. allList.add("liuXun") ; // 向Collection中加入内容
  10. allList.add("1993") ;
  11. System.out.print("由前向后输出:") ;
  12. for(int i=0;i<allList.size();i++){
  13. System.out.print(allList.get(i) + "、") ;
  14. }
  15. System.out.print("\n由后向前输出:") ;
  16. for(int i=allList.size()-1;i>=0;i--){
  17. System.out.print(allList.get(i) + "、") ;
  18. }
  19. }
  20. };


此种输出方式是List接口所独有的,而其他接口没有的,尤其是Collection中是没有根据索引取出内容的操作。

 
 
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. public class ArrayListDemo04{
  4. public static void main(String args[]){
  5. List<String> allList = null ;
  6. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  7. allList.add("Hello") ;  // 此方法由Collection接口而来
  8. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  9. allList.add("liuxun") ; // 向Collection中加入内容
  10. allList.add("1993728") ;
  11. String str[] = allList.toArray(new String[]{}) ;    // 指定好类型
  12. System.out.print("指定数组类型:") ;
  13. for(int i=0;i<str.length;i++){
  14. System.out.print(str[i] + "、") ;
  15. }
  16. System.out.print("\n返回对象数组:") ;
  17. Object obj [] = allList.toArray() ; // 返回Object类型
  18. for(int i=0;i<obj.length;i++){
  19. String temp = (String)obj[i] ;  // 进行向下转型
  20. System.out.print(temp + "、") ;
  21. }
  22. }
  23. };

既然已经完成基本的输出功能,集合中还有以下几个操作:
  判断集合是否为空:boolean isEmpty()
  截取部分集合:List<E> subList(int fromIndex, int toIndex) 由List接口扩充。
  查找指定的对象是否存在:int indexOf(Object o) 如果查找到则返回位置,否则返回-1.
  查找是否存在:boolean contains(Object o)
  1. import java.util.ArrayList ;
  2. import java.util.List ;
  3. public class ArrayListDemo05{
  4. public static void main(String args[]){
  5. List<String> allList = null ;
  6. allList = new ArrayList<String>() ;   // 指定操作的泛型为String
  7. System.out.println("集合操作前是否为空?" + allList.isEmpty()) ;
  8. allList.add("Hello") ;  // 此方法由Collection接口而来
  9. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  10. allList.add("liuxun") ; // 向Collection中加入内容
  11. allList.add("1993728") ;
  12. System.out.println(allList.contains("Hello")?"\"Hello\"字符串存在!" : "\"Hello\"字符串不存在!") ;
  13. List<String> allSub = allList.subList(1,3) ;  // 字符串截取
  14. System.out.println("集合截取:") ;
  15. for(int i=0;i<allSub.size();i++){
  16. System.out.print(allSub.get(i) + "、") ;
  17. }
  18. System.out.println("\nliuxun字符串的位置:" + allList.indexOf("liuxun")) ;
  19. System.out.println("集合操作后是否为空?" + allList.isEmpty()) ;
  20. }
  21. };


以上的操作都是由ArrayList子类完成的。

挽救的子类:Vector

在List集合接口中还有一个子类:Vector,Vector类属于一个挽救的子类,从整个JAVA的集合发展史上看,Vector算是一个元老级的类,在JDK1.0的时候就已经存在此类。但是到了JAVA2(JDK1.2)之后重点强调了集合框架的概念,所以先后定义了很多的新接口(如:List等),但是考虑到一大部分的人已经习惯了使用Vector类,所以JAVA设计者,就让Vector类多实现了一个List接口,这才将其保留下来。但是因为其是List子类,所以Vector类的使用与之前没有太大区别。
Vector类的定义:
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serialzable
但是,虽然Vector类是旧的类,但是因为让其实现了List的接口,所以对于程序来讲是一样的。
  1. import java.util.Vector ;
  2. import java.util.List ;
  3. public class VectorDemo01{
  4. public static void main(String args[]){
  5. List<String> allList = null ;
  6. allList = new Vector<String>() ;  // 指定操作的泛型为String
  7. allList.add("Hello") ;  // 此方法由Collection接口而来
  8. allList.add("Hello") ;  // 此方法由Collection接口而来
  9. allList.add(0,"World") ;    // 在第一个位置上添加新的内容
  10. allList.add("liuxun") ; // 向Collection中加入内容
  11. allList.add("1993728") ;
  12. for(int i=0;i<allList.size();i++){
  13. System.out.print(allList.get(i) + "、") ;
  14. }
  15. }
  16. };


因为Vector类本身属于旧的类,所以在类中也提供了很多重复的方法。

   增加元素:public void addElement(E obj) 此方法是最早的增加元素的操作,之后此方法的功能与add()方法是一致的。
  1. import java.util.Vector ;
  2. import java.util.List ;
  3. public class VectorDemo02{
  4. public static void main(String args[]){
  5. Vector<String> allList = null ;
  6. allList = new Vector<String>() ;  // 指定操作的泛型为String
  7. allList.addElement("Hello") ;   // 此方法由Collection接口而来
  8. allList.addElement("liuxun") ;  // 向Collection中加入内容
  9. allList.addElement("1993728") ;
  10. for(int i=0;i<allList.size();i++){
  11. System.out.print(allList.get(i) + "、") ;
  12. }
  13. }
  14. };

子类的差异:ArrayList与Vector的区别

1、从推出时间上看:ArrayList是JDK1.2之后推出的,属于新的操作类。Vector是JDK1.0推出的,属于旧的操作类。
2、性能上比较:ArrayList采用异步的处理方式,性能更高。Vector采用同步的处理方式,性能较低。
3、线程安全:ArrayList属于非线程安全的操作类,Vector属于线程安全的操作类。
4、输出:ArrayList只能使用Iterator、foreach输出,Vector可以使用Iterator、foreach、Enumeration输出。
 
总结:
1、List中允许有重复元素。
2、ArrayList和Vector类的区别。

Java类集框架——List接口的更多相关文章

  1. java:类集框架conllection接口list,set

    类集中提供了以下几种接口: 1.单值操作接口:conllection,List,Set list和set是conllection接口的子接口 2.一对值的操作接口:Map 3.排序的操作接口:Sort ...

  2. 浅谈java类集框架和数据结构(1)

    在另外一篇博客我简单介绍了java类集框架相关代码和理论. 这一篇博客我主要分析一下各个类集框架的原理以及源码分析. 一:先谈谈LinkedList 这是LinkedList源码的开头,我们能看到几点 ...

  3. 专题笔记--Java 类集框架

    Java 类集框架 1. Java类集框架产生的原因 在基础的应用中,我们可以通过数组来保存一组对象或者基本数据,但数组的大小是不可更改的,因此出于灵活性的考虑和对空间价值的担忧,我们可以使用链表来实 ...

  4. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  5. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  6. java类集框架(ArrayList,LinkedList,Vector区别)

    主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...

  7. java类集框架图(google找的,备个份)

  8. Java -- Java 类集 -- 目录

    13.1 认识类集 13.1.1 基本概念 13.1.2 类集框架主要接口 13.2 Collection接口 13.2.1 Collection接口的定义 13.2.2 Collection子接口的 ...

  9. java:类集框架

    类集框架:jdk提供的一系列类和接口,位于java.util包当中,主要用于存储和管理对象,主要分为三大类:集合.列表和映射. 集合Set:用于存储一系列对象的集合.无序.不允许重复元素. 列表Lis ...

随机推荐

  1. 【转】【Java/Android】Toast使用方法大全

    Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示.Toast 最常 ...

  2. 【转】MFC 对话框Border属性设置(None、Thin、Resizing、Dialog Frame)

    对话框的Border属性对应的值设置 Dialog Frame WS_CAPTION | WS_POPUP | WS_SYSMENU | WS_CLIPSIBLINGS | DS_MODALFRAME ...

  3. android hardware.c 源码分析

    android的jni通过ID来找hal模块,使用了hw_get_module()函数,本文就通过这个函数的来分析一下hal层的模块是如何匹配的. 首先要了解三个结构体hw_module_t,hw_m ...

  4. 在PADS中,大面积覆铜有3个重要概念

  5. Python中tab键自动补全功能的配置

    新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...

  6. 蔡勒(Zeller)公式

    来源好搜百科:http://baike.haosou.com/doc/1048888-1109421.html 蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星 ...

  7. 【Java NIO的深入研究2】RandomAccessFile的使用

    RandomAccessFile RandomAccessFile是用来访问那些保存数据记录的文件的,你就可以用seek( )方法来访问记录,并进行读写了.这些记录的大小不必相同:但是其大小和位置必须 ...

  8. zookper3.4.6集群配置

    参考链接: http://blog.csdn.net/shirdrn/article/details/7183503 个人感觉zookeeper 安装在单机上无操作意义,所以直接记录集群配置过程. 连 ...

  9. [转]lsof详解

    lsof是一个功能强大的诊断工具,它可以通过进程与打开的文件进行联系,可以列出一个进程打开的所有文件信息. 1 寻找与打开的文件相关联的进程通过指定文件,可以发现正在使用这个文件的进程# lsof / ...

  10. _mysql_exceptions.ProgrammingError:(2014, "commands out of sync; you can't run this command now")

    今天,测试dashboard上的一些graph, 发现,当多个graph同时向后台请求数据(异步)的时候, 出现了上述错误.而且,三个bug交替出现,另外两个bug分别是:python stop re ...