您的位置:首页 > 编程语言 > Java开发

java基础--14

2012-11-24 21:49 253 查看
1、集合类概述

存储对象的一种常用方式

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

数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。

数组中可以存储基本数据类型,集合只能存储对象。

集合类的特点

用于存储对象,长度可变,可以存储不同类型的对象。

集合框架

Collection

List

ArrayList

LinkedList

Vector

Set

HashSet

TreeSet

2、共性方法(Collection)

add方法的参数类型是Object以便接受任意类型的对象

集合中存储的都是对象的引用(地址)

add(Object)//添加元素

size()//获取集合长度

remove(Object)//删除元素 clear()//清空集合 removeAll(Collection)//去掉“一堆”元素

判断元素 contains(Object) isEmpty()

retainAll(Collection)//取交集,al1中只会保留和al2中相同的元素

3、迭代器

迭代器就是取出元素的方式

Iterator it=al.iterator(); it.next(); it.hasNext();

4、List集合共性方法

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

Set:元素师无序的,元素不可以重复。

List:

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



add(index,element);

addAll(index,Collection);



remove(index);



set(index,element)



get(index);

subList(from,to);

listIterator();

5、ListIterator

indexOf

List集合特有的迭代器,ListIterator是Iterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生异常。所以在迭代时只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断、取出、删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.

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

hasPrevious()

previous()

6、List集合具体对象的特点

List

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

LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询慢。

Vector:底层是数组数据结构。线程同步。被ArrayList替代了

7、Vector中的枚举

Enumeration en=v.elements();

en.hasMoreElements();

en.nextElement();

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

其实枚举和迭代是一样的

因为枚举的名称及方法的名称都过长,所以被迭代器取代了。

8、LinkedList

特有方法:

addFirst();

addLast();

getFirst();

getLast();

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

removeFirst();

removeLast();

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

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

offerFirst();

offerLast();

peekFirst();

peekLast();

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

pollFirst();

pollLast();

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

9、LinkedList练习:模拟一个堆栈或者队列数据结构

堆栈:杯子

队列:水管

import java.util.*;

public class LinkedListTest

{

public static void main(String[] args)

{

DuiLie dl=new DuiLie();

dl.add("java01");

dl.add("java02");

dl.add("java03");

dl.add("java04");

while(!dl.isNull())

{

System.out.println(dl.get());

}

}

}

class DuiLie

{

private LinkedList list=null;

DuiLie()

{

list=new LinkedList();

}

public void add(Object obj)

{

list.addFirst(obj);

}

public Object get()

{

return list.removeLast();

//return list.removeFirst();//栈

}

public boolean isNull()

{

return list.isEmpty();

}

}

10、ArrayList练习1

/*去除ArrayList中的重复元素*/

import java.util.*;

public class ArrayListTest

{

public static void main(String[] args)

{

ArrayList al=new ArrayList();

al.add("java01");

al.add("java02");

al.add("java01");

al.add("java02");

al.add("java01");

al.add("java03");

System.out.println(al);

al=(ArrayList)singleElement(al);

System.out.println(al);

}

public static List singleElement(ArrayList al)

{

ArrayList newAl=new ArrayList();

Iterator it=al.iterator();

while(it.hasNext())

{

Object obj=it.next();

if(!newAl.contains(obj))

{

newAl.add(obj);

}

}

return newAl;

}

}

注意:在迭代时循环中next调用一次,就要hasNext判断一次

11、ArrayList练习2

List集合判断元素是否相同,依据是元素的equals方法

import java.util.*;

public class ArrayListTest2

{

public static void main(String[] args)

{

ArrayList al=new ArrayList();

al.add(new Person("zhangsan01",30));

al.add(new Person("zhangsan02",31));

al.add(new Person("zhangsan02",31));

al.add(new Person("zhangsan03",32));

al.add(new Person("zhangsan04",33));

al.add(new Person("zhangsan04",33));

al=(ArrayList)singleElement(al);

Iterator it=al.iterator();

while(it.hasNext())

{

Person p=(Person)it.next();

System.out.println(p.getName()+"..."+p.getAge());

}

}

public static List singleElement(ArrayList al)

{

ArrayList newAl=new ArrayList();

Iterator it=al.iterator();

while(it.hasNext())

{

Object obj=it.next();

if(!newAl.contains(obj))

{

newAl.add(obj);

}

}

return newAl;

}

}

class Person

{

private String name;

private int age;

Person(String name,int age)

{

this.name=name;

this.age=age;

}

public boolean equals(Object obj)

{

if(!(obj instanceof Person))

return false;

Person p = (Person)obj;

return this.name.equals(p.name) && this.age == p.age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

12、HashSet

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

HashSet:底层数据结构是哈希表

TreeSet:

13、HashSet自定义存储对象

HashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成

如果元素的HashCode值相同,才会判断equals是否为true.如果元素的hashCode值不同,不会调用equals

Set的功能和Collection是一样的

import java.util.*;

public class HashSetTest

{

public static void main(String[] args)

{

HashSet hs=new HashSet();

hs.add(new Person("a1",11));

hs.add(new Person("a2",12));

hs.add(new Person("a3",13));

//hs.add(new Person("a4",14));

hs.add(new Person("a2",12));

Iterator it=hs.iterator();

while(it.hasNext())

{

Person p=(Person)it.next();

System.out.println(p.getName()+"..."+p.getAge());

}

}

}

class Person

{

private String name;

private int age;

Person(String name,int age)

{

this.name=name;

this.age=age;

}

public int hashCode()

{

return name.hashCode()+age;

}

public boolean equals(Object obj)

{

if(!(obj instanceof Person))

return false;

Person p = (Person)obj;

return this.name.equals(p.name) && this.age == p.age;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

}

14、HashSet判断和删除的依据

对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode和equals方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: