-------android培训、java培训、期待与您交流-------
01集合框架(体系概述)
为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最
常用的一种方式
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的:集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象
集合类的特点
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
数据多了要进行封装,封装成对象。对象多了也得需要存储:有两种存储的地方那可以用1.数组:2.集合:存储对象用的
参阅顶层,创建底层
1.不断向上抽取的东西很有可能无法创建对象:因为抽象。
2.创建子类对象方法更多一些
顶层 Collection(收集 集合)
集合框架
为什么会出现这么多的容器呢?
因为每一个容器对数据的存储方式都有不同。这个存储方式称之为:数据结构。
02集合框架(共性方法)
1,add方法的参数类型是Object。以便于接收任意类型对象。
2,集合中存储的都是对象的引用(地址)
class CollectionDemo
{
public static void main(String[] args)
{ //创建一个集合容器,使用Collection接口的子类:ArrayList
ArrayList al = new ArrayList();
//1,添加元素。
al.add("java01");//add(Object obj);
al.add("java02");
al.add("java03");
al.add("java04");
//2,打印原集合
sop("原集合:"+al);
//3,删除元素
al.remove("fava02");
al.clear(); //清空集合
//4,判断元素
sop("java03是否存在:"+al.contains("fava03"));
sop("集合是否为空?"+al.isEmpty());
//5,获取个数,集合长度
sop("size:"+al.size());
//打印改变后的集合
sop(al);
}
}
03集合框架(迭代器)
public static void method_get()
{
ArrayList al = new ArrayList();
//1,添加元素。
al.add("java01");//add(Object obj);
al.add("java02");
al.add("java03");
al.add("java04");
/*
Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。
it指向一个对象,当循环完后,还在内存中存在。代表着对象也在内存中。可是迭代器用完了,结束了,它的存在就没有意义
了。
我们的目的是:取出元素并操作元素。所以sop(a1);(只有在上课讲解时会用到)不行
while(it.hasNext())
{
sop(it.next()); //迭代器的基本使用
}
*/
for(Iterator it = al.iterator(); it.hasNext() ; )
{
// it是for循环的局部变量,当循环结束后,it就释放不存在了。
sop(it.next());
}
}
迭代器的内部实现方式:
就把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素
那么取出方式就被定义成了内部类
而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都有共性内容:判断和取出。那么可以将这些共性抽取
那么这些内部类都符合一个规则。该规则是Iterator。
如何获取集合的取出对象呢?
通过一个对外提供的方法
iterator();
04集合框架(List集合共性方法)
Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。
|--Set:元素是无序,元素不可以重复。、
List:
特有方法。凡是可以操作角标的方法都是该体系特有的方法。
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index):
subList(from,to);
listIterator();
int indexOf(obj):获取指定元素的位置。
ListIterator listIterator();
ArrayList al = new ArrayList();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
sop("原集合是:"+al);
//在指定位置添加元素。
al.add(1,"java09");
//删除指定位置的元素。
//al.remove(2);
//修改元素。
//al.set(2,"java007");
//通过角标获取元素。
sop("get(1):"+al.get(1));
sop(al);
//获取所有元素。
for(int x=0; x<al.size(); x++)
{
System.out.println("al("+x+")="+al.get(x));
}
Iterator it = al.iterator();
while(it.hasNext())
{
sop("next:"+it.next());
}
05集合框架(ListIerator)
List集合特有的迭代器。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。
所以,在迭代器时,只能用迭代器的方式操作元素,可是Iterator方法是有限的,
只能对元素进行判断,取出,删除的操作,
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator
该接口只能通过List集合的listIterator方法获取。
public static void main(String[] args)
{
//演示列表迭代器。
ArrayList al = new ArrayList();
//添加元素
al.add("java01");
al.add("java02");
al.add("java03");
sop(al);
ListIterator li = al.listIterator();
//sop("hasPrevious():"+li.hasPrevious());
while(li.hasNext()) //正向遍历
{
Object obj = li.next();
if(obj.equals("java02"))
//li.add("java009");
li.set("java006");
}
while(li.hasPrevious()) // 逆向遍历
{
sop("pre::"+li.previous());
}
//sop("hasNext():"+li.hasNext());
//sop("hasPrevious():"+li.hasPrevious());
sop(al);
06集合框架(List集合具体对象的特点)
开发时用哪个容器:看需求。
如果取到的元素很多,元素中涉及到了比较频繁的增删操作,这个时候用linkedlist;如果涉及到的增删操作不频繁,两
个都能选择。涉及到了增删,同时又涉及到了查询,建议使用arraylist,因为其实频繁的增删操作并不多见,一般情况下都
是查询比较常见。所以arraylist作为最常见,最常使用容器存在。当你实在选不出来用谁就用arraylist。只要元素不是特别
多,arraylist的增删也是可以允许的。
07集合框架(Vector中的枚举)
import java.util.*;
枚举就是Vector特有的取出方式。
发现枚举和迭代器很像。
其实枚举和迭代是一样的。
因为枚举的名称以及方法的名称都过长。
所以被迭代器取代了。
枚举郁郁而终了。
class VectorDemo
{
public static void main(String[] args)
{
Vector v = new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
v.add("java04");
Enumeration en = v.elements();
while(en.hasMoreElements())
{
System.out.println(en.nextElement());
}
}
}
08集合框架(LinkedList)
LinkedList:特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst(); add
offerLast();
peekFirst(); get
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst(); remove
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null。
09集合框架(HashSet)
import java.util.*;
/*
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
|--TreeSet:
Set集合的功能和Collection是一致的。
-------android培训、java培训、期待与您交流-------