List

来源:互联网 发布:淘宝上奇怪的东西 编辑:程序博客网 时间:2024/05/23 01:51
List是一个集合接口   (有序  可重复  可以多个null)
ToArray( )可以将list转换成数组

Arrays.asList(数组名)可以装换成list


List类是以对象加入(add)容器的顺序来排列它们,如果您的对象加入之后大都是为了取出,而不会常作移除或插入(Insert)的动作,则使用ArrayList,如果您会经常从容器中作移除或插入对象的动作,则使用LinkedList会获得较好的效能。


dd(int index, Object obj)方法和set(int index, Object obj)方法的区别
在使用List集合时需要注意区分add(int index, Object obj)方法和set(int index, Object obj)方法,前者是向指定索引位置添加对象,而后者是修改指定索引位置的对象


indexOf(Object obj)方法和lastIndexOf(Object obj)方法的区别
在使用List集合时需要注意区分indexOf(Object obj)方法和lastIndexOf(Object obj)方法,前者是获得指定对象的最小的索引位置,而后者是获得指定对象的最大的索引位置,前提条件是指定的对象在List集合中具有重复的对象,否则如果在List集合中有且仅有一个指定的对象,则通过这两个方法获得的索引位置是相同的


subList(int fromIndex, int toIndex)方法
在使用subList(int fromIndex, int toIndex)方法截取现有List集合中的部分对象生成新的List集合时,需要注意的是,新生成的集合中包含起始索引位置代表的对象,但是不包含终止索引位置代表的对象

List list = new List();是错误的,因为List是一个接口,不是一个类
List list=new ArrayList();这样是对的,但是这个声明的是List集合,ArrayList()独有的方法和属性,List不能调用和访问
ArrayList arrayList=new ArrayList();这样则保留了ArrayList的所有属性。

List接口主要实现类包括:
ArrayList() : 代表长度可以改变得数组。可以对元素进行随机的访问,向ArrayList()中插入与删除元素的速度慢。 
LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。 


List下有ArrayList  和LinkedList

ArrayList
ArrayList类实现了List接口,List接口是Collection接口的子接口,主要增加了根据索引取得对象的方法。
ArrayList使用数组实现List接口,所以对于快速的随机取得对象来说,使用ArrayList可以得到较好的效能,不过在移除对象或插入对象时,ArrayList就比较慢(使用 LinkedList 在这方面就好的多)
ArrayList其实就是一个长度可变的数组
add( index , num)在指定的下标添加元素
add(num) 在最后面添加元素
boolean contains(Object o)如果此列表中包含指定的元素,则返回 true。
这个要判断的元素要与集合中的元素完全相同才返回true     假如集合里一个元素是(李白)不能拿(李)或者(白)去比较,要用(李白)去比较
isEmpty()判断是否为空   与==null 有所不同       
isEmpty( )判断这个集合里是否存在元素  ==null是判断这个集合是否存在   
就好像一杯水isEmpty是判断杯子里是否有水,而==null是判断有没有这个杯子    List例子中有实例 


操作集合查询时ArrayList效率比LinkedList快 



LinkedList(Last最后的意思)
LinkedList实现了List接口,并增加了一些移除与插入对象的特定方法,像是addFirst()、addLast()、 getFirst()、getLast()、removeFirst( )、removeLast()等等,由于在插入与移除时有较好的效能,适合拿来实作堆栈(Stack)与队列(Queue)。
添加或者删除元素时LinkedList比ArrayList效率快

LinkedList特有方法:
addFirst();在头部添加元素      addLast();在尾部添加元素
getFirst(); getLast(); 获取元素但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();   removeLast(); 获取元素但是删除元素。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法
offerFirst(); offerLast();
peekFirst(); peekLast(); 获取元素,但是元素不被删除。如果集合中没有元素,会返回null 
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null


Vector
也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
ArrayList和Vector区别如下:
             1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
             2. Vector提供indexOf(obj, start)接口,ArrayList没有。
             3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
             4. Vector支持同步,ArrayList和LinkedList不支持同步



实际上有两种List:一种是基本的ArrayList,其优点在于随机访问元素,另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。

List:次序是List最重要的特点:它保证维护元素特定的顺序。List为Collection添加了许多方法,使得能够向List中间插入与移除元素(这只推荐LinkedList使用。)一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元 素。 

ArrayList:由数组实现的List。允许对元素进行快速随机访问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历 ArrayList,而不是用来插入和移除元素。因为那比LinkedList开销要大很多。 

LinkedList :对顺序访问进行了优化,向List中间插入与删除的开销并不大。随机访问则相对较慢。(使用ArrayList代替。)还具有下列方 法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 这些方法 (没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。



Java中有一个Arrays类,专门用来操作array。
arrays中拥有一组static函数,
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
System.arraycopy():array的复制。


List<String> list = (List<String>) Arrays.asList(suffixArray);这个方法是将数组转换成list集合,
Collections.sort(list); 将list进行排序,顺序按照字母的大小排序,升序


List转数组public static void testArrayList() {List<String> list = new ArrayList<String>();list.add("王利虎");list.add("张三");list.add("李四");int size = list.size();String[] array = (String[]) list.toArray(new String[size]);for (int i = 0; i < array.length; i++) {System.out.println(array[i]);  //王利虎  张三    李四}}数组装换成Listpublic static void testArrayList2() {String [] str=new String [3];str[0]="王利虎";str[1]="张三";str[2]="李四";List<String> array=Arrays.asList(str);for (int i = 0; i < array.size(); i++) {System.out.println(array.get(i));  //王利虎  张三    李四}}判断某一个元素是否存在该集合public static void testArrayList2() {String [] str=new String [3];str[0]="王利虎";str[1]="张三";str[2]="李四";List<String> array=Arrays.asList(str);if(array.contains("李四")){System.out.println("aaaa");return;}System.out.println("bbbb"); //aaaa}==null和isEmpty的区别public static void test(){List<String> list = new ArrayList<String>();if(list==null){System.out.println("list==null");}else if(list.isEmpty()){System.out.println("list不等於null,里面沒有東西");}}   //list不等於null,里面沒有東西//删除两个list中的重复数据public static void main(String[] args) {List<Integer> list1 = new ArrayList<Integer>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);List<Integer> list2 = new ArrayList<Integer>();list2.add(1);list2.add(2);list2.add(3);list1.removeAll(list2);for (int i = 0; i < list1.size(); i++) {System.out.println(list1.get(i));}//结果  4  5}//获取两个list中的重复数据public static void main(String[] args) {List<Integer> list1 = new ArrayList<Integer>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);List<Integer> list2 = new ArrayList<Integer>();list2.add(1);list2.add(2);list2.add(3);list1.retainAll(list2);for (int i = 0; i < list1.size(); i++) {System.out.println(list1.get(i));}//结果  1 2 3}