List实现类
List实现类:
ArrayList;
- 数组结构实现,查询快,增删慢
- JDK1.2版本,运行效率快,线程不安全
Vector:
- 数组结构实现,查询快,增删慢
- JDK1.0版本,运行效率慢,线程安全
LinkedList:
- 链表结构实现,增删快,查询慢
- 是一个双向链表
ArrayList:
使用
package com.java.leetcode.collection; import java.util.ArrayList;
import java.util.Iterator; /*
ArrayList的使用
*/
public class AList01 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
//添加
FruitBean apple = new FruitBean("苹果","红色");
FruitBean yellowPeach = new FruitBean("黄桃","黄色");
FruitBean pitaya = new FruitBean("火龙果","红色");
FruitBean snowPear = new FruitBean("雪梨","黄色");
FruitBean plum = new FruitBean("李子","青色"); arrayList.add(apple);
arrayList.add(yellowPeach);
arrayList.add(pitaya);
arrayList.add(snowPear);
arrayList.add(plum);
System.out.println("元素个数:"+arrayList.size());
System.out.println("元素内容:"+arrayList);
//删除
//arrayList.remove(apple);
//遍历
System.out.println();
System.out.print("***用迭代器遍历ArrayList***");
Iterator it = arrayList.iterator();
while (it.hasNext()){
FruitBean fruit = (FruitBean)it.next();
System.out.print(fruit);
}
//判断
System.out.println();
System.out.println();
System.out.println("苹果在arrayList中吗?"+arrayList.contains(new FruitBean("苹果","红色")));
/*
上面为false,因为是new了一个新的对象,contains方法的实现是用equals.而equals()的默认行为是比较引用。
如果想要判断的是两个对象的值是否相等,需要覆写下该对象类型的equals方法。
在FruitBean类中重写equals方法.重写后,为true
*/
//查找
System.out.println("李子的位置:"+arrayList.indexOf(new FruitBean("李子","青色")));
}
}
运行结果:

ArrayList源码分析:
默认容量:DEFAULT_CAPACITY = 10
注意:即如果没有向集合中添加任何元素时,容量为0
存放元素的数组:elementData
实际元素个数:size
无参构造器:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
ArrayList arrayList = new ArrayList();===》此时容量为0,size为0
add方法:
arrayList.add(apple);=====》 添加第一个元素.
public boolean add(E e) { //0+1
ensureCapacityInternal(size + 1); // Increments modCount!!增长容量
elementData[size++] = e; //赋值
return true;
}
//1
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);//10,1 ==>此处取10
}
//10
ensureExplicitCapacity(minCapacity);
}
//10
private void ensureExplicitCapacity(int minCapacity) {
modCount++; // overflow-conscious code
if (minCapacity - elementData.length > 0) //10-0>0
grow(minCapacity);
}
数组扩容的核心代码:
//10
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length; //0
int newCapacity = oldCapacity + (oldCapacity >> 1);/0+0
if (newCapacity - minCapacity < 0) //0 - 10 <0
newCapacity = minCapacity; //10
if (newCapacity - MAX_ARRAY_SIZE > 0) //private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; 是一个非常大的数
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
//null 10 ==>elementData 10
}
所以,添加第一个元素后,容量为10.
每次扩容大小是原来的1.5倍
Vector:
package com.java.leetcode.collection; import java.util.Enumeration;
import java.util.Vector;
/*
Vector的使用
*/
public class VList02 {
public static void main(String[] args) {
Vector vector = new Vector();
FruitBean apple = new FruitBean("苹果","红色");
FruitBean yellowPeach = new FruitBean("黄桃","黄色");
FruitBean pitaya = new FruitBean("火龙果","红色");
FruitBean snowPear = new FruitBean("雪梨","黄色");
FruitBean plum = new FruitBean("李子","青色"); vector.add(apple);
vector.add(yellowPeach);
vector.add(pitaya);
vector.add(snowPear);
vector.add(plum);
System.out.println("元素内容:"+vector);
vector.remove(0);
vector.remove(new FruitBean("火龙果","红色"));
System.out.println("删除之后:"+vector);
/*
遍历
使用枚举器,也可用for,迭代器等,这里演示枚举器
*/
System.out.println();
System.out.println("******使用枚举器遍历******");
Enumeration en = vector.elements();
while (en.hasMoreElements()){
System.out.println(en.nextElement());
}
System.out.println();
System.out.println("第一个元素:"+vector.firstElement());
System.out.println();
System.out.println("最后一个元素:"+vector.lastElement());
}
}
运行结构:

LinkedList:
package com.java.leetcode.collection; import java.util.LinkedList; /*
LinkedList的使用
存储结构:双向链表
*/
public class LList03 {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
FruitBean apple = new FruitBean("苹果","红色");
FruitBean yellowPeach = new FruitBean("黄桃","黄色");
FruitBean pitaya = new FruitBean("火龙果","红色");
FruitBean snowPear = new FruitBean("雪梨","黄色");
FruitBean plum = new FruitBean("李子","青色"); linkedList.add(apple);
linkedList.add(yellowPeach);
linkedList.add(pitaya);
linkedList.add(snowPear);
linkedList.add(plum);
System.out.println(linkedList);
//删除,遍历等都与前面一样。这里不写了。
}
}
源码分析:
LinkedList linkedList = new LinkedList();//刚创建时,链表为空。
add方法;
public boolean add(E e) {
linkLast(e);
return true;
}
void linkLast(E e) {
final Node<E> l = last; //添加第一个元素时,last为null
final Node<E> newNode = new Node<>(l, e, null); //null,e,null
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
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;
}
}
ArrayList 和 LinkedList的区别:
- ArrayList必须开辟连续空间,查询快,增删慢
- LinkedList无需开辟连续空间,查询慢,增删快
List实现类的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- C# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
随机推荐
- P1030
题面 给出一棵二叉树的中序排列与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度≤8). 输入格式 2行,均为大写字母组成的字符串,表示一棵二叉树的中序排列与后序排列. 输出格式 1 ...
- 论文解读(GMI)《Graph Representation Learning via Graphical Mutual Information Maximization》2
Paper Information 论文作者:Zhen Peng.Wenbing Huang.Minnan Luo.Q. Zheng.Yu Rong.Tingyang Xu.Junzhou Huang ...
- java面向对象思想之封装
一.什么是封装 菜鸟教程对封装的解释是"在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装.隐藏起来的方法.".简单来说就 ...
- 在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区
在JVM的新生代内存中,为什么除了Eden区,还要设置两个Survivor区? 1 为什么要有Survivor区 先不去想为什么有两个Survivor区,第一个问题是,设置Survivor区的意义在哪 ...
- 什么是Spring Cloud Bus?
spring cloud bus 将分布式的节点用轻量的消息代理连接起来,它可以用于广播配置文件的更改或者服务直接的通讯,也可用于监控. 如果修改了配置文件,发送一次请求,所有的客户端便会重新读取配置 ...
- 构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载.
- Java 中 IO 流分为几种?
按功能来分:输入流(input).输出流(output).按类型来分:字节流和字符流.字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数 ...
- linux发布常用命令
一.linux发布常用命令 //启动Tomcat sh /opt/apache-tomcat-8.5.29/bin/startup.sh //停止tomcat sh /opt/apache-tomca ...
- Swing 是线程安全的?
不是,Swing 不是线程安全的.你不能通过任何线程来更新 Swing 组件,如 JTable.JList 或 JPanel,事实上,它们只能通过 GUI 或 AWT 线程来更新. 这就是为什么 Sw ...
- 总结一下各种0.5px的线
在PC端用1px的边框线,看起来还好,但在手机端看起来就很难看了,而0.5px的分割线会有种精致的感觉.用普通写法border:solid 0.5px red;iPhone可以正常显示,android ...