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实现类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  10. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

随机推荐

  1. 磁盘管理--如何在VMware上给centos7增加一块磁盘

    一. 实验环境 VMware Workstaion + Centos7 二.实验步骤 1.关闭虚拟机,添加磁盘 2.添加硬件向导 硬件类型 你要安装哪类硬件? 点击完成观察到已经成功添加磁盘 3.开启 ...

  2. C# WinForm 设置按纽为透明,使用背景色

    今天开发登陆界面时,遇到一个窗体控制设置问题: 1.将按纽设置为透明: 2.并且使用背景图片的颜色: 3.并且需要当点击这个按纽时,仍然显示背景图片颜色: 4.去掉按纽边框显示线: 需要的效果如下: ...

  3. 在线Remix链接本地文件夹

    问题 1.本地Remix环境版本滞后于在线编译器,新版本的语法在旧版本编译器中出现错误. 2.没有配置Vscode编译器,不便导入项目. 解决方案 *本解决方案基于Mac系统 创建共享文件夹 在本地创 ...

  4. 关于如何让写自然溢出hash的无辜孩子见祖宗这件事

    关于如何让写自然溢出hash的无辜孩子见祖宗这件事 来源博客 这几天考试连着好几次被卡hash卡到死. 我谔谔,为什么连hash都要卡. 码力弱鸡什么时候才能站起来. 只需要任意两种字符,比如噫呜呜噫 ...

  5. Prometheus自定义监控告警项-3

    prometheus 编写告警规则 将自定义的告警规则写到独立的文件中,prometheus.yml中引用如下: rule_files: - "rules/*.yml" [root ...

  6. win10关于后缀名无法关联相应程序默认打开方式的处理方法

    系统:win10 专业版 现象:以".chm"文件为例,每次都要重新选择一次打开方式才能打开chm文件,无法设置默认打开方式. 解决方法: 1.win+r打开运行,输入regedi ...

  7. CAS和CAP代表的作用

    CAS(自旋锁):https://www.jianshu.com/p/ab2c8fce878b CAP原则:https://baike.baidu.com/item/CAP原则/5712863?fr= ...

  8. SpringDataJpa 实体类过滤伪删除

    当需要过滤实体类的数据时,根据伪删除字段进行过滤,需要使用Hibernate提供的@Where注解 使用方式: @Entity(name = "Account") @Where( ...

  9. 描述 Java 中的重载和重写?

    重载和重写都允许你用相同的名称来实现不同的功能,但是重载是编译时活动, 而重写是运行时活动.你可以在同一个类中重载方法,但是只能在子类中重写方 法.重写必须要有继承.

  10. Goland环境配置——Goland上的第一个Go语言程序

    安装好goland后,开始编写一个简单程序测试环境是否可用. 新建项目:按File-new-project进入如图new project界面,在Go一栏内的Location里填写项目路径(D:\GOO ...