一.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. Linux修改用户密码有效期

    linux默认用户的密码是永不过期的,但是出于安全考虑在企业环境中一般会要求设置过期日期:但有时要求90天就过期,在这种严柯条件下我们有可能想给某个或某些用户开设后门,延长其密码有效期. 一.用户密码 ...

  2. 把旧系统迁移到.Net Core 2.0 日记(11) -- Authentication 认证 claimsIdentity 对比 之前的FormAuthentication

    实现最简单的认证,类似之前的FormAuthentication 在 Startup 的 ConfigureServices() 方法中添加 Authentication 的配置: 这个CookieA ...

  3. Struts 2 初步入门(五)之接受参数

    1.使用action的属性接受参数 执行顺序为:前端提交参数--->LoginAction.do进行处理--->处理成功后,跳转到sucess.jsp文件. (1)新建login.jsp文 ...

  4. qt资源加载出错

    -1: error: No rule to make target '../InteractivePlayer/style.qss', needed by 'debug/qrc_res.cpp'.  ...

  5. python http 请求 响应 post表单提交

    1. 查看请求 响应情况 print(response.text) print(response.headers) print(response.request.body) print(respons ...

  6. China’s movie heroes 《红海行动》展现中国英雄本色

    Recent years have seen a trend for big military movies. Whether it was last year’s British hit Dunki ...

  7. Django ajax提交 登录

    一.url from django.contrib import adminfrom django.urls import pathfrom appo1 import views urlpattern ...

  8. JQuery button控制div或者section

    一.项目你需求 点击左边导航栏的某个按钮,右边内容栏显示出,相应的内容 效果如图   二.html与css.jQuery 1.div模式 <!DOCTYPE html PUBLIC " ...

  9. websphere部署war包

    通过websphere部署以及打包成war的web项目. (1)安装配置war包,部署项目 登录websphere,进入websphere主页(依次选中) Applications -->   ...

  10. import 语句

    声明package的语句必须在java类的有效代码第一行,所import语句要放在package 声明语句之后. import的语法格式为:    import+空格+类全限定名+: 该语句的作用是, ...