JAVA笔记二做开发的必备

面试经验(知识点):

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

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

Stack类以后不要轻易使用。

!!!实现堆栈一定要用LinkedList。

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

Set-HashSet实现类:

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

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

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

HashSet底层用的也是数组。

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

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

IntI=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还是可能相同的)。例子:

publicinthashCode(){

returnname.hashcode()+age;

}

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

使用hashSet的优点:

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

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

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

练习:new一个hashset,插入employee对象,不允许重复,并且遍历出来。

添加知识点:

集合对象存放的是一系列对象的引用。

例:

StudentS

Al.add(s);

s.setName(“lucy”);

Students2=(Student)(al.get(o1));

可知s2也是s。

12.05

SortedSet可自动为元素排序。

SortedSet的实现类是TreeSet:它的作用是字为添加到TreeSet中的元素排序。

练习:自定义类用TreeSet排序。

与HashSet不同,TreeSet并不需要实现HashCode()和equals()。

只要实现







































昆明白癜风正规医院
北京治愈白癜风的医院



转载请注明:http://www.xxcyfilter.com/zyjn/4395.html