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

黑马程序员--集合框架(collection)

2015-11-30 22:06 519 查看
-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一集合概述

1集合概述:Java是面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储。而对多个元素进行存储,前面我们学习过数组,数组的弊端,长度固定。这样,数组将不能满足变化的要求。所以,Java就提供了集合供我们使用。

2集合的特点:长度可以发生改变。只能存储对象。可以存储多种类型对象(一般存储的还是同一种,因为1.5JDK的新特性
泛型)。

3集合和数组的区别:长度问题:数组固定。集合可变。存储元素问题:数组可以是基本类型,也可以是引用类型。集合只能是引用类型。(JDK1.5以后还可以存储基本数据类型,因为JDK1.5自动装箱拆箱)是否同一类型:数组元素类型一致。集合元素类型可以不一致。(建议还是同一种类型,因为JDK1.5出现了泛型)功能是否一致:数组只能对数据进行存取操作,当然删除数组中的元素还可以删除,就是null。集合不但可以对数据进行基本操作,还提供了更强大的功能,比如删除
修改...。

4集合体系的由来:合是存储多个元素的容器,但是,由于数据结构不同,Java就提供了多种集合类。而这多种集合类有共性的功能,所以,通过不断的向上抽取,最终形成了集合体系结构。
为什么会出现这么多的容器呢?因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构。
5Collection:定义了集合框架的共性功能。 

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

|--------ArrayList:底层是数组数据结构,查询速度很快,但是增删稍慢,线程不同步,默认10个元素。(线程不同步) 

|--------LinkedList:底层是链表数据结构,查询很慢,增删速度很快。(线程不同步) 

|--------Vector:底层是数组数据结构,和ArrayList一样,查询,增删,都很慢,Vector是1.0出现,ArrayList是1.2出现,(线程同步)但已经不用了。 

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

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

采用散列函数对元素进行排序(Asiic),是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。

|--LinkedHashSet:有序。 

内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。  

|--TreeSet:底层的数据结构是二叉树。线程是不同步的。 

对Set集合中的元素的进行指定(我们指定的比较器)顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。 

采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。 

需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。  

二Collection中的方法:

1、添加:
boolean add(E e):一次添加一个元素。
boolean addAll(Collection):将一个容器中的元素添加到当前容器中。
2、删除:
boolean remove(Object o):删除一个指定对象。
boolean removeAll(Collection c):删除参数容器和本容器中相同的元素。
void clear():直接将容器中的元素清空。
3、判断:
boolean contains(Object o):是否包含指定元素。
boolean containsAll(Collection c):是否包含指定容器中的元素。容器中元素发生变化为ture
boolean inEmpty():是否有元素,是否为空。
import java.util.*;
class Collection1
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java03");
al.remove("java01");
System.out.println(al);
System.out.println(al.size());
}
}

取出方式:

每个集合都有自己的数据结构,那么取出自己内部元素的方式也不同,那么这种取出方式就被定义成了内部类,但是共性是判断,取出。所以这些在不同集合中的内部类都符合一个规则,该规则就是Iterator,获取集合的取出对象的方法就是iterator()方法。即遍历Collection中的每一个元素,不论Collection的实际类型如何,它都支持一个该iterator()方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

   Iterator it=al.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}Vertor中特有的取出器为Enumeration.举例如下:
Vector b=new Vector();
v.add("java01");
v.add("java02");
v.add("java03");
Enumeration e=v.elements();
while (e.hasMoreElements)
{
System.out.println(e.nextElement());
}

三LinkedList

LinkedList中特有操作方法:

getFirst();返回此列表的第一个元素。如果列表为空,抛出异常。
getLast();返回此列表的最后一个元素。如果列表为空,抛出异常。
jdk1.6以后。
offerFirst();返回此列表的第一个元素。如果列表为空,返回null。
offerLast();返回此列表的最后一个元素。如果列表为空,返回null。
 
removeFirst();移除并返回此列表的第一个元素。如果列表为空,抛出异常。
removeLast(); 移除并返回此列表的最后一个元素。如果列表为空,抛出异常。
jdk1.6以后。
pollFirst();移除并返回此列表的第一个元素。如果列表为空,返回null
pollLast();移除并返回此列表的最后一个元素。如果列表为空,返回null

四举例分析Arraylist和HashSet

1List集合中判断元素是否相同,依据的是元素的equals方法
定义一对象:人。同姓名、同年龄是为同一个人;
import java.util.*;
class ArrayList111
{
public static void main(String[] args)
{
ArrayList<Person> al=new ArrayLis
a39d
t<Person>();
al.add(new Person("zhangsan",20));
al.add(new Person("zhan",43));
al.add(new Person("zhang",40));
al.add(new Person("lin",20));
al.add(new Person("zhangsan",20));
System.out.println(al);
al=quchong(al);
Iterator<Person> it=al.iterator();
while (it.hasNext())
{
Person p=it.next();
System.out.println(p.getName()+"....."+p.getAge());
}

}
public static ArrayList<Person> quchong(ArrayList<Person> al)
{
Iterator<Person> it=al.iterator();
ArrayList<Person> newal=new ArrayList<Person>();
while (it.hasNext())
{
Person p=it.next();
if (!newal.contains(p))
{
newal.add(p);
}
}
return newal;
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.age=age;
this.name=name;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public boolean equals(Object obj)
{
if (!(obj instanceof Person))
{
return false;
}
Person p=(Person) obj;
System.out.println(this.name+"//////equals////"+p.name);
return this.name.equals(p.name) && this.age==p.age;
}
}
2HashSet:底层数据结构是哈希表数据结构。线程是非同步的。
HashSet是如何保证元素唯一的呢?是通过两个方法来完成的:hashCode和equals来完成的。如果元素的hashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals方法。所以在使用时经常会复写hashCode和equals方法。并且hashCode和equals方法的是底层调用的,并不是我们自己调用的。
import java.util.*;
class HashSet1
{
public static void main(String[] args)
{

HashSet<Person> hs=new HashSet<Person>();
hs.add(new Person("lisi",29));
hs.add(new Person("zhangsan",93));
hs.add(new Person("abing",80));
hs.add(new Person("abing",80));
hs.add(new Person("zhangsan",65));
Iterator<Person> it=hs.iterator();
while (it.hasNext())
{
Person p=it.next();
System.out.println(p.getName()+"......"+p.getAge());
}

}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.age=age;
this.name=name;
}
public int hashCode()
{
System.out.println(this.name+"...hashcode");
return name.hashCode()+age;
}
public boolean equals(Object obj)
{
if (!(obj instanceof Person))
{
return false;
}
Person p=(Person) obj;

System.out.println(this.name+",,,,,,,,,,,,"+p.name);
return this.age==p.age && this.name.equals(p.name);
}
public int getAge()
{
return age;
}
public String getName()
{
return name;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: