List接口的常用方法以及ArrayList/LinkedList源码分析
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源码分析相关推荐
- LinkedList 源码分析
前言 上篇文章分析了 ArrayList 的源码,面试过程中经常会被面试官来问 LinkedList 和 ArrayList 的区别,这篇文章从源码的角度来看下 LinkedList 以后,再和上篇文 ...
- java linkedlist源码_Java集合之LinkedList源码分析
一.LinkedList简介 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的. ps:这里有一个问题,就是关于实现LinkedList的数据结构是否 ...
- ArrayList底层源码分析
声明:本文为作者原创,请勿装载,如过转载,请注明转载地址 文章目录 ArrayList底层源码分析 1. 继承Serializable接口 2. 继承Cloneable接口 2.1 浅拷贝 2.2 深 ...
- 数组、链表、LinkedList源码分析、跳表
一.数组 1.什么是数组 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据 线性表:数据排成像一条线一样的结构.每个线性表上的数据最多只有前和后两个方向.其实除了数组,链 ...
- Java -- 基于JDK1.8的LinkedList源码分析
1,上周末我们一起分析了ArrayList的源码并进行了一些总结,因为最近在看Collection这一块的东西,下面的图也是大致的总结了Collection里面重要的接口和类,如果没有意外的话后面基本 ...
- LinkedList 源码分析(JDK 1.8)
1.概述 LinkedList 是 Java 集合框架中一个重要的实现,其底层采用的双向链表结构.和 ArrayList 一样,LinkedList 也支持空值和重复值.由于 LinkedList 基 ...
- Java集合篇:LinkedList源码分析
(注:本文内容基于JDK1.6) 一.概述: LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口 ...
- 面试必会之LinkedList源码分析
作者:Java知音-微笑面对生活 概述 LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的,是线程不安全的,允许元素为null的双向链表. 源码分析 1 ...
- Java类集框架 —— LinkedList源码分析
在JDK1.7之前,LinkedList是采用双向环形链表来实现的,在1.7及之后,Oracle将LinkedList做了优化,将环形链表改成了线性链表.本文对于LinkedList的源码分析基于JD ...
最新文章
- matlab小波分析工具箱原理与应用_补充:频域特征值提取的MATLAB代码实现(小波分析)...
- Linux-sed文本处理流编辑器
- 算法题目——最长连续序列
- cron 12点执行_【技术指南】Crontab调度重复执行的任务
- Xilinx PLL IP核功能仿真
- python 批量查询网页导出结果_李亚涛:python批量查询网页收录情况并计算收录率...
- 只十分钟,唾手可得的工作机会就被我搞砸了!
- SharePoint2010探索日志
- 企业架构 | TOGAF内容框架
- css3图片上下浮动动画
- GMM-HMM 详解
- Ubuntu安装搜 狗输入法,最完整的步骤
- 英语语法形容词的顺序
- 小技巧:更改链接参数 提高京东秒杀成功率
- [思维][模拟]Scholomance Academy 第45届icpc区域赛沈阳站K
- 销售团队管理规章制度
- 安卓辅助功能获取控件id
- (入门、全面、通用)树莓派Raspbian系统安装配置,篇一
- 苹果xsmax怎么开机_苹果XSMAX进水不开机苹果售后维修
- sqoop -D 指定资源池( mapred.job.queue.name=root.myqueue)或者( mapred.job.queuename=root.myqueue)
热门文章
- 计算机网络之传输层:6、TCP流量控制、滑动窗口协议
- 【线性代数本质】4:矩阵乘法本质
- (计算机组成原理)第三章存储系统-第六节4:Cache的写策略(写回法和全写法,写分配法和非写分配法)
- (计算机组成原理)第三章存储系统-第五节1:双端口RAM和多模块存储器
- 【README】回溯算法基本框架
- dump 分析模式之 INCORRECT STACK TRACE
- opencv调试利器ImageWatch的安装使用
- lsof用法,查看端口对应的进程,运维(netstat不能用)
- golang:Linux下安装go环境
- jqgrid下treegrid排序问题