一.List接口的继承关系

List接口是Collection接口的子接口,而ArrayList和LinkedList以及Vector是其实现类。

List的特点是可以将元素维护在特定的序列中,可以再List 插入和删除元素。

二.两个实现类ArrayList和LinkedList

ArrayList:擅长随机访问,但是插入和删除消耗较慢,原因:底层维护的是一个Object数组

源码如下:

    /**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer. Any
* empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
* will be expanded to DEFAULT_CAPACITY when the first element is added.
*/
transient Object[] elementData; // non-private to simplify nested class access

LinkedList:擅长插入,删除。但是不擅长随机访问,原因底层是一个链表

头结点的代码:

   /**
* Links e as first element.
*/
private void linkFirst(E e) {
final Node<E> f = first;
final Node<E> newNode = new Node<>(null, e, f);
first = newNode;
if (f == null)
last = newNode;
else
f.prev = newNode;
size++;
modCount++;
}

三.List接口实现的常用方法

首先在了解List之前先来了解ArrayList和LinkedList的构造函数

通常情况下我们都是直接不像构造器里传参数,那么此时他们的默认长度为10,此后每一次扩容为1.5倍,即每次加5.

当你初始化时传入一个数字,那么它将设置该数值为初始长度,代码如下:

ArrayList<Node> arr1 = new ArrayList<>(1);//指派出的长度,当不满足是在自动分配

当然你也可以通过Arrays.asList方法来传入List对象来实现,代码如下:

List<Node> arr = new ArrayList<>(Arrays.asList(new Node(),new Node()));//可以在初始化时就创建

以下为List实现的方法:

1.add()————增加方法。

arr1.add(new Node(1,"a"));//添加元素
arr1.add(new Node(2,"b"));//添加元素
arr1.add(new Node(1,"a"));//添加一个相同重复的元素

2.get()————获取元素。

System.out.println(arr1.get(0));

3.remove————移除一个元素的方法(equals匹配)

System.out.println(arr1.remove(new Node(1,"a")));//true  Node类重写了equals方法所以可以被删除,且删除第一个遇到匹配的

4.removeAll————移除所有匹配相同的元素方法(equals匹配)

arr4.removeAll(Arrays.asList(new Node()));//使用equals来判断删除所有的

5.indexOf————返回匹配元素在集合中的第一次相遇的元素位置(equals匹配),没有匹配到时将返回-1

System.out.println(arr1.indexOf(new Node(1,"a")));//返回在arr中的序列没有返回-1

6.addAll————将collection接口实现的子类对象加入到集合中,这也就是说你可以将Set集合和Queue中的元素加入到List集合中

//在ArrayList中插入Set集合
Set<Node> set=new HashSet<>();
Collections.addAll(set, new Node(3,"c"),new Node(4,"d"));//初始化set集合
arr1.addAll(set);

7.subList————分割出子集合,返回类型为List,注意当使用List的实现类来操作是注意向下转型异常。

//获取子集合,使用linkedList  subList返回的类型为List,不能直接使用,不能实现向下转型,使用多态解决
List<Node> arr2=new LinkedList<>();
arr2=arr1.subList(0, 2);//subList返回类型为List 向下转型会出现异常,只有使用多态才能完成操作
System.out.println(arr2);
//获取子集和使用arrayList
List<Node> arr3= arr1.subList(0, 2);

 8.————排序问题和引用问题

List<Node> arr3= arr1.subList(0, 2);
System.out.println("在没有排序之前子串str3为:");
System.out.println(arr3);
Collections.sort(arr3);
System.out.println("在排序之后子串str3为:");
System.out.println(arr3);
System.out.println(arr1);//子串排序后其母串也排序

首先想要实现sort方法,元素类必须实现comparable接口

发现当我们,子集完成排序后母集中子集部分也完成排序。

原因就是我们的subList()只是在堆里直接引用了母集的部分元素,他们指向的对象还是相同的,所以当你对子集做出改变时母集也会改变。

Java中的容器 I————浅谈List的更多相关文章

  1. Java中的容器 I————浅谈Queue和PriorityQueue

    一.Queue的实现 通过LinkedList类实现Queue接口来完成对Queue的实例类的实现,代码如下: Queue<Integer> queue=new LinkedList< ...

  2. 对kotlin和java中的synchronized的浅谈

    synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...

  3. Java中Integer和String浅谈

    Java中的基本数据类型有八种:int.char.boolean.byte.long.double.float.short.Java作为一种面向对象的编程语言,数据在Java中也是一种对象.我们用基本 ...

  4. Java中常用修饰符浅谈

    一.public.protected.default和private修饰符的作用域 public:在java程序中,如果将属性和方法定义为 public 类型,那么此属性和方法所在的类和及其子类,同一 ...

  5. Java中的SPI原理浅谈

    在面向对象的程序设计中,模块之间交互采用接口编程,通常情况下调用方不需要知道被调用方的内部实现细节,因为一旦涉及到了具体实现,如果需要换一种实现就需要修改代码,这违反了程序设计的"开闭原则& ...

  6. .net中对象序列化技术浅谈

    .net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...

  7. java中的容器问题

    小小的总结一下java中的容器问题. 一.三个知识点 1.迭代器 1).java.util.Interator + hasnext(); next(); remove(); 2).java.lang. ...

  8. Java中的容器(集合)之ArrayList源码解析

    1.ArrayList源码解析 源码解析: 如下源码来自JDK8(如需查看ArrayList扩容源码解析请跳转至<Java中的容器(集合)>第十条):. package java.util ...

  9. Java中的容器(集合)之HashMap源码解析

    1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...

随机推荐

  1. button中文字垂直居中

    给文字设置line-height,等于button高度.

  2. 【九校联考-24凉心模拟】锻造(forging)

    题目背景 勇者虽然武力值很高,但在经历了多次战斗后,发现怪物越来越难打, 于是开始思考是不是自己平时锻炼没到位,于是苦练一个月后发现……自 己连一个史莱姆都打不过了. 勇者的精灵路由器告诉勇者其实是他 ...

  3. JavaScript构造函数详解

    构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象. 构造函数注意事项: 1.默认函数首字母大写 2.构造函数并没有显示返回任何东西.new 操作符会自动创建给定的类型并返 ...

  4. S3cmd命令行管理对象存储

    我的使用步骤 cd /usr/    目录 git clone https://github.com/jdcloud-cmw/s3cmd.git   下载文件 ln -s /usr/s3cmd/s3c ...

  5. 【SQL】group by 及 having

    Group By 分组汇总 HAVING:给分组设置条件 1.概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”, ...

  6. Linux第八周作业

    一 理解编译链接的过程和ELF可执行文件格式 这张图说明了可执行程序的产生 大致过程为 .c文件汇编成汇编代码.asm, 然后再汇编成目标码.o, 然后链接成可执行文件a.out, 这时可执行文件就可 ...

  7. nginx负载均衡实验

    Nginx负载均衡概述 Web服务器,直接面向用户,往往要承载大量并发请求,单台服务器难以负荷,我使用多台WEB服务器组成集群,前端使用Nginx负载均衡,将请求分散的打到我们的后端服务器集群中,实现 ...

  8. 1.4socket服务器打印信息的四种不同方式()

    方式一 socker 服务器 # -*- coding: utf-8 -*- import sys,os,multiprocessing from socket import * serverHost ...

  9. Core Java 面经

    1  面向对象的特征有哪些方面? (1)抽象,抽象就是忽略与当前目标无关的部分,抽象包含两个方面,一是过程抽象,一是数据 (2)继承,是Java中允许和鼓励类重用的思想的体现,, 它提供了一种方式,可 ...

  10. 安装连接mysql8时候遇到的问题以及解决(转)

    官网下载mysql8的安装包: https://dev.mysql.com/downloads/ 下一步安装即可. mysql8增加了传说中的安全性校验 遇到的几个问题: 1.natcat连接不上.参 ...