首页 > 其他分享 >Collection接口框架(List接口)

Collection接口框架(List接口)

时间:2022-12-12 00:11:51浏览次数:49  
标签:index int List ArrayList Object list Collection add 接口

Collection接口(List接口)

/*
1.List接口框架
   |----Collection接口:单列集合,用来存储一个一个的对象
           |----List接口:存储有序的、可重复的数据。---> “动态”数组,替换原有的数组
               |----ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用Object[] elementData存储
               |----LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用的是双向链表存储
               |----Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储

2. ArrayList的源码分析:
    2.1   jdk7 情况下
           ArrayList list = new ArrayList(); // 底层创建了长度是10的Object[]数组
           list.add(123); // elementDate[0] = new Integer(123);
           ...
           list.add(11); // 如果此次的添加导致底层的elementData数组容量不够,则扩容。
           默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。

           结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int capacity)

    2.2 jdk 8 中ArrayList的变化:
           ArrayList list = new ArrayList(); // 底层Object[] elementData初始化为{},
           并没有创建长度为10的数组,

           list.add(123); // 第一次调用add()时,底层才创建了长度10的数组,并将数据123添加到elementDate[0]
           ...
           后续的添加和扩容操作与jdk 7 无异。

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

3. LinkedList源码分析
   LinkedList list = new LinkedList(); 内部声明了Node类型的first和last属性,默认值为null
   list.add(123); // 将123封装到Node中,创建了Node对象。

   其中,Node定义为:↓↓↓   体现了LinkedList的双向链表的说法
   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;
        }
    }

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


    面试题:ArrayList、LinkedList、Vector三者的异同?
    同:三个类都是实现了List接口,存储数据的特点相同:存储有序的、可重复的数据
    不同:见上




5.List接口中的常用方法:见test1与test2

总结:常用方法
   增:add(Object obj)
   删:remove(int index) / remove (Object obj)
   改:set(int index,Object ele)
   查:get(int index)
   插:add(int index,Object ele)
   长度:size()
   遍历:① Iterator迭代器方式
        ② 增强for循环
        ③ 普通的循环
*/

 

@Test
   public void test3(){
       ArrayList list = new ArrayList();
       list.add(123);
       list.add(456);
       list.add("AA");

       // 方式一: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));
      }
  }
@Test
   public void test2(){
       ArrayList list = new ArrayList();
       list.add(123);
       list.add(456);
       list.add("AA");
       list.add(new Person("Tom",12));

       // int indexOf(Object obj):返回obj在当前集合中首次出现的位置。如果不存在,返回-1
       int index = list.indexOf(456); // 1
       System.out.println(index);

       // int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置。如果不存在,返回-1
       System.out.println(list.lastIndexOf("AA")); // 2

       // Object remove(int index):移除指定index位置的元素,并返回此元素
       Object obj = list.remove(0);
       System.out.println(obj); // 123
       System.out.println(list); // [456, AA, Person{name='Tom', age=12}]

       // Object set(int index,Object ele):设置指定index位置的元素为ele
       list.set(1,"CC");
       System.out.println(list); // [456, CC, Person{name='Tom', age=12}]

       // List subList(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的左闭右开区间的子集合
       List subList = list.subList(1, 3);
       System.out.println(subList); // [CC, Person{name='Tom', age=12}]
       System.out.println(list);

  }
@Test
   public void test1(){
       ArrayList list = new ArrayList();
       list.add(123);
       list.add(456);
       list.add("AA");
       list.add(new Person("Tom",12));

       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位置开始讲ele中的所有元素添加进来
       List list1 = Arrays.asList(1, 2, 3);
       list.addAll(list1);
       System.out.println(list.size()); // 8

       // Object get(int index):获取指定index位置的元素
       System.out.println(list.get(0)); // 123

  }

标签:index,int,List,ArrayList,Object,list,Collection,add,接口
From: https://www.cnblogs.com/jiaxing-java/p/16975028.html

相关文章

  • Collection接口框架(Set接口)
    Collection接口框架(Set接口)/*  |----Collection接口:单列集合,用来存储一个一个的对象        |----Set接口:存储无序的、不可重复的数据--->高中讲......
  • JavaWeb对于Listener的运用详解【利用Session统计在线人数】
    一.监听器Listener1.1Listener的作用Listener是一个功能组件,在创建、销毁或添加、修改或删除应用程序、会话和请求对象的属性时自动执行代码。监听器是servlet的监听器,......
  • java list泛型简单的几种转换
     1.List<String>转 List<integer>、List<Long>1importjava.util.ArrayList;2importjava.util.List;3importjava.util.stream.Collectors;45publi......
  • ListView的基本使用
    布局文件<ListViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/lv"/>创......
  • 【JAVA笔记】JAVA-抽象类-final-static关键字-接口用法05
    一. 抽象类1、抽象类概述案例:Animal类(父类(抽象类))packagePackage1;//父类:动物类(抽象类)publicabstractclassAnimal{//抽象方法(特点:要求子类必须重写)......
  • how to sort list according to the number/another list
    20221111Sortwithcustomfunctionusingkeylist.sort(key=len)orsorted(list,key=len)#takesecondelementforsortdeftakeSecond(elem):returnelem[1......
  • 自动生成接口文档
    自动生成接口文档目录自动生成接口文档1、安装依赖2、设置接口文档访问路径3、文档描述说明的定义位置restframework可以自动帮助生成接口文档接口文档以网页的方式呈......
  • 使用swagger生成接口文档
    1、安装goget-ugithub.com/swaggo/swag/cmd/swaggoget-ugithub.com/swaggo/gin-swaggergoget-ugithub.com/swaggo/filesgoget-ugithub.com/alecthomas/t......
  • 【ASP.NET Core】MVC控制器的各种自定义:IActionHttpMethodProvider 接口
    IActionHttpMethodProvider接口的结构很简单,实现该接口只要实现一个属性即可——HttpMethods。该属性是一个字符串序列。这啥意思呢?这个字符串序列代表的就是受支持的HT......
  • 模板链表类的扩展(QListEx<T>)
    以前写的链表都是比较简单的,插入节点是在头节点上,所以循环链表时都是从最后一个数据往前找的,给人的感觉是倒着的,今天写一个在链表尾部插入数据1。链表节点类的定义/链......