黑马程序员——集合框架

来源:互联网 发布:淘宝网店软文 编辑:程序博客网 时间:2024/05/20 13:04

------- android培训、java培训、期待与您交流! ----------

一、集合类:

面向对象语言对事物的体现都是以对戏那个的形式,为了方便对多个对戏那个操作,就对对象进行存储,由于对象个数不确定,就引用集合进行存储。

 

二、集合特点:

1,用于存储对象的容器,不能存储基本数据类型

2,集合的长度是可变的。

3,集合中不可以存储基本数据类型值。 

集合容器因为内部的数据结构不同,有多种具体容器。不断的向上抽取,就形成了集合框架。框架的顶层Collection接口:

 

三、Collection的常见方法:

 

1,添加。

boolean add(Object obj): 像集合中添加一个对象,添加成功返回true,否则false;

boolean addAll(Collection coll): 将给定集合的所有兑现添加进集合,添加成功返回true,否则false;

 

2,删除。

boolean remove(object obj): 操作成功,返回true,否则false;以下凡返回类型是boolean型的都同理。

boolean removeAll(Collection coll);

void clear();  清空集合。

3,判断:

boolean contains(object obj): 判断集合中是否包含某个对象。

boolean containsAll(Colllection coll); 是否包含某个集合中的所有对象。

boolean isEmpty():判断集合中是否有元素。 

 

4,获取:

int size(): 获取集合元素个数。

Iterator iterator():取出元素的方式:迭代器。

该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。

对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,

也就是iterator方法。

Iterator接口就是对所有的Collection容器进行元素取出的公共接口。

5,其他:

boolean retainAll(Collection coll);取交集。

Object[] toArray():将集合转成数组。 

 

Collection

|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。

|--Set:元素不能重复,无序。

List:特有的常见方法:有一个共性特点就是都可以操作角标。

1,添加

void add(index,element); 将一个元素添加到集合的指定位置;

void add(index,collection); 将指定集合中的所有元素从指定位置开始添加到集合中。

2,删除;

Object remove(index):

Object set(index,element);

4,获取:

Object get(index);

int indexOf(object);

int lastIndexOf(object);

List subList(from,to);

list集合是可以完成对元素的增删改查。

 

四、List:

|--Vector:内部是数组数据结构,是同步的。增删,查询都很慢!

|--ArrayList:内部是数组数据结构,是不同步的。替代了Vector。查询的速度快。

|--LinkedList:内部是链表数据结构,是不同步的。增删元素的速度很快。

LinkedList:的常见方法

//添加

addFirst();

addLast()

//获取元素但不删除元素,如果集合中没有元素,则会NoSuchElementException异常

getFirst();

getLast();

//获取元素但元素被删除,如果集合中没有元素,则会NoSuchElementException异常

removeFirst();

removeLast();

 

JDK1.6 出现了替代方法:

offerFirst();

offerLast();

 

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

peakFirst();

peakLast();

//获取元素但不删除元素,如果集合中没有元素,则返回null.

poolFirst();

poolLast();

 

ArrayList /LinkedList 的contains();remove()方法依赖的都是equals().

 

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

Set接口中的方法和Collection一致。

|--HashSet: 内部数据结构是哈希表 ,是不同步的。

如何保证该集合的元素唯一性呢?

是通过对象的hashCode和equals方法来完成对象唯一性的。

如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true。

如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。

一般情况下,如果定义的类会产生很多对象通常都需要覆盖equals,hashCode

方法。

建立对象判断是否相同的依据。

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

判断元素唯一性的方式:就是根据比较方法的返回结果是否是0,是0,就是相同元素,不存。  

TreeSet对元素进行排序的方式一:

让元素自身具备比较功能,元就需要实现Comparable接口。覆盖compareTo方法。

如果不要按照对象中具备的自然顺序进行排序。如果对象中不具备自然顺序。可以使用

TreeSet集合第二种排序方式二:

让集合自身具备比较功能,定义一个类实现Comparator接口,覆盖compare方法。

将该类对象作为参数传递给TreeSet集合的构造函数。

如果相同,再判断两个对象的内容是否相同。

判断哈希值相同,其实判断的是对象的hashCode的方法。判断内容相同,用的是equals方法。

注意:如果哈希值不同,是不需要判断equals。

import java.util.*;

 

/*

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

这时需要让容器自身具备比较性。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

 

当两种排序都存在时,以比较器为主。

 

定义一个类,实现Comparator接口,覆盖compare方法。

 

 

*/

class Student implements Comparable//该接口强制让学生具备比较性。

{

    private String name;

    private int age;

 

    Student(Stringname,int age)

    {

        this.name = name;

        this.age = age;

    }

 

    public intcompareTo(Object obj)

    {

 

        //return 0;

       

        if(!(objinstanceof Student))

            throw newRuntimeException("不是学生对象");

        Student s =(Student)obj;

 

        //System.out.println(this.name+"....compareto....."+s.name);

        if(this.age>s.age)

            return 1;

        if(this.age==s.age)

        {

            returnthis.name.compareTo(s.name);

        }

        return -1;

        /**/

    }

 

    public StringgetName()

    {

        return name;

 

    }

    public int getAge()

    {

        return age;

    }

}

class TreeSetDemo2

{

    public static voidmain(String[] args)

    {

        TreeSet ts = newTreeSet();

 

        ts.add(newStudent("lisi02",22));

        ts.add(newStudent("lisi02",21));

        ts.add(newStudent("lisi007",20));

        ts.add(newStudent("lisi09",19));

        ts.add(newStudent("lisi06",18));

        ts.add(newStudent("lisi06",18));

        ts.add(newStudent("lisi007",29));

        //ts.add(newStudent("lisi007",20));

        //ts.add(newStudent("lisi01",40));

 

        Iterator it =ts.iterator();

        while(it.hasNext())

        {

            Student stu =(Student)it.next();

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

        }

    }

}

 

class MyCompare implements Comparator

{

    public intcompare(Object o1,Object o2)

    {

        Student s1 =(Student)o1;

        Student s2 =(Student)o2;

 

        int num =s1.getName().compareTo(s2.getName());

        if(num==0)

        {

 

            return newInteger(s1.getAge()).compareTo(new Integer(s2.getAge()));

            /*

            if(s1.getAge()>s2.getAge())

                return 1;

            if(s1.getAge()==s2.getAge())

                return 0;

            return -1;

            */

        }

 

       

        return num;

 

    }

}