锁定老帖子 主题: corejava辅导(8--2)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | |||||||||||
发表时间:2008-12-03
最后修改:2008-12-03
实现堆栈 1,数组(ArrayList,增删效率比较低,不适合) 2,LinkedList(实现堆栈的好方法) 3,java.util.Stack类,Stack是Vector的子类,Vector类是一个线程安全的(是一个重量级的类),并继承了Vector的方法,Verctor类(这个类也是List接口的实现类)和ArrayList的功能近乎相同。(不推荐使用Stack类来实现堆栈)。
Set接口的实现类
1)HashSet
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; } }
LinkedSet是Set接口的实现类,他的底层是用链表实现的,他的增删效率很高,常用于过滤重复对象。 SortedSet接口是Set的子接口。
TreeSet是SortedSet接口的实现类,他可以对集合中的元素进行排序。 要存放在TreeSet中自定义类的对象,这个类要么是已经实现了Comparable接口,要么是能给出Comparator比较器,TreeSet可以自动过滤掉重复元素所以不用重载hashCode()方法,TreeSet会根据比较规则判断元素内容是否相同,TreeSet会在元素存入世就进行了排序。(在TreeSet给出排序规则时,一定要注意对象内容相等的条件,一定要注意在主观的认为两个对象内容相同时,才可以使用比较少的条件来进行判断)
在要排序时才使用TreeSet类(存储效率比较低),HashSet的存储效率比较高,在需要为HashSet的对象排序时,就可以把HashSet中的元素放入TreeSet。
Map接口的实现类
Map中只可以存放键值对(Key,value),其中Key是不可以重复的。Key和value是一一对应的。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||
返回顶楼 | ||||||||||||
浏览 1269 次