/**
* @author StormWangxhu
* @version 创建时间:2017年11月3日 上午10:03:44
*
*/
今天来总结一下集合,这篇主要总结一下List借口及其相关的实现类。
首先看一下集合的框架。
再一张
最后一张性能总结性图:
从上图中可以看到,List接口主要有两个实现类,ArrayList和LinkedList,主要讲一下第一个。
1、ArrayList
(1) 关于ArrayList的实现原理,以后通过看源代码来总结。
(2)、
ArrayList的一些方法,实现增删改查:
结合代码看:
package com.stormwang.List;
import java.util.ArrayList;
import java.util.Iterator;
import javax.rmi.ssl.SslRMIClientSocketFactory;
import javax.swing.plaf.synth.SynthSpinnerUI;
/**
* @author StormWangxhu
* @version 创建时间:2017年11月3日 上午10:03:44
*
*/
/**
* List 是一个借口
* ArrayList是其一个实现类!
* 特点: 查询元素快,增删效率低下!
* 那么,这种缺陷,由LinkedList集合来克服:后面再练习!
* LinkedList特点:
* 删除效率高!
* ArrayList 练习
* 实现集合元素的增删改查!
* */
public class ListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList arrayList = new ArrayList<>();
//实现集合的增删改查
arrayList.add("hello!");
arrayList.add("I am java!");
arrayList.add("今天是11月3号!,我在图书馆学习!");
arrayList.add("我也会很牛逼的对吗!");
arrayList.add(3, "我是指定位置插入的元素");
System.out.println(arrayList.size());
System.out.println("以下是直接输出集合元素:");
System.out.println(arrayList);
//遍历集合
System.out.println("使用迭代器遍历集合:");
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}
//删
System.out.println("删操作:");
if (arrayList.get(2).equals("今天是11月3号!,我在图书馆学习!")) {
arrayList.remove(2);
System.out.println("第三个元素删除成功");
}else {
System.out.println("删除失败!");
}
//使用foreach 循环输出集合元素
System.out.println("使用foreach循环输出集合元素:");
for (Object object : arrayList) {
System.out.println(object);
}
//改
System.out.println("改操作:");
System.out.println("现在集合大小为:"+arrayList.size());
arrayList.set(1, "我是新的第二个元素,原来已被我替换!!");
//ArrayList 有序,可重复
arrayList.set(0, arrayList.get(1));
System.out.println("...");
/**
*
* 问题:这一部分为什么会执行不了? 抛出异常!
Iterator iterator2 = arrayList.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}*/
System.out.println("现在集合元素为:");
for (Object object : arrayList) {
System.out.println(object);
}
//查操作
//如果没有元素返回真
if (!arrayList.isEmpty()) {
System.out.println(arrayList.isEmpty());
}
if (arrayList.contains(2)) {
System.out.println("什么鬼!");
}else {
System.out.println("包含操作查询失败!");
}
Object object ;
System.out.println("查操作:");
object =arrayList.get(0);
System.out.println("第一个元素为:"+object);
//使用toString()方法,将集合元素转换为字符串。
System.out.println(arrayList.toString());
System.out.println(arrayList);
}
}
ArrayList 特点:
1、实现:
集合底层是使用了一个数组来保存元素的,在增加、删除指定位置元素时,会导致创建新的数组,效率比较低,因此不适用于做大量的增删操作。但这种数据结构,允许程序通过索引的方式来访问元素。因此使用ArrayList集合查找元素很便捷。
2、提供的查找方法:
LinkedList
1、特点:
LinkedList
* 该集合内部维护了一个双向循环链表,链表中的每一个元素
* 都使用引用的方式记住它的前一个元素和后一个元素,从而
* 可以将所有的元素彼此连接起来。
当插入一个新元素时,只需要修改元素之间的这种引用关系即可。
当删除一个节点也是如次。正因为LinkedList的存储结构,Linkedlist集合对元素的增删操作具有很高的效率。
下面通过一组图片看LinkedList的结构:
上图为新增一个元素时:只需要让黄色部分的节点记住它后面是新元素,让黄颜色后面的记住它前面的是新元素。
通过代码演示一下该类的特长————增、删操作
package com.stormwang.List;
import java.util.Iterator;
import java.util.LinkedList;
/**
* @author StormWangxhu
* @version 创建时间:2017年11月3日 下午6:55:57
*
*/
/**
* LinkedList
* 该集合内部维护了一个双向循环链表,链表中的每一个元素
* 都使用引用的方式记住它的前一个元素和后一个元素,从而
* 可以将所有的元素彼此连接起来。
* */
public class LinkedListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList linkedList = new LinkedList<>();
//增操作
System.out.println("增加元素:");
linkedList.add("stu1");
linkedList.add("stu2");
linkedList.add("stu3");
linkedList.add("stu4");
System.out.println(linkedList.toString());
//向指定位置插入元素
linkedList.add(2, "指定位置");
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
System.out.println(object);
}
//在最前面插入元素
linkedList.addFirst("First");
//删除最后一个元素
linkedList.removeLast();
//返回此列表的第一个元素。
System.out.println(linkedList.getFirst());
System.out.println(linkedList);
//删除指定元素
linkedList.remove(3);
System.out.println(linkedList);
//删除最后一个元素
linkedList.removeLast();
System.out.println(linkedList);
//删除第一个元素
linkedList.removeFirst();
System.out.println(linkedList);
}
}
LinkedList在增删方面有7个特有的方法。
看看:
增
删
具体可以查看API
下面看看ArrayList和LinkedList的区别:
总结:
ArrayList:
有序 可重复
查找效率高,大批量增加、删除操作慢。
线程不安全
LinkedList
有序 可重复
增删效率高! 查找效率不好。
线程安全