a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 122|回复: 0

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

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
面试经验(知识点): 7 m5 W/ e3 S+ v! C: x$ D
java.util.stack(stack即为堆栈)的父类为Vector。可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vector有get方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)。
0 p. Z) I1 `7 R- }# K: r( ]! T对于堆栈和队列只能用push类和get类。 : v; M8 _5 H1 z5 j8 v; ?' x+ I# p
Stack类以后不要轻易使用。
! W8 Z$ u  @/ v! v3 ^实现堆栈一定要用LinkedList。 ! M9 ~% z- n9 C6 _
(在JAVA1.5中,collection有queue来实现队列。)
9 A# F& `/ _) R( {4 P) N  ) f0 h" l) l3 ~
Set-HashSet实现类: 9 `/ q" Z* V1 u  p  b
遍历一个Set的方法只有一个:迭代器(interator)。
) [) u$ r; _- j& r9 DHashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复。 % U: ~5 e. Q4 a6 z: n
在Object中除了有final(),toString(),equals(),还有hashCode()。
1 J' s& l. t# i/ R+ m* T2 Z, c' h' L; ~HashSet底层用的也是数组。 9 S7 ]/ m1 u, b- g; ?
当向数组中利用add(Object o)添加对象的时候,系统先找对象的hashCode: 7 r$ j8 m( @: ]1 e8 n
int hc=o.hashCode(); 返回的hashCode为整数值。
3 k2 j: S4 V, m2 J# {Int I=hc%n;(n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n为6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals()返回的值为true,则说明数据重复。如果equals()返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。 ( s+ j) l& S( {& T- P! X2 j
如果我们能够使两个相同的对象具有相同hashcode,才能在equals()返回为真。
7 N$ l- l+ _4 \在实例中,定义student对象时覆盖它的hashcode。 - o; }: W7 w5 U
因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同的string对象的情况。 2 f: U8 S7 g1 E3 z$ |. b( e
现在,在大部分的JDK中,都已经要求覆盖了hashCode。
! V8 M5 N9 [; ~' t) A  \结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode()和equals(),覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals()返回值为True。 # J: I- i8 g% X- V( w
如果偷懒,没有设定equals(),就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(),从而影响程序执行的效率。
( `" o+ v3 H6 W  
9 I+ L" _& N/ P+ H1 R% U我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)。例子: 7 k) o  c& h0 F* q5 _4 R
public int hashCode(){
- k9 @8 N* V/ x9 O" b  return name.hashcode()+age; 0 Y" r3 z  l1 a- ?
} - K8 D- U& q4 J  z( v$ u
这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。 & M; K! b# k1 i+ p' l# }
  
4 p: Q$ H! B4 ]8 {+ a使用hashSet的优点: : W; ]# W( U( }8 t1 i# X
hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。 - ^, ~3 D! O- `0 l% J+ U
但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。
. t! \7 y3 `# G- q使用hashSet接口时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。 1 \! s' S+ p; s- D* H3 B
  " m' }: x: [* I/ d: c
练习:new一个hashset,插入employee对象,不允许重复,并且遍历出来。
) N& ^! s7 j, Z2 l' M8 \  * O; y" D" i  o
添加知识点:
3 g4 P1 u3 @( w5 ]( s集合对象存放的是一系列对象的引用。 * I( R& z% Z# C2 Z% s* m
例: & Q5 B4 P5 n) V7 S
Student S
8 j6 f7 O* @) G  q. hAl.add(s);
1 U: Z* q" G8 d1 ~3 x6 F' @, r* {s.setName(“lucy”); - Q  r" _  ^0 W. o+ A$ K8 {
Student s2=(Student)(al.get(o1)); : a' Q9 c; G* o* U
可知s2也是s。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 22:35 , Processed in 0.202647 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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