Java中集合类的区别

来源:java认证发布时间:2012-11-12 13:12:48java认证视频

  Vector

  (与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。)

  结论:在考虑并发的情况下用Vector(保证线程的安全)。

  在不考虑并发的情况下用ArrayList(不能保证线程的安全)。

  java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。

  对于堆栈和队列只能用push类和get类。

  Stack类以后不要轻易使用。

  实现栈一定要用LinkedList。

  (在JAVA1.5中,collection有queue来实现队列。)

  Set-HashSet实现类:

  遍历一个Set的方法只有一个:迭代器(interator)。

  HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。

  在Object中除了有finalize(),toString(),equals(),还有hashCode()。

  HashSet底层用的也是数组。

  当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode:

  int hc=o.hashCode(); 返回的hashCode为整数值。

  Int I=hc%n;(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n为6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。

  如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。

  在实例中,定义student对象时覆盖它的hashcode。

  因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。

  现在,在大部分的JDK中,都已经要求覆盖了hashCode。

  结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。

  如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。

  我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。

  例子:

  public int hashCode(){

  return name.hashcode()+age;

  }

  这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。

  使用hashSet的优点:

  hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。

  但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。

  使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。

  1.1.4. 比较

  Collections类(工具类―――全是static 方法)

  Public static int binarySearch(List list,Object key)

  Public static void Sort(List list,Comparator com)

  Public static void sort(List list)

  方法一:

  Comparator接口

  Int compare(Object a,Object b)

  Boolean equals(Object o)

  例子:

  import java.util.*;

  public class Test {

  public static void main(String[] arg) {

  ArrayList al = new ArrayList();

  Person p1 = new Person("dudi");

  Person p2 = new Person("cony");

  Person p3 = new Person("aihao");

  al.add(p1);

  al.add(p2);

  al.add(p3);

  Collections.sort(al,p1);

  for(Iterator it = al.iterator();it.hasNext();){

  Person p = (Person)it.next();

  System.out.println(p.name);

  }

  }

  }

  class Person implements java.util.Comparator

  {

  public String name;

  public Person(String name){

  this.name = name;

  }

  public int compare(Object a,Object b){

  if(a instanceof Person&&b instanceof Person){

  Person pa = (Person)a;

  Person pb = (Person)b;

  return pa.name.compareTo(pb.name);

  }

  return 0;

  }

  public boolean equals(Object a){return true;}

  }

  方法二

  Java.lang.Comparable

  Public int compareTo(Object o)

  Class Person implements java.lang.Comparable{

  Public int compareTo(Object o){

  Comparable c1=(Comparable)this;

  Comparable c2=(Comparable)o;

  Return c1.name.compareTo(c2.name );

  }

  }

  ……………………………….

  }

上一页12下一页

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答