1.List接口的常用方法

ArrayList list = new ArrayList();list.add(123);list.add(456);list.add("AA");list.add(new Person("Tom",12));System.out.println(list);//[123, 456, AA, Person{name='Tom', age=12}]

增:add(int index, object ele): 在index位置插入ele元素;

  //void add(int index, object ele): 在index位置插入ele元素list.add(1,"BB");System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}]

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

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

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

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

查:get(int index): 获取指定index位置的元素;

//object get(int index): 获取指定index位置的元素System.out.println(list.get(1));//BB

插:add(int index, Object ele);
长度:size()
遍历:①Iterator迭代器方式;
②增强for循环;
③普通for循环(有索引);

     //方式一: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));}

2.ArrayList源码分析:
2.1 jdk7情况:==》类似饿汉式
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);

2.2 jdk8中ArrayList的变化 ==》类似懒汉式
ArrayList list = new ArrayList(); //底层Object[] elementData初始化为{},并没有创建长度为10的数组
List.add(123); //第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData数组中。
…后续的添加和扩容操作与jdk7同。

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

3.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倍。

List接口的常用方法以及ArrayList/LinkedList源码分析相关推荐

  1. LinkedList 源码分析

    前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...

  2. java linkedlist源码_Java集合之LinkedList源码分析

    一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...

  3. ArrayList底层源码分析

    声明:本文为作者原创,请勿装载,如过转载,请注明转载地址 文章目录 ArrayList底层源码分析 1. 继承Serializable接口 2. 继承Cloneable接口 2.1 浅拷贝 2.2 深 ...

  4. 数组、链表、LinkedList源码分析、跳表

    一.数组 1.什么是数组 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据 线性表:数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链 ...

  5. Java -- 基于JDK1.8的LinkedList源码分析

    1,上周末我们一起分析了ArrayList的源码并进行了一些总结,因为最近在看Collection这一块的东西,下面的图也是大致的总结了Collection里面重要的接口和类,如果没有意外的话后面基本 ...

  6. LinkedList 源码分析(JDK 1.8)

    1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...

  7. Java集合篇:LinkedList源码分析

    (注:本文内容基于JDK1.6) 一.概述: LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口 ...

  8. 面试必会之LinkedList源码分析

    作者:Java知音-微笑面对生活 概述 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的,是线程不安全的,允许元素为null的双向链表. 源码分析 1 ...

  9. Java类集框架 —— LinkedList源码分析

    在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...

最新文章

  1. matlab小波分析工具箱原理与应用_补充:频域特征值提取的MATLAB代码实现(小波分析)...
  2. Linux-sed文本处理流编辑器
  3. 算法题目——最长连续序列
  4. cron 12点执行_【技术指南】Crontab调度重复执行的任务
  5. Xilinx PLL IP核功能仿真
  6. python 批量查询网页导出结果_李亚涛:python批量查询网页收录情况并计算收录率...
  7. 只十分钟,唾手可得的工作机会就被我搞砸了!
  8. SharePoint2010探索日志
  9. 企业架构 | TOGAF内容框架
  10. css3图片上下浮动动画
  11. GMM-HMM 详解
  12. Ubuntu安装搜 狗输入法,最完整的步骤
  13. 英语语法形容词的顺序
  14. 小技巧:更改链接参数 提高京东秒杀成功率
  15. [思维][模拟]Scholomance Academy 第45届icpc区域赛沈阳站K
  16. 销售团队管理规章制度
  17. 安卓辅助功能获取控件id
  18. (入门、全面、通用)树莓派Raspbian系统安装配置,篇一
  19. 苹果xsmax怎么开机_苹果XSMAX进水不开机苹果售后维修
  20. sqoop -D 指定资源池( mapred.job.queue.name=root.myqueue)或者( mapred.job.queuename=root.myqueue)

热门文章

  1. 计算机网络之传输层:6、TCP流量控制、滑动窗口协议
  2. 【线性代数本质】4:矩阵乘法本质
  3. (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)
  4. (计算机组成原理)第三章存储系统-第五节1:双端口RAM和多模块存储器
  5. 【README】回溯算法基本框架
  6. dump 分析模式之 INCORRECT STACK TRACE
  7. opencv调试利器ImageWatch的安装使用
  8. lsof用法,查看端口对应的进程,运维(netstat不能用)
  9. golang:Linux下安装go环境
  10. jqgrid下treegrid排序问题