一、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. OpenCv 2.4.9 (二) 核心函数

    前言 经过前面一节的怎样读取图片,我们可以做一些有趣的图像变换,下面我们首先介绍使用遍历的方法实现,然后我们使用内置的函数实现. 矩阵掩码实现 矩阵掩码,和卷积神经网络中的卷积类似.一个例子如下: 现 ...

  2. nginx.conf完整配置实例

        #user nobody; worker_processes 1;   #error_log logs/error.log; #error_log logs/error.log notice; ...

  3. 开启AngularJS 1.X的学习之路(1)

    概念(1) AngularJS 应用 AngularJS 模块(Module) 定义了 AngularJS 应用. AngularJS 控制器(Controller) 用于控制 AngularJS 应 ...

  4. C# 知识回顾 - 装箱与拆箱

    装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱    我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...

  5. ViewPager基础入门

    效果图: 实现了三个view间的相互滑动 第一个VIEW向第二个VIEW滑动                       第二个VIEW向第三个VIEW滑动                       ...

  6. API抓屏

    需调用API函数 需在开头引入命名空间 using System.Runtime.InteropServices; 获取当前窗口句柄:GetForegroundWindow() [DllImport( ...

  7. html中DTD

    DTD 是一套关于标记符的语法规则.它是XML1.0版规格得一部分,是html文件的验证机制,属于html文件组成的一部分. DTD:三种文档类型:Strict(严格的).Transitional(过 ...

  8. linux 压缩zip包

    压缩: zip -r  名称.zip 被压缩文件 解压: unzip 名称.zip

  9. c++文件读取(一)---输入类使用和查找当前程序路径

    鉴于公司人员流动大,设计一个小的日志定位器,首先要读取日志文件 用输入输出流类操作文件比c的stdio更安全和容易,当然任何此类观点都是对大牛除外 首先是查找当前文件路径,如果用GetCurrentD ...

  10. ActiveMQ学习系列(四)----消息持久化到mysql

    前记:目前学习还比较杂乱,还未找到系统化地学习ActiveMq的方法.在网上看到消息持久化的demo,了解了一下,在此记录. 一.目前ActiveMq支持的持久化方法 url:http://activ ...