------- android培训、java培训、期待与您交流! ----------
一、集合概述
集合的框架:
---------丨Collection 单列 集合的超类
---------------------------丨List 有序且可以重复的
---------------------------丨Set 无序且不可以重复的
二、List的体系
List的三个子类:
-----丨List
--------------丨ArrayList 线程非安全的,查询快,增删慢
--------------丨LinkedList 线程非安全的,查询慢,增删快
--------------丨 Vector 线程安全的,查询快,增删慢,效率低
三、List三个子类特性的出现原因
ArrayList:
ArrayList容器底层是通过数组来存储数据的。由于是由数组实现,所以可以通过数组的方法来完成查询动作,查询效率高。ArrayList的初始容量为10,一旦出现容量不够的情况时,数组长度增加1/2,数组的长度增长要通过copy来完成,数组copy的过程很费时,所以增删慢。
注:所以一般创建ArrayList集合时,都会根据需求设置初始容量,避免出现容量不够,或增长后浪费大量容量。
LinkedList:
LinkedList底层是通过链表结构实现,链表的实质也是数组,链表的元素一半为数据,一半指向下一个元素的地址,合起来为一个元素。这样增删数据
快,但是查找只能逐个元素的查找,所以查找慢。
LinkedList的特点:LinkedList是一个很强大的链表集合。他是一个普通的集合,也模拟了2种数据结构。
1、队列结构:先入先出的存储方式,通过offer()加入元素在结尾,poll()取出开头元素
2、栈结构:先入后出,通过push()添加元素在开头,pop()取出开头元素
Vector:
VERTOR是一个线程安全的数组,查询快,增删慢,效率低
VECTOR的构造器是enumeration。在IO中的SequenceInputStream()构造中传入一个enumeration可以遍历多个输入流,完成合并需求。
四、listIterator
相对Collection实现的iterable接口中的iterator(),list提供了一个listIterator(),listIterator()在ArrayList和AbstractSequentialList得到了实现,查找LinkedList源码找不到Iterator()和listIterator()的实现方法。
listIterator提供了更多的方法,hasPrevious()、previous()、add()、set()是常用的几个。
五、代码演示
基础应用:
package cn.itcast.collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* Collection成员方法:
* 添加
* boolean add(Object obj)
* boolean addAll(Collection c)
* 删除
* boolean remove(Object obj)
* boolean removeAll(Collection c)
* 判断
* boolean contains(Object obj)
* boolean containsAll(Collection c)
* boolean isEmpty()
* 获取
* Iterator<E> iterator()
* 长度
*int size()
*
*交集
*boolean retianAll(Collection c)
*
*集合转数组
*Object[] toArray()
* 数组没有.length()方法,只有.length成员,字符串有.length(),集合也没有.length(),集合的是.size()
* */
public class CollectionBasicFunction {
public static void main(String[] args) {
//集合的练习,首先创建集合对象,Collection没有直接子类,只有字接口,创建子接口的实现类
Collection c=new ArrayList();
System.out.println("add添加成功,返回boolean:"+c.add("hello"));
c.add("world");
//直接 暴力清除c的所有元素
//c.clear();
//删除单个元素
//c.remove("world");
System.out.println("判断是否为空:"+c.isEmpty());
//包含功能
System.out.println("包含功能,返回Boolean:"+c.contains("hello"));
System.out.println("集合的size方法返回长度:"+c.size());
System.out.println(c.toString());
}
}
2种遍历方式:
for(int i=0;i<list.size();i++){
<span style="white-space:pre"> </span>System.out.println(list.get(i));
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>//迭代器遍历
<span style="white-space:pre"> </span>/*Iterator<String> it=list.iterator();
<span style="white-space:pre"> </span>while(it.hasNext()){
<span style="white-space:pre"> </span>System.out.println(it.next());
<span style="white-space:pre"> </span>}*/}
农夫带猫 动物 鱼过河案例演示:
package it.heima.list;
import java.util.ArrayList;
import java.util.List;
import javax.swing.tree.DefaultTreeCellEditor.EditorContainer;
import javax.xml.stream.events.EntityDeclaration;
/**
* 农夫有狗 猫 鱼
*/
public class ListDemo {
ArrayList<String> startList = new ArrayList<>();
ArrayList<String> endList = new ArrayList<>();
public ListDemo() {
startList.add("fish");
startList.add("cat");
startList.add("dog");
}
public static void main(String[] args) {
ListDemo demo=new ListDemo();
demo.toTake();
}
public boolean isSafe(ArrayList<String> list) {
boolean flag = true;
if (list.contains("cat") && list.contains("fish") || list.contains("cat") && list.contains("dog")) {
flag = false;
}
return flag;
}
public boolean isEmpty(ArrayList<String> list) {
return list.isEmpty();
}
public void toTake() {
String animal = startList.get(0);
startList.remove(0);
if (isSafe(startList)) {
toThere(animal);
} else {
startList.add(animal);
toTake();
}
}
public void toThere(String animal) {
endList.add(animal);
System.out.println("农夫带着"+animal+"过河了");
System.out.println("河这边还有"+startList);
System.out.println("过河了的有"+endList);
if(isEmpty(startList)){
System.out.println("动物都过河了");
return;
}
if(isSafe(endList)){
toTake();
}else{
String s=endList.get(0);
endList.remove(0);
if(isSafe(endList)){
System.out.println("农夫带着"+s+"回到了这边");
startList.add(s);
toTake();
}else{
toThere(s);
}
}
}
}
结果: