`
heimeiyingwang
  • 浏览: 94940 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

corejava辅导(8--2)

阅读更多

实现堆栈

1,数组(ArrayList,增删效率比较低,不适合)

2LinkedList(实现堆栈的好方法)

3java.util.Stack类,StackVector的子类,Vector类是一个线程安全的(是一个重量级的类),并继承了Vector的方法,Verctor类(这个类也是List接口的实现类)和ArrayList的功能近乎相同。(不推荐使用Stack类来实现堆栈)。

 

Set接口的实现类

   Set接口

                         SortedSet接口

                                         TreeSet

                    HashSet

 

                       LinkedSet

 

1HashSet

 

Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的,HashSet的底层实现还是数组。

 

Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模,模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。如果数组中的元素和要加入的对象的hashCode()返回了相同的Hash(相同对象),才会用equals()方法来判断两个对象的内容是否相同。

 

Hash算法是一种散列算法。

 

注意:所以要存入HashSet的集合对象中的自定义类必须覆盖hashCode(),equals()两个方法,才能保证集合中元素容不重复。在覆盖和hashCode()方法时,要使相同对象的hashCode()方法返回相同值,覆盖equals()方法再判断其内容。为了保证效率,所以在覆盖hashCode()方法时,也要尽量使不同对象尽量返回不同的Hash码值。

 

 

例:

要向HashSet中的添加自定义类型的对象并保证对象在HashSet中的唯一性的话,就要覆盖hashCode()方法和equals()方法。

 

import java.util.*;

public class TestSet {

     public static void main(String[] args) {

         Set s=new HashSet();

         TarenaStudent s1=new TarenaStudent("Liucy",30);

         TarenaStudent s2=new TarenaStudent("Hiloo",29);

         TarenaStudent s3=new TarenaStudent("Chenzq",33);

         TarenaStudent s4=new TarenaStudent("Liucy",30);

         s.add(s1);

         s.add(s2);

         s.add(s3);

         s.add(s4);

         System.out.println();

         print(s);

     }

     static void print(Collection c){

         Iterator it=c.iterator();

         while(it.hasNext()){

              System.out.println(it.next());

         }

     }

}

 

class TarenaStudent{

     String name;

     int age;

     public TarenaStudent(String name, int age) {

         super();

         // TODO Auto-generated constructor stub

         this.name = name;

         this.age = age;

     }

     public String toString(){

         return "Student: "+name+" age="+age;

     }

     public boolean equals(Object o){

         System.out.println(this+" equals "+o);

          if (o==null) return false;

         if (this==o) return true;

         if (o.getClass()!=this.getClass()) return false;

         TarenaStudent t=(TarenaStudent)o;

         if ((this.name.equals(t.name)) && this.age==t.age) return true;

         else return false;

     }

     public int hashCode(){

         return this.name.hashCode()+this.age;

     }

}

 

LinkedSetSet接口的实现类,他的底层是用链表实现的,他的增删效率很高,常用于过滤重复对象。

SortedSet接口Set子接口

 

TreeSetSortedSet接口的实现类,他可以对集合中的元素进行排序。

要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入世就进行了排序。(在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)

 

在要排序时才使用TreeSet类(存储效率比较低),HashSet的存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet

 

 

Map接口的实现类

                Map接口

                          SortedMap接口

                                  TreeMap

 

                          HashMap类

                       Hashtable

                                  Properties

Map中只可以存放键值对(Keyvalue),其中Key是不可以重复的。Keyvalue是一一对应的。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics