一、List

1.List集合特有功能

/*
* List集合的特有功能:
* A:添加功能
* void add(int index,Object element):在指定位置添加元素
* B:获取功能
* Object get(int index):获取指定位置的元素
* C:列表迭代器
* ListIterator listIterator():List集合特有的迭代器
* D:删除功能
* Object remove(int index):根据索引删除元素,返回被删除的元素
* E:修改功能
* Object set(int index,Object element):根据索引修改元素,返回被修饰的元素
*/

测试类

	@Test
public void testList(){ List list = new ArrayList();
list.add("AAA");
list.add("BBB");
list.add("CCC");
list.add("DDD");
System.out.println(list); //1.在指定索引位置添加元素
list.add(1,"QQQ");
System.out.println(list); //2.获取指定索引位置的元素
String str = (String)list.get(1);
System.out.println("索引为1的元素: " + str); //3.移除指定索引位置的元素
list.remove(1);
System.out.println(list); //4.修改指定索引位置的元素
list.set(0,"KKK");
System.out.println(list); //5.列表迭代器
ListIterator it = list.listIterator();
while(it.hasNext()){
String s = (String)it.next();
System.out.print(s + " ");
} System.out.println(""); //可以逆向遍历,但是必须先正向遍历,没意义
while(it.hasPrevious()){
String s = (String)it.previous();
System.out.print(s + " ");
} }

结果:

      [AAA, BBB, CCC, DDD]

      [AAA, QQQ, BBB, CCC, DDD]

      索引为1的元素: QQQ

      [AAA, BBB, CCC, DDD]

      [KKK, BBB, CCC, DDD]

      KKK BBB CCC DDD

      DDD CCC BBB KKK

 

2.List子类的特点

ArrayList

     底层数据结构是数组查询快,增删慢

     线程不安全,效率高。

Vector

     底层数据结构是数组查询快,增删慢

     线程安全,效率低。

LinkedList

     底层数据结构是链表查询慢,增删快

      线程不安全,效率高。

 

二、ArrayList

1.ArrayList简介

    ArrayList是一个动态数组,它的容量能动态的增长。

    它继承于AbstractList,实现了List、RandomAccess、Cloneable、Serializable这些接口。

(1)ArrayList继承于AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历功能。

(2)ArrayList实现了RandomAccess接口,及提供了随机访问功能。在ArrayList中,我们可以通过元素的序列号快速获取元素对象,这就是快速随机访问。

(3)ArrayList实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

(4)ArrayList实现了Serializable接口,意味着ArrayList支持序列化,能够通过序列化去传输。

     ArrayList不是线程安全的,只能用在单线程环境下,多线程下可以考虑Collections.synchronizedList(List list)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。

 

2.私有属性

     ArrayList定义只定义了两个私有的属性。

/*
* 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; /*
* The size of the ArrayList (the number of elements it contains).
*/
private int size;

elementData: 是Object[]类型的数组,它保存了添加到ArrayList中的元素。实际上,elementData是动态数组,我们能通过ArrayList(int initialCapacity)来执行他的初始容量为initialCapacity。如果通过无参的构造函数ArrrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态增长。

size: 是动态数组的实际大小。

关键字: transient

     一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,可以不必关心具体的序列化过程,只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。但是有种情况是有些属性不需要序列化的,所以就用到了这个关键字。只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化指定的目的地中。

 

3.构造函数

     ArrayList提供了三种构造函数。

//ArrayList无参构造函数。默认容量是10
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
} //ArrayList带容量大小的构造函数。
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
} //创建一个包含collection的ArrayList
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}

 

4.ArrauList遍历方式

ArrayList支持3种遍历方式。

(1)随机访问,通过索引值去遍历。

		String s;

		for(int i = 0;i < list.size();i++){
s = list.get(i);
}

 

(2)增强for循环

		String s;
for(String str : list){
s = str;
}

 

(3)Iterator循环

		String s;
Iterator<String> it = list.iterator();
while(it.hasNext()){
s = it.next();
}

 

5.总结

(1) ArrayList 实际上是通过一个数组去保存数据的。当我们构造ArrayList时,若使用默认构造函数,则ArrayList的默认容量大小是10。

(2) 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量

    int newCapacity = oldCapacity + (oldCapacity >> 1);

     即新容量是旧容量的1.5倍。

Java基础学习(六)—List的更多相关文章

  1. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  2. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  3. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  4. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  5. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  6. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  7. java基础学习总结——开篇

    java是我学习的第一门编程语言,当初学习java基础的时候下了不少功夫,趁着这段时间找工作之际,好好整理一下以前学习java基础时记录的笔记,当作是对java基础学习的一个总结吧,将每一个java的 ...

  8. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  9. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

随机推荐

  1. react-router 中的history(react中关于后退键的处理用的到)

    react-router 中的history react-router 是建立在history之上的:我们来谈谈这个history吧. github: mjackson/history history ...

  2. 初级:使用MD5对字符串进行加密操作

    加密技术在企业数据安全中的应用: 大型企业管理软件的应用越来越广泛,企业数据平台涉及局域网.广域网. Internet等,在各类系统中保存的企业关键数据量也越来越大,许多数据需要保存数十年以上,甚至是 ...

  3. 利用IIS和Nginx实现负载均衡

    一直对Nginx反向代理和负载均衡感兴趣,今天在Windows下搭建了一个简单实例.步骤如下: 1.下载Nginx,我下载的是最新的1.11.10版本,地址http://nginx.org/downl ...

  4. 调用android方法,出现版本太低解决方法

    原因如下图所示: 调用需要API级别11,当前是8. 解决方法如下图所示: 点击

  5. ORM 实现数据库表的增删改查

    这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...

  6. UI培训自学能学好吗

    近年来UI设计师愈来愈红,成为行业热门,越来越多的人开始专注UI培训,也有一部分人在考虑,培训班一般价格不菲,我自学怎么样呢? UI设计是指人机交互过程中的一个界面设计,常用到的有 ps和ai两个工具 ...

  7. Linux进程管理详解

    何谓进程?进程,就是正在执行的一个程序或命令,每一个进程都是一个运行实体,有自己的地址空间,并占用一定的系统资源.简而言之,进程就是运行中的程序.在Linux中,诸如ls等命令都是进程,只不过某些命令 ...

  8. Search a 2D Matrix leetcode

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  9. node.js异步控制流程 回调,事件,promise和async/await

    写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. ...

  10. 浅谈并发和tomcat线程数

    假设Tomcat每到固定一个时间会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是7.0.54,配置如下 & ...