您的位置:首页 > 职场人生

黑马程序员——java之集合框架(Day14)

2013-12-15 14:38 330 查看

------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------

1、为什么要使用集合类?

面向对象的语言对事物都是以对象体现的,为了方便对多个对象的操作,隆重推出了集合类,也是一个容器,可以对对象进行操作。

2、数组和集合类同是容器有何不同?

数据虽然也可以存储对象,但是长度不可改变;集合是可改变的;另外数组能存基本数据类型,集合就不行。

3、集合类的特点

集合只用于存储对象。

长度可变

可以存储不储不同对象

4、集合框架



5、为什么会有这么多容器?

因为每个容器的存储方式都有不同,这种存储方式称为数据结构。

6、Collection定义了集合框架的共性功能。

7、查阅API文档后发现:

iterator是abstractlist的内部封装类,可以不用建立对象,直接迭 代出list内对象。加强for循环省内存,但是不能操作对象。

8、

|--List:元素是有序的,元素可以重复。因为该集合体系有索引。

|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。

|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。

|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

枚举就是Vector特有的取出方式。

发现枚举和迭代器很像。其实枚举和迭代是一样的。

Enumeration en = v.elements();

while(en.hasMoreElements())

{

System.out.println(en.nextElement());

}

|--Set:元素是无序,元素不可以重复。、

List:

特有方法。凡是可以操作角标的方法都是该体系特有的方法。



add(index,element);//在相应位置插入后,后面元素依次顺延

addAll(index,Collection);



remove(index);



set(index,element);



get(index):

subList(from,to);

Iterator();//当对象的引用存在集合时,用迭代方法的时候把对象的引用又传到迭代,这是对象有两个引用指向他,这时不能操作对象只能用其一个方法,否则会抛出:ConcurrentModificationException当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。

int indexOf(obj):获取指定元素的位置。

ListIterator listIterator();

List集合特有的迭代器(因为有角标)。ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。

因为会发生ConcurrentModificationException异常。

所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,

只能对元素进行判断,取出,删除的操作,

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

该接口只能通过List集合的listIterator方法获取。

if(obj.equals("java02"))

//al.add("java008");

it.remove();//将java02的引用从集合中删除了。

sop("obj="+obj);//还能打印是因为迭代器指向这个元素。

class ListDemo {
public static void sop(Object obj){
System.out.println(obj);
}
public static void method(){

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());
}
//通过indexOf获取对象的位置。
sop("index="+al.indexOf("java02"));

List sub = al.subList(1,3);

sop("sub="+sub);
}
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);

/*
//在迭代过程中,准备添加或者删除元素。

Iterator it = al.iterator();

while(it.hasNext())
{
Object obj = it.next();

if(obj.equals("java02"))
//al.add("java008");
it.remove();//将java02的引用从集合中删除了。remove 本身就是iterator的方法

sop("obj="+obj);
}
sop(al);
*/
}
}



9、LinkedList:特有方法:

addFirst();

addLast();

getFirst();

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

removeFirst();

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

在JDK1.6出现了替代方法。

offerFirst();

offerLast();

peekFirst();//peek看一眼的意思

peekLast();

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

pollFirst();//poll剪短,修剪

pollLast();

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

10. 练习:

使用LinkedList模拟一个堆栈或者队列数据结构。

堆栈:先进后出 如同一个杯子。

队列:先进先出 First in First out FIFO 如同一个水管

package until.cn.itcast;
import static java.lang.System.*;
import java.util.*;

/*思路:定义一个静态方法,给方法singleElement传递一个集合,在方法中再创造一个集合,
* 在迭代时用contains方法判断元素是否存在,不存在则添加到新的集合中,并返回新的集合*/
public class SingleElement {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> al = new ArrayList<String>();

al.add("asd");
al.add("asdd");
al.add("dff");
al.add("asdsd");
al.add("asadd");
al.add("asd");

out.println(al);
al =singleElement(al);//调用去除重复元素方法。
out.println(al);
}
public static ArrayList<String> singleElement(ArrayList<String> l){
ArrayList<String> newal = new ArrayList<String>();
Iterator<String> it = l.iterator();
while(it.hasNext()){
String obj = it.next();
if(!newal.contains(obj))
newal.add(obj);
}
return newal;
}

}


12、练习:

将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

比如:存人对象。同姓名同年龄,视为同一个人。为重复元素。

思路:

1,对人描述,将数据封装进人对象。

2,定义容器,将人存入。

3,取出。

细节:Person p = (Person)it.next();

if(!(obj instanceof Person)) return false;

List集合判断元素是否相同,依据是元素的equals方法。Remove和contains都是依赖于元素的equals方法
ArrayList al = new ArrayList();
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java02");
al.add("java01");
//al.add("java03");
/*
在迭代时循环中next调用一次,就要hasNext判断一次。
Iterator it = al.iterator();
while(it.hasNext())
{
sop(it.next()+"...."+it.next());//这种方式最好不要出现,当集合是奇数时容易发生空指针异常。
}




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

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

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

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

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

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

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

练习体现: 体现set集合的不重复性(通过hashcode()和equals方法确定,对于hashCode建议类似name.hashCode()+age*37;)

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

|--TreeSet:可以对Set集合中的元素进行排序。

底层数据结构是二叉树。

保证元素唯一性的依据:

compareTo方法return 0.

TreeSet排序的第一种方式:

让元素自身具备比较性。

元素需要实现lang包中的Comparable接口,覆盖compareTo方法。

也种方式也成为元素的自然顺序,或者叫做默认顺序。

TreeSet的第二种排序方式。

当元素自身不具备比较性时,或者具备的比较性不是所需要的。

这时就需要让集合自身具备比较性。Until包中的comparator接口覆盖 compare();方法

在集合初始化时,就有了比较方式。
------ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ------


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