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解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
随机推荐
- [happyctf]部分writeup
题目名称:sqltest所属:MISC考察点:盲注 眼力 耐心(好吧是废话) 附件下载下来 ,到手一个流量包,用wireshark打开,大致浏览了一下,抓的应该是盲注的数据流量. 这里有一个经验问题, ...
- 【Vulnhub练习】Acid
靶机信息 下载链接 https://download.vulnhub.com/acid/Acid.rar 靶机说明 Welcome to the world of Acid. Fairy tails ...
- Linux下swap(交换分区)的增删改
swap介绍 Linux 的交换分区(swap),或者叫内存置换空间(swap space),是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合.交换分区的作用是,当系统物理内存吃 ...
- PHP--腾讯云服务器上部署LNMP环境
本文参考 云服务器上部署Laravel的实例教程 腾讯云 创建 Laravel5.4 项目 阿里云服务器部署php的laravel项目,在阿里云买ECS 搭建 Linux+Nginx+Mysql+PH ...
- vue自定义指令?
除核心指令之外的指令, 使用directive进行注册. 指令自定义钩子函数: bind, inserted, update, componentUpdated, unbind
- JDBC 中如何进行事务处理?
Connection 提供了事务处理的方法,通过调用 setAutoCommit(false)可以设置 手动提交事务:当事务完成后用 commit()显式提交事务:如果在事务处理过程中 发生异常则通过 ...
- JVM调优常用参数配置
堆配置 -Xms:初始堆大小 -Xms:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值.如:为3表示年轻代和年老代比值为1:3,年轻代占 ...
- leedcode_13 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 .12 ...
- c语言中的字面量
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation). 几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数.浮点数以及字符串: 而有很多也对布尔类 ...
- 基于Node的React图片上传组件实现
写在前面 红旗不倒,誓把JavaScript进行到底!今天介绍我的开源项目 Royal 里的图片上传组件的前后端实现原理(React + Node),花了一些时间,希望对你有所帮助. 前端实现 遵循R ...