——- android培训、java培训、期待与您交流! ———-
.1. 集合概述
1、为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,,就对对象进行存储,集合就是存储对象最常用的一个种方式。集合:长度可变, 可以存储多种类型的数据,数组:长度不可变,只能存储单一类型的元素
2、集合特点
a 是可以存储很多元素的容器。
b 这个容器用于存储对象。(只能存对象,但可以存储不同类型的对象)
c 而且该容器的长度是可变的。
3、集合和数组的区别
a、数组是固定长度,集合是可变长度。
b、数组可以存储引用类型,也可以存储基本类型。集合只能存储引用类型(对象)。
4, 集合类存放于java.util包中,集合类型主要有3种:set(集)、list(列表)和map(映射)。
a, Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。
b, List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
c ,Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的key。拥有自己的内部排列机制。
d,容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类型。
1.2. collection集合
1.2.1. 演示Collection中的共性方法
1,添加。 add addAll
2,删除: remove removeAll clear(); retainAll();
3,判断: contains() containsAll() isEmpty();
4,获取: size(); iterartor();
5,转换 toArray();
程序示例:
class CollectionDemo {
public static void main(String[] args) {
Collection coll = new ArrayList();
Collection coll2 = new ArrayList();
// collectionMethodDemo(coll);
collectionMethodDemo_2(coll, coll2);
}
/**
* 演示带All的方法。
*/
public static void collectionMethodDemo_2(Collection A1,Collection B2){
//添加元素。
A1.add(“Demo1”);
A1.add(“Demo2”);
A1.add(“Demo3”);
A1.add(“Demo4”);
B2.add(“Demo1”);
B2.add(“Demo2”);
B2.add(“Demo3”);
B2.add(“Demo4”);
//打印c1
System.out.println(A1);
//演示addAll方法。
// c1.addAll(B2);//将B2集合中的元素存储到A1中。
//演示contiansAll.
// boolean b = c1.containsAll(B2);
// System.out.println(“containAll:”+b);
//演示removeAll
// boolean b = A1.removeAll(B2);//将A1和B2中相同的元素从A1中的删除。
// System.out.println(“removeAll:”+b);
//演示retainAll
// boolean b = A1.retainAll(B2);//将A1和B2中不相同的元素从A1中删除。和removeAll正好相反。取交集。
// System.out.println(“retainAll:”+b);
System.out.println(A1);
}
/**
* 演示Collection中的方法。
*/
public static void collectionMethodDemo(Collection coll){
//1,添加元素。
coll.add(“abc1”);
coll.add(“abc2”);
coll.add(“abc3”);
coll.add(“abc4”);
System.out.println(coll);
//2,删除元素。
// coll.remove(“abc2”);//添加和删除都会导致集合长度的变化。
//3,清空。
// coll.clear();
//4,判断。
// System.out.println(coll.isEmpty());
System.out.println(coll.contains(“abc3”));
//获取元素的个数
// System.out.println(“size=”+coll.size());
System.out.println(coll);//直接打印集合,将集合变成字符串,集合中的元素也会被变成字符串。并不是集合取出元素的方式。
//仅仅用这种集合变成字符串的方式来验证集合中的元素的变化情况。
}
}
1.2.2. 迭代器
迭代器要使用,必须先有容器。
Iterator是容器中的一个内部类,因为该类要直接访问容器中的元素。同时对外提供了公共的访问规则Iteraror接口。
这样的好处是,不需要知道具体的容器,只要是Collection中的容器都可以通过该种取出方法取出体系中的所有容器中的元素。
使用迭代器的好处会是:降低了具体容器和取出方式的耦合性。
想要获取集合中的迭代器对象,就可以通过iterator方法来完成。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
迭代器使用程序示例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class IteratorDemo {
public static void main(String[] args) {
/*
* 迭代器:取出容器中的元素的方式。
*/
//先有集合。
Collection coll = new ArrayList();
//存储元素。
coll.add(“abc1”);
coll.add(“abc2”);
coll.add(“abc3”);
coll.add(“abc4”);
//取出元素。
//获取迭代器。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
注意:在迭代过程中,不允许使用其他对象比如容器对象对容器中的元素进行修改。容易发生concurrentModificationException并发修改异常。
所以在迭代过程中只能使用迭代器的方法对元素进行操作。可是很遗憾:iterator只要三个方法。hasNext,next,remove
但是:iterator的子接口ListIterator可以完成这个任务。它的方法有:add set remove next hasXXX.
而获取ListIterator对象是通过的就是List接口中的listIterator()方法。
注意:ListIterator是List接口特有的迭代器。该接口可以在遍历过程中完成元素的增删改查操作。
1.2.3. collection集合体系
collection
|– List:有序的(存入的顺序和取出的顺序保持一致),该集合中的元素都有索引。可以有重复的索引。
|– Set:不允许有重复的元素。
List
|— Vector:底层数据结构是一个数组。而且数组可以增长。其实数组增长的原理:存储元素时,超出数组角标,会创建新数组,将原数组的数据复制到新数组中,并将新元素存储到新数组中。 它是同步的。效率非常低。
|— ArrayList:底层数据结构也是可变长度的数组,是不同步的。但是它比Vector效率高。查询数组元素的速度很快。
|— LinkedList:底层数据结构是链表数据结构,是不同步的。对元素的增删操作很快。
Set (方法都是来自于Collection)
|— HashSet:数据结构是哈希表,是不同步的。
|— TreeSet:数据结构是二叉树结构。可以对set集合中的元素进行指定方式的排序。默认使用的是元素的自然排序。
TreeSet判断元素唯一性的方式,是比较方法的返回值是否为0,如果是0.认为是相同的元素,不存储。
注:Set集合中只能使用iterator迭代器进行遍历操作,也就是不能进行增删改查操作。
1.2.4. collection集合的子类对象的阅读技巧。
1、具体的容器是什么结构?是否是同步?
2、通过名称就可以获得。容器的前缀名是数据结构的名称。后缀名是所属体系的名称。
3、凡是后缀名是体系名的集合,通常都是不同步的。
示例:
ArrayList:数据结构是数组。所属于List系。看到数组必须要想到索引,必须要知道查询速度快。
LinkedList:数据结构是链表,看到链表就要想到,增删速度快,而且要想到add,get,remove的first lasr 方法。
HashSet:数据结构是哈希表,看到哈希就必须想到对元素进行hashcode和equals方法的覆写。
TreeSet:数据结构是二叉树,看到书,就要想到比较排序,就要想到接口,comparator和compareable