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. python练习册 每天一个小程序 第0001题

    1 # -*-coding:utf-8-*- 2 __author__ = 'Deen' 3 ''' 4 题目描述: 5 做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生 ...

  2. bzoj4241/AT1219 历史研究(回滚莫队)

    bzoj4241/AT1219 历史研究(回滚莫队) bzoj它爆炸了. luogu 题解时间 我怎么又在做水题. 就是区间带乘数权众数. 经典回滚莫队,一般对于延长区间简单而缩短区间难的莫队题可以考 ...

  3. java LinkedList (详解)

    Java 链表(LinkedList) 一.链表简介 1.链表 (Linked List) 是一种常见的基础数据结构,是一种线性表,但是链表不会按线性表的顺序存储数据,而是每个节点里存到下一个节点的地 ...

  4. Linux 环境部署Skywalking支持Elasticsearch

    一.环境准备 1.Java JKD 1.8(建议) 2.Elasticsearch 3.Skywalking 二. 环境搭建 安装Skywalking分为两个步骤: a.安装Backend后端服务 b ...

  5. 什么是Spring的依赖注入?

    依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释.这概念是说你不用创建对象,而只需要描述它如何被创建.你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个 ...

  6. 上传文件到阿里云linux服务器(windows到Linux的文件上传)

    在"运行"中输入cmd,打开控制台,切换到刚才Putty的安装目录下,我的是E:\Putty,然后输入pscp命令,我们需要这个命令来实现文件的上传.如下命令格式: F:\PuTT ...

  7. java对象的克隆以及深拷贝与浅拷贝

    一.为什么要使用克隆 在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也 ...

  8. 初识Spring(为什么要使用Spring?)

    Spring,英文翻译是春天的意思,而在Java中,是一个开放源代码的设计层面框架(手动滑稽,程序员的春天),他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.S ...

  9. 如何运行exe文件

    有三种方式 第一种:找到所在文件双击运行. 第二种:在命令行里面运行所在文件夹的位置,在输入文件名. 第三种:加到环境变量里面执行

  10. C++中sort()函数使用介绍

    sort()简介 为什么选择使用sort()  在刷题的时候我们经常会碰到排序的问题,如果我们不使用一些排序的方法那我们只能手撕排序,这样就会浪费一些时间.而且我们还需要根据需要去选择相关的排序方法: ...