集合_ArrayList_LinkedList_HashSet

来源:互联网 发布:dwg免费加密软件 编辑:程序博客网 时间:2024/05/02 06:11
----------- 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[] 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
*/
原创粉丝点击