您的位置:首页 > 其它

集合_ArrayList_LinkedList_HashSet

2013-03-19 00:54 309 查看
----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

【集合】
面向对象重点操作是用来操作对象

数据多了需要进行封装,封装成对象

对象多了也要进行封装,两种方式

1数组 固定长度,只能储同一种类型的数据

2集合(容器) 可变长度,只要是对象就行

容器分好多种,形成了共性不断抽取,慢慢的就产生了体系(集合框架)

为什么先看顶层:

1:向上抽取的东西一般是不能创建对象,因为抽象嘛

2:创建子类对象方法更多一些

参阅顶层创建底层
【Collection集合框架中的共性方法,以ArrayList为例】
添加 删除 取出

创建集合类:

第一步导包,import java.util.*;

第二步,创建一个集合容器,使用Collection接口的子类,ArrayList
public static void base_method(){

ArrayList al = new ArrayList();
al.add("java01");//add(Object obj);//1,添加元素。
al.add("java02");
al.add("java03");
al.add("java04");
sop("size:"+al.size());//2,获取个数。集合长度。打印集合长度
sop(a1);//3 直接打印集合
al.remove("java01");//4 删除元素
a1.clear();//5 清空集合
sop("java03是否存在:"+a1.contains("java03"));//6 判断元素
sop("集合是否为空?"+al.isEmpty());//7 集合是否为空,clear一下就为空了

}
第三步:交集
public static void method_2(){

ArrayList al1 = new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2 = new ArrayList();
al2.add("java03");
al2.add("java04");
al2.add("java05");
al2.add("java06");
//al1.retainAll(al2);//去交集,al1中只会保留和al2中相同的元素。
al1.removeAll(al2);  //删除al1中与al2相同的元素
//al1.containsAll(al2);//al1是否包含al2的所有元素
sop("al1:"+al1);
sop("al2:"+al2);

}

第四步:迭代器:就是集合取出元素的方式

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();//获取迭代器,用于取出集合中的元素。
while(it.hasNext())//这块循环完了it还在
{
sop(it.next());
}
*/
//这个it是局部的循环完就结束了  建议使用 节约空间
for(Iterator it = al.iterator(); it.hasNext() ; )
{
sop(it.next());

}
}

【List接口】先看API文档
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();
【List下的Iterator 】
public static void main(String[]
4000
args){

ArrayList al = new ArrayList();
al.add("java01");//添加元素
al.add("java02");
al.add("java03");
sop("原集合是:"+al);
al.add(1,"java09");//在指定位置添加元素。1角标多个java09,其它角标向后顺延
//al.remove(2);//删除指定位置的元素
//al.set(2,"java007");//修改元素
sop(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());

}
sop(al.indexOf("java02"));//通过indexOf获取对象的位置
List sub = al.subList(1,3);//1到3,包含1,不包含3
sop("sub="+sub);

}
【length,length(),size()】
1 java中的length属性是针对数组来说的

2 java中的length()方法是针对字符串String来说的

3.java中的size()方法是针对集合来说的
【List下的ListIterator ***】
List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,

如果想要其他的操作如【添加,修改等】,就需要使用其子接口,ListIterator。

该接口只能通过List集合的listIterator方法获取
【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());

}

}

}

Vector支持枚举,ArrayList没有,都统一用迭代器了
【LinkedList】
LinkedList:特有方法:addFirst();addLast();

getFirst(); getLast();

获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst(); removeLast();

获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

在JDK1.6出现了替代方法。offerFirst(); offerLast();

peekFirst(); peekLast();

获取元素,但不删除元素。如果集合中没有元素,会返回null。

pollFirst(); pollLast();

获取元素,但是元素被删除。如果集合中没有元素,会返回null。
public static void main(String[] args) {

LinkedList link = new LinkedList();
//1://link.addFirst("java01");
//link.addFirst("java02");
//link.addFirst("java03");
//link.addFirst("java04");
//sop(link);//java04 ... java01
//2:
link.addLast("java01");
link.addLast("java02");
link.addLast("java03");
link.addLast("java04");
sop(link);
//sop(link.getFirst());//只取 两个都是java1
//sop(link.getFirst());
//sop(link.getLast()); //只取
//sop(link.removeFirst());//连取带删除
//sop(link.removeFirst());//连取带删除
//sop("size="+link.size());
while(!link.isEmpty())
{

sop(link.removeLast());

sop(link.removeFirst());

}

}

使用LinkedList模拟一个堆栈或者队列数据结构。
【HashSet】
存取方式:按hash值存,按hash值取

import java.util.*;

/*

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCode和equals来完成。

如果元素的HashCode值相同,才会判断equals是否为true。

如果元素的hashcode值不同,不会调用equals。

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

|--TreeSet:

Set集合的功能和Collection是一致的。

ArrayList判断元素是否存在,还有删除元素,只依赖equals,原因在数据结构上,数据结构不同,依赖的方法也不一样

HashSet判断元素是否存在,还有删除元素,先依赖hashCode,再依赖equals

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐