a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 121|回复: 0

[基础知识] JAVA面向对象编程课堂笔记21

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
面试经验(知识点):
. f* Z' B" K1 v" }java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
) O% d1 A, C' p对于堆栈和队列只能用push类和get类。
6 z/ `! ]! g& t+ E+ v: e6 hStack类以后不要轻易使用。 0 ~5 x: u  [+ Y; l$ p* s! A' V
实现堆栈一定要用LinkedList。
4 E; F- X0 ?& J- J8 y(在JAVA1.5中,collection有queue来实现队列。) ' K' @4 z; f% n( e$ o
  ( M, ~6 w( {. m* _$ J! Y2 t
Set-HashSet实现类:
6 k: c! T- M3 l8 p! c遍历一个Set的方法只有一个:迭代器(interator)。
+ Y; u8 {) l: E* R: O0 }! \HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。 6 ~5 k  `( V$ J% E" G6 C
在Object中除了有final(),toString(),equals(),还有hashCode()。
0 Y! c$ O. _: x' g- L9 XHashSet底层用的也是数组。
4 I& y3 h- l& E' |4 Q' A* a% u9 J* o当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode: ' w* L  b8 C% J" Q( N' S" z6 y
int hc=o.hashCode(); 返回的hashCode为整数值。
# S3 d9 ^$ v" k/ P* n6 T& sInt I=hc%n;(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n为6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。 1 u: [) c2 J/ l" |3 E2 I
如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。   n4 g6 ^7 [9 |* }5 \* z6 H
在实例中,定义student对象时覆盖它的hashcode。
. z" w6 X. ?9 R5 q4 q4 h0 N因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。
% ^( R2 _7 B1 D; [$ k1 t' _' R, ^现在,在大部分的JDK中,都已经要求覆盖了hashCode。
" W  T5 Q" Q7 [2 Q结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。
* i1 h8 t* j  n! d如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。 % i+ t" N8 q8 |3 `( E
  
% V* b$ J" p& m) Y3 ~我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。例子:
5 M( a9 L2 b' \  R# I) x5 L8 ]public int hashCode(){ 3 Z" e) V" c% ^. m$ G
  return name.hashcode()+age;
3 H6 {$ n8 B2 c/ }+ i, I}
. F6 O4 ^4 f( @, U% O这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。 : y9 _7 e* S- F' g3 [
  
4 r0 ~! x2 O# ^使用hashSet的优点:
0 S% a/ s  u4 X; k, m& |% ghashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。 4 v! i* Z: q9 R' w. k" ~
但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。
% \) F3 ]0 a- ~8 I! o; i使用hashSet接口时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。 4 V2 t7 s2 z; }  d; ]& b3 O
  0 S: D( W' @- i
练习:new一个hashset,插入employee对象,不允许重复,并且遍历出来。 ' u2 w; k2 ]+ n/ l- j
  $ s: Y8 G5 `. f2 x( P1 }, N/ r9 U
添加知识点: ; C: Y9 Z# P9 _3 [3 n1 Y
集合对象存放的是一系列对象的引用。
7 a4 H3 l$ E, C- |9 x1 H  Q) j例:
. l% i: p. Y5 k" h9 }# X+ @* fStudent S
" L* L2 F: _5 f' p, U1 ~6 O0 zAl.add(s); 8 m) O9 f; L: X1 X9 d
s.setName(“lucy”);
* L. v# t5 k, NStudent s2=(Student)(al.get(o1)); ' e& G5 d. d/ g$ q
可知s2也是s。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-7 21:31 , Processed in 0.195174 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表