Collection的子接口之一:List

  • Collection接口:单列集合,用来存储一个一个的接口
    • List接口:存储有序的、可重复的数据  --->动态数组
      • ArrayList:
      • Linkedlist:
      • Vector:
    • Set接口:存储无序的、不可重复的数据 ---->高中讲的"集合"
      • HashSet:
        • LinkedHashSet:
      • TreeSet:
  • Map接口:双列集合,用来存储一对(key - value)一对的数据  --->高中函数:y=f(x)
    • HashMap: 
      • LinkedHashMap:
    • TreeMap:
    • Hashtable:
      • Properties:

Collection接口:单列集合,用来存储一个一个的对象

List接口:存储有序的,可重复的数据。 “动态”数组,替換原有的数组

Arraylist:作为ist接中的主要实现类:线程不安全的,效率高;底层使用Object[] elementData存储

Arraylist的源码分析:

jdk 7情况下:

ArrayList List = new Arraylist();//底层创建了长度是10的Object[]数组elementData

list.add(123);//elementData  [0] = new Integer(123);

list.add(11);//如果此次的添加导致底层eLementData教组容量不够,则扩容。默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。

结论:建议开发中使用带参的构进器: Arraylist List = new Arraylist(int capacity)

jdk 8中ArrayList的变化:

ArrayList list = new ArrayList();//底层Object[] elementDeta初始化为{},并没有创建 长度为10的Object数组

list.add(123);//第一次调用add()时,底层才创建了长度10的Object数组,并将数据123添加到elementData[0]

后续的添加和扩容操作与jdk 7无异

小结:jdk 7中ArrayList的创建类似于单例的饿汉式,而jdk 8中ArrayList的对象创建类似于懒汉式,延迟了数组的创建,节省内存。

Linkedlist: 对于频繁的插入、删除操作,使用此类效率EHCArraylist高; 底层使用双向链表存储

LinkedList list = new linkedList(); 内部声明了Node类型的First和Last属性,默认为null

list.add(123);将123封装到Node中,创建了Node对象。

其中Nude定义为:

private static class Node<E> {

  E item;

  Node<E> next;

  Node<E> prev;

  Node(Node<E> prev, E element, Node<E> next){

    this. item = eLement;

    this.next = next;

    this.prev = prev;

  }

}

Vector: 作为list接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

Vector的源码分析:jdk7和jdk8中通过Vector()构造器创建对象是,底层都创建了长度为10的Object数组,在扩容方面默认扩容为原来的数组长度的2倍。

面试题:ArrayList、LinkedList、Vector三者的异同?

同:三个类都是实现了List接口,存储数据的特点相同,存储有序的、可重复的数据

不同:见上

List的常用方法:

void add(int index, 0bject ele): 在index位置插入ele元素

boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来

Object get(int index): 获取指定index位置的元素int index0f(object obj): 返回bj在集合中首次出现的位置

int lostIndex0f(object obj):返回obj在当前集合中首次出现的位置

object remove(int index):移除指定index位置的元素,并返回此元素

object set(int index, object ele): 设置指定index位置的元素为ele

eleList sublist(int fromIndex, int toIndex): 返回从fromIndex到toIndex位置的子集合

 

复制代码
    static void test1(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("牛马");
        list.add(new Person("张三",50));
        list.add(456);
        System.out.println(list);
        //void add(int index,Object ele):在index位置插入ele元素
        list.add(1,"bb");
        System.out.println(list);

        //boolean addAll(int index,Collection eles):从index位置开始将eles中的所以元素添加进来
        list.addAll(3,Arrays.asList(666,"黑手"));
        System.out.println(list);
        System.out.println(list.size());
        //Object get(int index);获取指定index位置的元素
        System.out.println(list.get(5));
        //int indexOf(Object obj):返回obj在集合中首次出现的位置
        System.out.println(list.indexOf(456));
        //int lastIndexOf(Object obj):返回boj在当前集合中最后一次出现的位置
        System.out.println(list.lastIndexOf(456));
        //Object remove(int index):溢出指定位置的元素,并返回此元素
        System.out.println(list.remove(4));
        System.out.println(list);
        //Object set(int index,Object ele):设置指定index位置的元素为ele,返回值是index未更改前的元素
        System.out.println(list.set(5,"黑手"));
        System.out.println(list);
        //list sublist(int fromIndex,int toIndex):返回fromIndex到toIndex位置的左闭右开子集合
        System.out.println(list.subList(2,5));
    }
复制代码

 总结:常用方法

增:add(Object obj)

删:remove(int index)/remove(Object boj)

改:set(int index,Object ele)

查:get(int index)

插:add(int index,Object ele)

长度:size()

遍历:①:Iteratar迭代器方式

  ②:增强for循环

  ③:普通的循环

复制代码
    static void test(){
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("牛马");
        list.add(new Person("张三",50));
        list.add(456);
        //方式一:iterator迭代器
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //方式二:增强for循环
        for (Object obj : list){
            System.out.println(obj);
        }
        //方式三:普通for循环
        for (int i=0; i < list.size();i++){
            System.out.println(list.get(i));
        }
    }
复制代码

 

posted @   羽十六  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示