-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
1、概述
集合就是一个容器,是用来存储对象的,里面可以存储不同的对象,只要是对象,就可以存储,集合可以分为很多种,他们的底层的存储结构是不一样的(数据结构),所以不同的集合有不同的功能,根据情况选择不同集合。但是他们有共同的特点,就把特点抽取出来了,形成了接口Collection。
集合的长度是变化的,数组的度长是固定的。
2、共性方法
(1)Add方法的参数类型是Object,以便于接收任意类型对象。
(2)集合中存储的都是对象的引用(地址)
publicstaticvoidbase_method(){
ArrayListal=newArrayList();
//1、添加元素
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
//打印原集合
sop("原集合:"+al);
//2、删除元素
al.remove("java02");
//al.clear();//清空集合中的元素
sop("后来的集合:"+al);
//3、获取长度
sop("al的长度:"+al.size());
//4、判断
sop("al中是否含有java01:"+al.contains("java01"));
sop("al是否为空:"+al.isEmpty());
}
3、迭代器
迭代器是用来获取集合中元素,其实迭代器是集合的内部类,因为捏不累读取本类的数据最方便,但是不同的集合他们的存储的结构不同,并且每个集合都要读取数据,所以就把他们共同的方法抽取出来,然后利用本类来返回他们自己的迭代器,这样既方便又安全。
hasNext(),判断元素是否可以迭代next()方法然后迭代的下一个元素remove()从集合中移除此元素
Iteratorit=al.iterator();
while(it.hasNext())
{
System.out,println(it.next());
}
for(Iteratorit=al.iterator();it.hasNext();)
{
System.out,println(it.next());
}
第一种方式while循环完后,对象还在内存中,而第二种方式for循环完后,对象被回收了,因为实在for内部定义的,属于局部变量。
4、List集合共性方法
List中的元素是有序的,元素可以重复,因为该集合体系有索引
Set元素是无序的,不可以重复。
List集合中特有方法:
增:
add(index,obj)在指定位置插入元素。
addAll(index,Collection)添加一个集合进去
删:
remove(index)移除指定位置的元素。
改:
set(index,obj)修改指定位置元素
查:
get(index)
for(inti=0;i<al.size();i++)
{
al.get(i);
}
迭代器获取:
Iteratorit=al.iterator();
while(it.hasNext())
{
System.out,println(it.next());
}
//通过indexOf获取对象的位置
al.indexOf(obj);
//截取字串
al.subList(start,end);
5、ListIterator
List集合特有的迭代器:ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素(会发生ConcurrModificationException异常),而Iterator方法有限,如果想要添加、修改就要用ListIterator。
publicclassListDemo{
publicstaticvoidmain(String[]args){
Listlist=newArrayList();
list.add("java01");
list.add("java02");
list.add("java03");
System.out.println("集合:"+list);
/*在第二位置添加元素*/
list.add(1,"java00");
System.out.println("集合:"+list);
/*利用自己的迭代器读取和插入数据,在java03后面添加元素*/
ListIteratorit=list.listIterator(0);
while(it.hasNext()){
if(it.next().equals("java03")){
it.add("javaLast");
}
}
System.out.println("集合:"+list);
/*取List集合中1~3的元素,包含头不包含尾*/
Listlist1=list.subList(1,3);
System.out.println("集合List1=:"+list1);
}
}
结果:
集合:[java01,java02,java03]
集合:[java01,java00,java02,java03]
集合:[java01,java00,java02,java03,javaLast]
集合List1=:[java00,java02]
6、List子集
List集合子对象:ArrayList,LinkedList,Vector。
ArrayList底层使用的是数组结构,特点在于查询速度很快,但是增删稍慢。线程不同步
LinkedList使用的是链表结构。特点就是增删速度很快,查询很慢。
Vector:底层是数组数据结构,出现较早。1.0版本就出现了。线程不同步。无论增删还是查询都慢。被ArrayList取代了。
7、Vector
枚举就是Vector特有的取出方式。(迭代器、遍历、for循环、按角标索引)
因为枚举的名称和方法的名称都长,所以被迭代器取代了,枚举郁郁而终了。
publicstaticvoidmain(String[]args){
Vectorv=newVector();
v.add("java01");
v.add("java02");
v.add("java03");
Enumerationeunm=v.elements();
while(eunm.hasMoreElements())
{
System.out.println(eunm.nextElement());
}
}
8、LinkedList
addFirst();addLast();
getFirst();getLast();获取元素但是不删除元素
removeFirst();removeLast();获取元素但是删除元素,如果不存在此元素,那么据会抛出异常
1.6版本后的新方法
pollFirst();pollLast();获取并移除第一个元素或者最后一个元素,如果不存在,返回为null,不抛出异常。
offerFirst();offerlast();
peekFirst();peekLast();
例子:
importjava.util.LinkedList;
publicclassLinkedListDemo{
publicstaticvoidmain(String[]args){
LinkedListlist=newLinkedList();
list.add("forward01");
list.addFirst("forward00");
list.addLast("forwardLast");
System.out.println("集合:"+list);
//list.get(3);//此会报异常,原因是集合中没有此元素
System.out.println("集合中的第一个元素:"+list.remove(0));//移除并且能获得,但是如果没有此元素的话,那么就会报异常
System.out.println("移除第一个元素后的集合:"+list);
System.out.println("获取第一个元素:"+list.peekFirst());//获取第一个元素,但是不移除,如果不存在,则是null
System.out.println("获取第一个元素:"+list.peekLast());//获取最后一个元素,但是不移除,如果不存在,则是null
}
}
集合:[forward00,forward01,forwardLast]
集合中的第一个元素:forward00
移除第一个元素后的集合:[forward01,forwardLast]
获取第一个元素:forward01
获取第一个元素:forwardLast
9、LinkedList练习
需求:
使用LinkedList模拟一个堆栈或队列数据结构。
堆栈:先进后出,如同一个杯子;
队列:先进先出,如同一个水管。
classQueue{
privateLinkedListlink;
Queue(){
link=newLinkedList();
}
publicvoidmyAdd(Objectobj){
link.addFirst(obj);
}
publicObjectmyGet(){
//注:此处用removeLast()而不是getLast()
returnlink.removeLast();
}
publicbooleanisNull(){
returnlink.isEmpty();
}
}
classZhan{
privateLinkedListlink;
Zhan(){
link=newLinkedList();
}
publicvoidmyAdd(Objectobj){
link.addFirst(obj);
}
publicObjectmyGet(){
//注:此处用removeLast()而不是getLast()
returnlink.removeFirst();
}
publicbooleanisNull(){
returnlink.isEmpty();
}
}
publicclassLinkedListTest{
publicstaticvoidmain(String[]args){
System.out.println("队列打印:");
Queueq=newQueue();
q.myAdd("java01");
q.myAdd("java02");
q.myAdd("java03");
while(!q.isNull()){
System.out.println(q.myGet());
}
System.out.println("堆栈打印:");
Zhanz=newZhan();
z.myAdd("java01");
z.myAdd("java02");
z.myAdd("java03");
while(!z.isNull()){
System.out.println(z.myGet());
}
}
}