java集合框架---List接口总结(精简版)

上一篇已经总结了集合用到的所有接口(List,Set,Map),后面将对这些接口的使用做简要总结(后面集合均使用泛型)!
使用泛型的优点:比如现在把一个字符串类型的值放入到集合里面,这个值放入到集合之后,失去本身的类型,只能是object类 型,想要对这个值进行类型转换,很容易出现类型转 换错误,泛型可以解决这个问题!!!

 示例代码:
 //不使用泛型
   ArrayList list = new ArrayList();
           list.add(“abc”);
          Integer num = (Integer) list.get(0); //运行时会出错,但编译时发现不了
 因为明明放的是String类型,偏偏要转换成Integer类型,编译器认为可能是,  因为任何类的父类都是Object类型;
 //使用泛型
    ArrayList<String> arrayList = new ArrayList<String>();
         arrayList .add(“abc”);
         arrayList .get(0)//输出[abc]
  使用泛型避免了数据类型的强制转换,引发的错误;
  泛型规定使用<>尖括号,并且尖括号中只能存放引用数据变量!!!       

1.List接口(LinkedList,ArrayList(常用),Vector和Stack)
1.1.LinkedList实现类:擅长添加,删除
1.1.1.LinkedList数据结构是链表(双向链表);
1.1.2.链表数据结构的特点是每个元素分配的空间不必连续;
1.1.3.主要用于对集合元素的添加,删除操作!!!
1.1.4.可以向LinkedList集合进行添加,删除,获取,遍历元素等操作
注:LinkedList应用代码示例如下

      (1)添加示例:
            LinkedList<String> linkedList = new LinkedList<String>();
                  linkedList .add(“aaa”);//在链表尾部添加一个元素,如果成功,返回true,否则返回false
                  linkedList.addFirst("aaa");//在链表头部插入一个元素
                  linkedList.addLast("aaa");//在链表尾部插入一个元素
                  linkedList.addLastadd(0, “aaa”)//在指定位置插入一个元素(这里在下标为0除插入元素aaa)
         (2)删除实例:
            LinkedList<String> linkedList = new LinkedList<String>();
                 linkedList .remove("aaa");//从当前链表中移除指定的元素,如果成功,返回true,否则返回false
                 linkedList .remove(0);//从当前链表中移除指定位置的元素
                 linkedList . removeFirst();//从当前链表中移除第一个元素
                 linkedList . remove();//与removeFirst()作用一样
                 linkedList .  removeLast();//从当前链表中移除最后一个元素
         (3)获取实例:(不是linkedList 强行,由ArrayList实现效率更高)
             LinkedList<String> linkedList = new LinkedList<String>();
                  linkedList.get(0);//从当前链表中获取指定位置的元素(通过下标获取指定位置)
                  linkedList.getFirst();//从当前链表中获取第一个元素
                  linkedList.getLast();//从当前链表中获取最后一个元素
         (4)遍历实例:(for循环,foreach方式,迭代器)
                  代码这里不展示,只说明这三种方式的效率。
                  遍历包含10万个元素的LinkedList:foreach语句效率最高,其次是迭代器,效率最差的是for循环

1.2.ArrayList实现类:擅长查询,获取元素
1.2.1.是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长(默认初始容量为10);
1.2.2.主要用于对集合元素的序号快速获取(提供了随机访问功能)!!!
1.2.3. 实现了Cloneable接口,即覆盖了函数clone(),能被克隆;
1.2.4.实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输.
1.2.5.ArrayList中的操作不是线程安全的!(在多线程中可以选择Vector或者CopyOnWriteArrayList)
1.2.6…可以向ArrayList集合进行添加,删除,获取,遍历元素等操作
注:ArrayList应用代码示例如下
添加,删除,获取,遍历都与LinkedList方法一样。
这里遍历ArrayList时,使用for循环随机访问(即通过索引序号访问)效率最高,而使用迭代器的效率最低)
1.2.7.ArrayList可以转换为数组(2种方式)

           (1)toArray()不建议使用:  调用 toArray() 函数会抛出“java.lang.ClassCastException”异常
                                                          因为 toArray() 返回的是 Object[] 数组,将 Object[] 转换为其它类型会抛出异常
           (2)<T> T[] toArray(T[] contents):可以解决(1)中的问题 // 将ArrayList转换为数组
                             String[] arr = (String[])list.toArray(new String[0]);//使用方式2应用实例    
           (3)调用 toArray(T[] contents) 返回T[]的可以通过以下几种方式实现(3种)
                   // toArray(T[] contents)调用方式一
                   public static Integer[] vectorToArray1(ArrayList<Integer> v) {
                     Integer[] newText = new Integer[v.size()];
                         v.toArray(newText);
                          return newText;
                        }
                 // toArray(T[] contents)调用方式二。最常用!
                   public static Integer[] vectorToArray2(ArrayList<Integer> v) {
                    *Integer[] newText = (Integer[])v.toArray(new Integer[0]);*
                      return newText;
                    }
                 // toArray(T[] contents)调用方式三
               public static Integer[] vectorToArray3(ArrayList<Integer> v) {
                   Integer[] newText = new Integer[v.size()];
                   Integer[] newStrings = (Integer[])v.toArray(newText);
                     return newStrings;
                }

1.3.Vector实现类:
1.3.1. 是一个集合,和List用法差不多,不过现在已经很少用了,List已经能全部取代Vector了
1.3.2.Vector是线程安全,现在已经被CopyOnWriteArrayList替代
1.4.Stack实现类:
1.4.1.是Vector的一个子类,它实现了一个标准的后进先出的栈

扩展:CopyOnWriteArrayList:存在java.util.concurrent包中,是Java中的并发容器类
1. ArrayList和CopyOnWriteArrayList都是实现了List接口。
2. CopyOnWriteArrayList是ArrayList的线程安全操作
3. 适用于读多写少的情况(比如说缓存)
4. 内部持有一个ReentrantLock lock = new ReentrantLock();
5. 读写分离,写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
6. CopyOnWrite只能保证数据最终的一致性,不能保证数据的实时一致性

猜你喜欢

转载自blog.csdn.net/qq591009234/article/details/89309153