黑马程序员类集框架中的接口和实现

来源:互联网 发布:手机登录淘宝卖家中心 编辑:程序博客网 时间:2024/06/05 03:40

------- <a href="http://www.itheima.com" target="blank">android培训</a><a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

黑马程序员类集框架中的接口和实现

1.       Collection接口是构造类集框架的基础,声明所有类集都将拥有的核心方法。调用add()方法可以将对象加入类集。注意add()带一个Object类型的参数。因为Object是所有类的超类,所以任何类型的对象可以被存储在一个类集中,然而原始类型不行。例如,一个类集不能直接存储类型intchardouble等的值。当然如果想存储这些对象,也可以使用原始类型包装器。可以通过调用addAll()方法将一个类集的全部内容增加到另一个类集中。可以调用remove()方法将一个对象删除。为了删除一组对象,可以调用removeAll()方法。调用retainAll()方法可以将除了一组指定的元素之外的所有元素删除。为了清空类集,可以调用clear()方法。通过调用contains()方法,可以确定一个类集是否包含了一个指定的对象。为了确定一个类集是否包含了另一个类集的全部元素,可以调用containsAll()方法。当一个类集是空的时候,可以通过调用isEmpty()方法予以确认。调用size()方法可以获得类集中当前元素的个数。一个更重要的方法是iterator(),该方法对类集返回一个迭代程序。

2.       List接口继承了Collection并声明存储一系列元素的类集的特性。为了获得在指定位置存储的对象,可以用对象的下标调用get()方法。为了给类表中的一个元素赋值,可以调用set()方法,指定被改变的对象的下标。调用indexOf()lastIndexOf()可以得到一个对象的下标。调用suList()方法,可以获得列表的一个指定了开始下标和结束下标的子列表。

3.       ArrayList类实现了List接口。ArrayList支持可随需要而增长的动态数组。在Java中,标准数组是定长的。在数组创建之后,它们不能被加长或缩短,这也就意味着我们必须事先指定数组可以容纳多少元素。但是,我们直到运行时才能知道需要多大的数组。为了解决这个问题,类集框架定义了ArrayList。本质上,ArrayList对象引用的是一个变长数组。数组类表以一个原始大小被创建。当超过了它的大小,类集自动增大。当对象被删除后,数组就可以缩小。当使用ArrayList时,有时想要获得一个实际的数组,这个数组包含了类表的内容。可以通过调用方法toArray()来实现它。下面几个是为什么可能想将类集转换成为数组的原因

(1)       对于特定的操作,可以获得更快的处理时间

(2)       为了给方法传递数组,而方法不必重载去接收类集

(3)       为了将新的基于类集的程序与不认识类集的老程序集成

package com.heima.exam;

 

import java.util.ArrayList;

 

publicclass ArrayListTest {

    publicstaticvoid main(String[] args)

    {

       ArrayList<String> arrayList =new ArrayList<String>();

      

       arrayList.add("hello");

       arrayList.add("world");

       arrayList.add("world");

       arrayList.add("welcome");

      

       String s1 = (String)arrayList.get(0);

       String s2 = (String)arrayList.get(1);

       String s3 = (String)arrayList.get(2);

       String s4 = (String)arrayList.get(3);

      

       System.out.println(s1);

       System.out.println(s2);

       System.out.println(s3);

       System.out.println(s4);

      

       System.out.println("------------");

      

       for(int i = 0; i < arrayList.size(); i++)

       {

           System.out.println(arrayList.get(i));

       }

      

      

       //arrayList.clear();

      

       //System.out.println(arrayList.isEmpty());

      

      

       arrayList.remove(0);

       arrayList.remove("welcome");

      

       System.out.println("------------");

      

       for(int i = 0; i < arrayList.size(); i++)

       {

           System.out.println(arrayList.get(i));

       }

      

       System.out.println("--------------");

      

      

       arrayList.add("aaa");

       arrayList.add("bbb");

      

       System.out.println(arrayList.indexOf("world"));

          

    }

}

 

 

4.       LinkedList类实现List接口。它提供了一个链接列表数据结构。除了它继承的方法之外,LinkedList类本身还定义了一些有用的方法,这些方法主要用于操作和访问列表。使用addFirst()方法可以在列表头增加元素;使用addLast()方法可以在列表的尾部增加元素。调用getFirst()法可以获得第一个元素。调用getLast()方法可以得到最后一个元素。为了删除第一个元素,可以使用removeFirst()方法;为了删除最后一个元素,可以调用removeLast()方法。LinkedList是采用双向循环链表实现的。

package com.heima.exam;

 

import java.util.LinkedList;

 

publicclass LinkedListTest

{  

    publicstaticvoid main(String[] args)

    {

       LinkedList<String> list =new LinkedList<String>();

      

       list.add("F");

       list.add("B");

       list.add("D");

       list.add("E");

       list.add("C");

      

       list.addLast("Z");

       list.addFirst("A");

      

       list.add(1, "A2");

       

       System.out.println("最初的集合:" + list);

      

       list.remove("F");

       list.remove(2);

      

       System.out.println("变化之后的集合:" + list);

      

       Object value = list.get(2);

       list.set(2, (String)value +"changed");

      

       System.out.println("最后的集合:" + list);

      

    }

}

5.       Set接口继承了Collection并声明不允许重复元素的特性。因此,如果试图将重复元素加到集合中时,add()方法将返回false。它本身并没有定义任何附加的方法。

6.       SortedSet接口继承Set并说明了按升序排列的集合的特性。SortedSet定义了对集合处理更加方便的方法。调用first()方法,可以获得集合中的第一个对象。调用last()方法,可以获得集合中的最后一个元素。调用subSet()方法,可以获得排序集合的一个指定了第一个和最后一个对象的子集合。如果需要得到从集合的第一个元素开始的一个子集合,可以使用headSet()方法。如果需要获得集合尾部的一个子集合,可以使用tailSet()方法。

7.       HashSet实现Set接口。它创建一个类集,该类集使用散列表进行存储。散列表通过使用称之为散列法的机制来存储信息。在散列中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码。而散列码被用来当做与关键字相连的数据的存储下标。关键字到其散列码的转换是自动执行的。散列法的优点在于即使对于大的集合,它允许一些基本操作如add()contains()remove()size()方法的运行时间保持不变

8.       TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储。访问和检索是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。下面我来说一下Set接口怎样保证集合中没有重复的元素:当使用hashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。如果我们重写了equals方法,那么也要重写hashCode方法,反之亦然。

关于Object类的hashCode()方法的特点:

(1)       java应用的一次执行过程当中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化)。

(2)       对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的。

(3)       对于两个对象来说,如果使用equals方法比较返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提供应用的性能。

(4)       对于Object类来说,不同的Object对象的hashCode值是不同的(Object类的hashCode值表示的是对象的地址)。

 

package com.heima.exam;

 

import java.util.HashSet;

 

publicclass SetTest1

{

    publicstaticvoid main(String[] args)

    {

       HashSet<People> set1 = new HashSet<People>();

      

       set1.add(new People("zhangsan"));

       set1.add(new People("lisi"));

      

    People p1 = new People("zhangsan");

      

    System.out.println(set1.add(p1));

    System.out.println(set1.add(p1));

      

       String s1 = new String("a");

       String s2 = new String("a");

      

       System.out.println("hash code: " + (s1.hashCode() == s2.hashCode()));

      

       HashSet<String> set2 = new HashSet<String>();

       set2.add(s1);

       set2.add(s2);

      

       System.out.println(set2);

    }

}

 

class People

{

    String name;

 

    public People(String name)

    {

       this.name = name;   

    }

 

}

 

 

当我们自定义equals()方法和hashCode()方法后,代码如下

package com.heima.exam;

 

import java.util.HashSet;

 

publicclass SetTest2

{

    publicstaticvoid main(String[] args)

    {

       HashSet<Student> set = new HashSet<Student>();

 

       Student s1 = new Student("zhangsan");

       Student s2 = new Student("zhangsan");

 

       System.out.println(set.add(s1));

       System.out.println(set.add(s2));

 

       System.out.println(set);

 

    }

}

 

class Student

{

    String name;

 

    public Student(String name)

    {

       this.name = name;

    }

 

    publicint hashCode()

    {

       finalint prime = 31;

       int result = 1;

       result = prime * result + ((name ==null) ? 0 :name.hashCode());

       return result;

    }

 

    publicboolean equals(Object obj)

    {

       if (this == obj)

           returntrue;

       if (obj ==null)

           returnfalse;

       if (getClass() != obj.getClass())

           returnfalse;

       Student other = (Student) obj;

       if (name ==null)

       {

           if (other.name !=null)

              returnfalse;

       }

       elseif (!name.equals(other.name))

           returnfalse;

       returntrue;

    }

 

}

 

 

package com.heima.exam;

 

import java.util.TreeSet;

 

publicclass TreeSetTest

{

    publicstaticvoid main(String[] args)

    {

       TreeSet<String> set = new TreeSet<String>();

      

       set.add("C");

       set.add("A");

       set.add("B");

       set.add("E");

       set.add("F");

       set.add("D");

      

       System.out.println(set);

      

    }

}

9.       关于集合使用时的注意事项

(1)       集合中存的依然是对象的引用而不是对象本事

(2)       对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价较高

(3)       集合当中只能放置对象的引用,无法放置原生数据类型,我们需要使用原生数据类型的包装类才能加入到集合当中。

(4)       集合当中放置的都是Object类型,因此取出来的也是Object类型,那么必须要使用强制类型转换将其转换为真正的类型(能够放置进去的类型)。

(5)       关于ArrayListLinkedList的比较:1.ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。2.当执行插入或者删除操作时,采用LinkedList比较好。3.当执行搜索操作时,采用ArrayList比较好。

10. 工具类Collections是集合框架中的一个工具类。该类中的方法都是静态的,提供的方法中有可以对list集合进行排序,二分查找等方法。
11. 通常常用的集合都是线程不安全的。因为要提高效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的对集合进行遍历。

12. StringBuffer是字符串缓冲区,是一个容器,特点:1.长度是可变化的。2.可以字节操作多个数据类型。3.最终会通过toString方法变成字符串。JDK1.5版本之后出现了StringBuilder。StringBuffer是线程同步,StringBuilder是线程不同步。以后开发,建议使用StringBuilder,因为它有三个主要优点:1.提高效率。2.简化书写。3.提高安全性。

原创粉丝点击