O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c - - PowerPoint PPT Presentation
O O P w i t h J a v a Y u a n b i n Wu c s @e c n u O O P w i t h J a v a P 6 9 r o j e c t 6 : 6 , (
O O P w i t h J a v a
- 通知
– P
r
- j
e c t 6 : 6 月 6 日晚 9 点
- 复习
– 继承
- 代码复用
- 向上转换 ,
多态 ( 父类与子类的类型转换 )
– 接口
- 代码复用
- 向上转换 ,
多态 ( 多个父接口 )
– 内部类
- 代码复用
- 向上转换 ,
多态 ( 灵活实现多继承 )
- 复习
– 内部类
- 定义在一个类的内部
c l a s s O u t e r { … c l a s s I n n e r { . . . } . . . }
p u b l i c c l a s s P a r c e l { c l a s s C
- n
t e n t s { p r i v a t e i n t i = 1 1 ; p u b l i c i n t v a l u e ( ) { r e t u r n i ; } } c l a s s D e s t i n a t i
- n
{ p r i v a t e S t r i n g l a b e l ; D e s t i n a t i
- n
( S t r i n g r ) { l a b e l = r ; } S t r i n g r e a d L a b e l ( ) { r e t u r n l a b e l ; } } p u b l i c D e s t i n a t i
- n
t
- (
S t r i n g s ) { r e t u r n n e w D e s t i n a t i
- n
( s ) ; } p u b l i c C
- n
t e n t s c
- n
t e n t s ( ) { r e t u r n n e w C
- n
t e n t s ( ) ; } p u b l i c v
- i
d s h i p ( S t r i n g d e s t ) { C
- n
t e n t s c = n e w C
- n
t e n t s ( ) ; D e s t i n a t i
- n
d = n e w D e s t i n a t i
- n
( d e s t ) ; S y s t e m .
- u
t . p r i n t l n ( d . r e a d L a b e l ( ) ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P a r c e l p = n e w P a r c e l ( ) ; P a r c e l . D e s t i n a t i
- n
d = p . t
- (
“ T a s m a n i a ” ) ; P a r c e l . C
- n
t e n t s c = p . c
- n
t e n t s ( ) ; } }
- 复习
– 内部类
- 每个内部类对象包含的有一个外部类对象的引用
– O
u t e r C l a s s N a m e . t h i s
- 创建内部类
– 在外部类的方法中 :
直接创建
– 在其他地方 :
O u t e r C l a s s O b j e c t . n e w
p u b l i c c l a s s P a r c e l { c l a s s C
- n
t e n t s { p r i v a t e i n t i = 1 1 ; p u b l i c i n t v a l u e ( ) { r e t u r n i ; } } c l a s s D e s t i n a t i
- n
{ p r i v a t e S t r i n g l a b e l ; D e s t i n a t i
- n
( S t r i n g r ) { l a b e l = r ; } S t r i n g r e a d L a b e l ( ) { r e t u r n l a b e l ; } } p u b l i c D e s t i n a t i
- n
t
- (
S t r i n g s ) { r e t u r n n e w D e s t i n a t i
- n
( s ) ; } p u b l i c C
- n
t e n t s c
- n
t e n t s ( ) { r e t u r n n e w C
- n
t e n t s ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P a r c e l p = n e w P a r c e l ( ) ; P a r c e l . D e s t i n a t i
- n
d = p . n e w D e s t i n a t i
- n
( “ T ” ) ; P a r c e l . C
- n
t e n t s c = p . n e w C
- n
t e n t s ( ) ; } }
- 复习
– 匿名内部类
- 没有名字的内部类
- 必须继承某个类 ,
或实现某个接口
p u b l i c c l a s s P a r c e l { p u b l i c C
- n
t e n t s c
- n
t e n t s ( ) { r e t u r n n e w C
- n
t e n t s ( ) { / / a n
- n
y m
- u
s i n n e r c l a s s d e fi n i t i
- n
p r i v a t e i n t i = 1 1 ; p u b l i c i n t v a l u e ( ) { r e t u r n i ; } } ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P a r c e l p = n e w P a r c e l ( ) ; C
- n
t e n t s c = p . c
- n
t e n t s ( ) ; } } p u b l i c c l a s s P a r c e l { c l a s s P C
- n
t e n t s i m p l e m e n t s C
- n
t e n t s { p r i v a t e i n t i = 1 1 ; p u b l i c i n t v a l u e ( ) { r e t u r n i ; } } p u b l i c C
- n
t e n t s c
- n
t e n t s ( ) { r e t u r n n e w P C
- n
t e n t s ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P a r c e l p = n e w P a r c e l ( ) ; C
- n
t e n t s c = p . c
- n
t e n t s ( ) ; } }
- 复习
– 通过内部类灵活实现多继承
i n t e r f a c e A { } i n t e r f a c e B { } c l a s s X i m p l e m e n t s A , B { } c l a s s Y i m p l e m e n t s A { B m a k e B ( ) { r e t u r n n e w B ( ) { } ; } } p u b l i c c l a s s T e s t { s t a t i c v
- i
d t a k e A ( A a ) { } s t a t i c v
- i
d t a k e B ( B b ) { } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { X x = n e w X ( ) ; Y y = n e w Y ( ) ; t a k e A ( x ) ; t a k e B ( x ) ; t a k e A ( y ) ; t a k e B ( b . m a k e B ( ) ) ; } } c l a s s A { } a b s t r a c t c l a s s B { } / / c l a s s X i m p l e m e n t s A , B { } / / w
- n
’ t c
- m
p i l e c l a s s Y e x t e n d s A { B m a k e B ( ) { r e t u r n n e w B ( ) { } ; } } p u b l i c c l a s s T e s t { s t a t i c v
- i
d t a k e A ( A a ) { } s t a t i c v
- i
d t a k e B ( B b ) { } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Y y = n e w Y ( ) ; t a k e A ( y ) ; t a k e B ( b . m a k e B ( ) ) ; } }
O O P w i t h J a v a
- 容器简介
- C
- l
l e c t i
- n
– L
i s t , S e t , Q u e u e
- M
a p
- C
- l
l e c t i
- n
a n d I t e r a t
- r
容器简介
- 如何将对象组织起来 ?
i n t a = ; i n t b = ; . . . i n t z = ; M y T y p e m _ a = n e w M y T y p e ( ) ; M y T y p e m _ b = n e w M y T y p e ( ) ; . . . M y T y p e m _ c = n e w M y T y p e ( ) ;
容器简介
- 数组
i n t [ ] a = n e w i n t [ ] { 1 , 2 , 3 } ; M y T y p e [ ] b = n e w M y T y p e [ 3 ] ; M y T y p e [ ] c = n e w M y T y p e [ 3 ] { n e w M y T y p e ( ) , n e w M y T y p e ( ) , n e w M y T y p e ( ) } ; 长度不可变 1 . 无法添加和删除数组元素 2 . 数组元素之间的关系 ? ( S e t )
容器简介
- 容器
– 提供更灵活的组织对象的方式
- 动态添加 ,
删除
– 例如
- L
i s t , S e t , Q u e u e
- M
a p
– 位于包 j
a v a . u t i l 中
I t e m 1 I t e m 2 I t e m N
L i s t : 一列有序的对象 ( 数组 , 链表 )
i m p
- r
t j a v a . u t i l . * ; A r r a y L i s t a = n e w A r r a y L i s t ( ) ; L i n k e d L i s t b = n e w L i n k e d L i s t ( ) ;
/ / I m p l e m e n t L i s t i n t e r f a c e
L i s t c = a ; L i s t d = b ;
L i s t 接口
I t e m 1 I t e m 3 I t e m 2
S e t : 集合 ( 没有重复元素 )
I t e m 2 A d d I t e m 2
i m p
- r
t j a v a . u t i l . * ; H a s h S e t a = n e w H a s h S e t ( ) ; T r e e S e t b = n e w T r e e S e t ( ) ;
/ / i m p l e m e n t S e t i n t e r f a c e
S e t c = a ; S e t d = b ;
S e t 接口
I t e m 1 I t e m 2 I t e m 3
Q u e u e : 队列
- e
n q u e u e ( 进队 )
- d
e q u e u e ( 出队 )
- 先进先出
- 应用 :
任务调度
I t e m 4
i m p
- r
t j a v a . u t i l . * ; L i n k e d L i s t a = n e w L i n k e d L i s t ( ) ; P r i
- r
i t y Q u e u e b = n e w P r i
- r
i t y Q u e u e ( ) ;
/ / I m p l e m e n t Q u e u e i n t e r f a c e
Q u e u e c = a ; Q u e u e d = b ;
Q u e u e 接口
- 队列
– 先进先出 (
F i r s t i n , fi r s t
- u
t )
– 先来先服务 (
F i r s t c
- m
e , fi r s t s e r v e )
K e y 1 V a l u e 1 K e y 2 V a l u e 2 K e y n V a l u e n
M a p :
- K
e y
- v
a l u e 对
- K
e y 不重复
- v
a l u e 可以重复
- 应用 :
单词出现次数
i m p
- r
t j a v a . u t i l . * ;
/ / I m p l e m e n t M a p i n t e r f a c e
H a s h M a p a = n e w H a s h M a p ( ) ;
K e y 2 V a l u e 3 p u t V a l u e 3
M a p 接口
容器简介
- 泛型 (
g e n e r i c ) 与类型安全的容器
– 容器可以存放的类型为 O
b j e c t
– 任何类型的对象都能放入容器 – 容器的类型只能在运行时确定
c l a s s A p p l e { p r i v a t e s t a t i c l
- n
g c
- u
n t e r ; p r i v a t e fi n a l l
- n
g i d = c
- u
n t e r + + ; p u b l i c l
- n
g i d ( ) { r e t u r n i d ; } } c l a s s O r a n g e { } p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h
- u
t G e n e r i c s { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t a p p l e s = n e w A r r a y L i s t ( ) ; f
- r
( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / N
- t
p r e v e n t e d f r
- m
a d d i n g a n O r a n g e t
- a
p p l e s : a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f
- r
( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) ( ( A p p l e ) a p p l e s . g e t ( i ) ) . i d ( ) ; / / O r a n g e i s d e t e c t e d
- n
l y a t r u n t i m e } }
容器简介
- 类型安全的容器
– 定义容器为只能存放某种类型的对象 – 编译时确定类型
- 泛型编程 (
g e n e r i c )
c l a s s A p p l e { p r i v a t e s t a t i c l
- n
g c
- u
n t e r ; p r i v a t e fi n a l l
- n
g i d = c
- u
n t e r + + ; p u b l i c l
- n
g i d ( ) { r e t u r n i d ; } } c l a s s O r a n g e { } p u b l i c c l a s s A p p l e s A n d O r a n g e s Wi t h G e n e r i c s { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < A p p l e > a p p l e s = n e w A r r a y L i s t < A p p l e > ( ) ; f
- r
( i n t i = ; i < 3 ; i + + ) a p p l e s . a d d ( n e w A p p l e ( ) ) ; / / C
- m
p i l e e r r
- r
! / / a p p l e s . a d d ( n e w O r a n g e ( ) ) ; f
- r
( i n t i = ; i < a p p l e s . s i z e ( ) ; i + + ) a p p l e s . g e t ( i ) . i d ( ) ; f
- r
( A p p l e c : a p p l e s ) S y s t e m .
- u
t . p r i n t l n ( c . i d ( ) ) ; } }
容器简介
- 类型安全的容器
–
U p c a s t i n g 适用
c l a s s G r a n n y S m i t h e x t e n d s A p p l e { } c l a s s G a l a e x t e n d s A p p l e { } c l a s s F u j i e x t e n d s A p p l e { } c l a s s B r a e b u r n e x t e n d s A p p l e { } p u b l i c c l a s s G e n e r i c s A n d U p c a s t i n g { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < A p p l e > a p p l e s = n e w A r r a y L i s t < A p p l e > ( ) ; a p p l e s . a d d ( n e w G r a n n y S m i t h ( ) ) ; a p p l e s . a d d ( n e w G a l a ( ) ) ; a p p l e s . a d d ( n e w F u j i ( ) ) ; a p p l e s . a d d ( n e w B r a e b u r n ( ) ) ; f
- r
( A p p l e c : a p p l e s ) S y s t e m .
- u
t . p r i n t l n ( c ) ; } }
容器简介
- 类型安全的容器
– 不能指定基本类型 – 使用基本类型的 w
r a p p e r
– A
u t
- b
- x
i n g a n d u n b
- x
i n g
i m p
- r
t j a v a . u t i l . * ;
/ / c
- m
p i l e e r r
- r
/ / A r r a y L i s t < i n t > a = n e w A r r a y L i s t < i n t > ( ) ; A r r a y L i s t < I n t e g e r > a = n e w A r r a y L i s t < I n t e g e r > ( ) ; F
- r
( i n t i = ; i < 1 ; + + i ) a . a d d ( i ) ; / / a u t
- b
- x
i n g
容器简介
- 容器接口
– C
- l
l e c t i
- n
接口 : 用于存放一组对象
- L
i s t 接口 : 对象按照插入顺序排列容器中的对象
- S
e t 接口 : 容器中不能有重复的对象
- Q
u e u e 接口 : 按 " 队列 " 规则插入 / 删除对象
– M
a p 接口
- 用于存放一组 “键 -
值对” ( k e y
- v
a l u e p a i r )
– k
e y 的类型 , v a l u e 的类型
– 按照 k
e y 查找对应的 v a l u e
- 也称为 d
i c t i
- n
a r y , a s s
- c
i a t i v e a r r a y
容器简介
i m p
- r
t j a v a . u t i l . * ;
/ / L i s t i s a n i n t e r f a c e
L i s t < A p p l e > a = n e w A r r a y L i s t < A p p l e > ( ) ; L i s t < A p p l e > b = n e w L i n k e d L i s t < A p p l e > ( ) ;
/ / C
- l
l e c t i
- n
i s a n i n t e r f a c e
C
- l
l e c t i
- n
< A p p l e > c = n e w A r r a y L i s t < A p p l e > ( ) ;
容器简介
- 容器重写了 t
- S
t r i n g ( ) 方法 , 可以帮助可视化容 器的内容
i m p
- r
t j a v a . u t i l . * ; A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; S y s t e m .
- u
t . p r i n t l n ( a ) ;
p u b l i c c l a s s P r i n t C
- n
t a i n e r s { s t a t i c C
- l
l e c t i
- n
fi l l ( C
- l
l e c t i
- n
< S t r i n g > c ) { c . a d d ( “ r a t ” ) ; c . a d d ( “ c a t ” ) ; c . a d d ( “ d
- g
” ) ; c . a d d ( “ d
- g
” ) ; } s t a t i c M a p fi l l ( M a p < S t r i n g , S t r i n g > m ) { m . p u t ( “ r a t ” , “ F u z z y ” ) ; m . p u t ( “ c a t ” , “ R a g s ” ) ; m . p u t ( “ d
- g
” , “ B
- s
c
- ”
) ; m . p u t ( “ d
- g
” , “ S p
- t
” ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w A r r a y L i s t < S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w L i n k e d L i s t < S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w H a s h S e t < S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w T r e e S e t < S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w L i n k e d H a s h S e t < S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w H a s h M a p < S t r i n g , S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w T r e e M a p < S t r i n g , S t r i n g > ( ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( fi l l ( n e w L i n k e d H a s h M a p < S t r i n g , S t r i n g > ( ) ) ) ; } }
[ r a t , c a t , d
- g
, d
- g
] / / A r r a y L i s t [ r a t , c a t , d
- g
, d
- g
] / / L i n k e d L i s t [ c a t , d
- g
, r a t ] / / H a s h S e t [ c a t , d
- g
, r a t ] / / T r e e S e t [ r a t , c a t , d
- g
] / / L i n k e d H a s h S e t { c a t = F u z z y , d
- g
= S p
- t
, r a t = F u z z y } / / H a s h M a p { c a t = F u z z y , d
- g
= S p
- t
, r a t = F u z z y } / / T r e e M a p { r a t = F u z z y , c a t = F u z z y , d
- g
= S p
- t
} / / L i n k e d H a s h M a p
L i s t :
- A
r r a y L i s t 实现为数组
- L
i n k e d L i s t 实现为链表 S e t / M a p
- H
a s h : 实现为 h a s h 表 , 查询较块
- T
r e e : 实现为查询树 , 按顺序排列
- L
i n k e d H a s h : 按照插入顺序排列
容器简介
- 总结
– 容器类型
- C
- l
l e c t i
- n
: L i s t , S e t , Q u e u e
- M
a p
– 类型安全的容器
- A
r r a y L i s t < T > a = n e w A r r a y L i s t < T > ( ) ;
– U
p c a s t i n g a n d A u t
- b
- x
i n g
L i s t
- 两种类型的 L
i s t
– A
r r a y L i s t
- “ 可扩展数组”
- 适用于随机访问 ,
插入删除较慢
– L
i n k e d L i s t
- 双向链表
- 适用于顺序访问 ,
插入删除较快
- 实现了 Q
u e u e 接口
L i s t
C
- l
l e c t i
- n
S e t Q u e u e L i s t A r r a y L i s t L i n k e d L i s t
L i s t
- L
i s t 接口
– a
d d ( ) : 添加元素
– r
e m
- v
e ( ) : 删除元素
– g
e t ( ) : 返回第 i 个位置的元素
– s
i z e ( ) : 返回元素数量
– .
. .
L i s t
- 构造函数
– A
r r a y L i s t
– L
i n k e d L i s t
A r r a y L i s t < E > ( ) ; A r r a y L i s t < E > ( i n t i n i t i a l C a p a c i t y ) ; A r r a y L i s t < E > ( C
- l
l e c t i
- n
< E > c ) ; L i n k e d L i s t < E > ( ) ; L i n k e d L i s t < E > ( C
- l
l e c t i
- n
< E > c ) ;
- A
r r a y L i s t
i m p
- r
t j a v a . u t i l . * ; A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; / / 插入 a d d ( O b j e c t
- )
a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; / / 查询 c
- n
t a i n s ( O b j e c t
- )
S y s t e m .
- u
t . p r i n t l n ( a . c
- n
t a i n s ( “ c a t ” ) ) ; / / 删除 r e m
- v
e ( O b j e c t
- )
( 若不在 L i s t 中 , 返回 f a l s e , 否则返回 t r u e ) a . r e m
- v
e ( “ d
- g
” ) ; a . r e m
- v
e ( “ d a g ” ) ; / / 访问第 i 个元素 : g e t ( i n t ) a . g e t ( ) ; / / 对象的数量 : s i z e ( ) a . s i z e ( ) ; / / 序号 i n d e x O f a . i n d e x O f ( “ c a t ” ) ;
i m p
- r
t j a v a . u t i l . * ; A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; / / 插入 a d d ( O b j e c t
- )
a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; / / 子表 s u b L i s t ( i n t f r
- m
I n d e x , i n t t
- I
n d e x ) L i s t < S t r i n g > s u b = a . s u b L i s t ( 2 , 3 ) ; / / 是否为空 i s E m p t y ( ) S y s t e m .
- u
t . p r i n t l n ( a . i s E m p t y ( ) ) ; / / 返回迭代器 i t e r a t
- r
( ) I t e r a t
- r
i t = a . i t e r a t
- r
( ) ; / / 返回 L i s t 迭代器 l i s t I t e r a t
- r
( ) L i s t I t e r a t
- r
l i t = a . l i s t I t e r a t
- r
( ) ; / / 转为数组 S t r i n g [ ] a a r r a y = a . t
- A
r r a y ( ) ; ….
L i s t
- I
t e r a t
- r
( 迭代器 )
– 通常需要访问 /
遍历 C
- l
l e c t i
- n
中的元素
A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; …. . . a . g e t ( i ) ; L i n k e d L i s t < S t r i n g > b = n e w L i n k e d L i s t < S t r i n g > ( ) ; …… b . g e t ( i ) ; S t a t i c v
- i
d v i s i t ( L i s t < S t r i n g > l s ) { l s . g e t ( i ) ; …. }
- 缺点
- 依赖于 C
- l
l e c t i
- n
接口
- 其他没有实现 C
- l
l e c t i
- n
接口的 类无法使用函数 v i s i t
- 解决方法 i
t e r a t
- r
, 包含方法
- n
e x t ( )
- h
a s N e x t ( )
- r
e m
- v
e ( )
- C
- l
l e c t i
- n
接口
- i
t e r a t
- r
( )
- 返回该 L
i s t 的迭代器
L i s t
- i
t e r a t
- r
( )
I m p
- r
t j a v a . u t i l . * p u b l i c c l a s s S i m p l e I t e r a t i
- n
{ A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; I t e r a t
- r
< S t r i n g > i t = a . i t e r a t
- r
( ) ; w h i l e ( i t . h a s N e x t ( ) ) { S t r i n g s = i t . n e x t ( ) ; S y s t e m .
- u
t . p r i n t l n ( s ) ; } / / i d e n t i c a l t
- f
- r
( S t r i n g i : a ) S y s t e m .
- u
t . p r i n t l n ( i ) ; }
L i s t
- i
t e r a t
- r I
m p
- r
t j a v a . u t i l . * p u b l i c c l a s s I t e r a t i
- n
{ p u b l i c s t a t i c v
- i
d d i s p l a y ( I t e r a t
- r
< S t r i n g > i t ) w h i l e ( i t . h a s N e x t ( ) ) { S t r i n g s = i t . n e x t ( ) ; S y s t e m .
- u
t . p r i n t l n ( s ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { A r r a y L i s t < S t r i n g > a = n e w A r r a y L i s t < S t r i n g > ( ) ; a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; L i n k e d L i s t < S t r i n g > b = n e w L i n k e d L i s t < S t r i n g > ( a ) ; H a s h S e t < S t r i n g > c = n e w H a s h S e t < S t r i n g > ( a ) ; T r e e S e t < S t r i n g > d = n e w T r e e S e t < S t r i n g > ( a ) ; d i s p l a y ( a . i t e r a t
- r
( ) ) ; d i s p l a y ( b . i t e r a t
- r
( ) ) ; d i s p l a y ( c . i t e r a t
- r
( ) ) ; d i s p l a y ( d . i t e r a t
- r
( ) ) ; } }
L i s t
- L
i s t I t e r a t
- r
– L
i s t 接口提供
– 扩展了 I
t e r a t
- r
– 双向遍历
- h
a s N e x t ( ) , h a s P r e v i
- u
s ( )
- n
e x t ( ) , p r e v i
- u
s ( )
L i s t
- L
i n k e d L i s t
– 实现 L
i s t 接口
– 实现 Q
u e u e 接口
- a
d d ( ) , r e m
- v
e ( ) , e l e m e n t ( )
- o
ff e r ( ) , p
- l
l ( ) , p e e k ( )
– 提供更多的方法
L i s t
- L
i n k e d L i s t 方法
i m p
- r
t j a v a . u t i l . * ; L i n k e d L i s t < S t r i n g > a = n e w L i n k e d L i s t < S t r i n g > ( ) ; a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; / / 返回链表首元素 g e t F i r s t ( ) , e l e m e n t ( ) , 若链表为空则抛出异常 a . g e t F i r s t ( ) ; a . e l e m e n t ( ) ; / / 返回链表首元素 p e e k ( ) , 若链表为空则返回 n u l l a . p e e k ( ) ; / / 删除并返回链表首元素 r e m
- v
e F i r s t ( ) , r e m
- v
e ( ) , 若链表为空则抛出异常 S t r i n g s = a . r e m
- v
e ( ) ; / / 删除并返回链表首元素 p
- l
l , 若链表为空则返回 n u l l S t r i n g s = a . p
- l
l ( ) ;
L i s t
- L
i n k e d L i s t 方法
i m p
- r
t j a v a . u t i l . * ; L i n k e d L i s t < S t r i n g > a = n e w L i n k e d L i s t < S t r i n g > ( ) ; a . a d d ( “ r a t ” ) ; a . a d d ( “ c a t ” ) ; a . a d d ( “ d
- g
” ) ; a . a d d ( “ d
- g
” ) ; / / 在链表头添加对象 a d d F i r s t ( ) a . a d d F i r s t ( “ t i g e r ” ) ; / / 在链表尾添加对象 a d d ( ) , a d d L a s t ( ) ,
- ff
e r ( ) a . a d d ( “ c
- w
” ) ; a . a d d L a s t ( “ c
- w
” ) ;
L i s t
- L
i n k e d L i s t 应用 : S t a c k
– 后进先出 (
L a s t I n F i r s t O u t , L I F O )
– p
u s h : 将一个对象入栈
– p
- p
: 从栈中取出一个元素 : 按照 L I F O原则
L i s t
I t e m 1
s . p u s h ( i t e m 1 ) ; s . p u s h ( i t e m 2 ) ; s . p u s h ( i t e m 3 ) ; s . p
- p
( ) ; s . p u s h ( i t e m 4 ) ; s . p u s h ( i t e m 5 ) ; s . p
- p
( ) ; s . p
- p
( ) ;
I t e m 2 I t e m 3 I t e m 4 I t e m 5
L i n k e d L i s t < I t e m > s = n e w L i n k e d L i s t < I t e m > ( ) ;
L i s t
i m p
- r
t j a v a . u t i l . L i n k e d L i s t ; p u b l i c c l a s s S t a c k < T > { p r i v a t e L i n k e d L i s t < T > s t
- r
a g e = n e w L i n k e d L i s t < T > ( ) ; p u b l i c v
- i
d p u s h ( T v ) { s t
- r
a g e . a d d F i r s t ( v ) ; } p u b l i c T p e e k ( ) { r e t u r n s t
- r
a g e . g e t F i r s t ( ) ; } p u b l i c T p
- p
( ) { r e t u r n s t
- r
a g e . r e m
- v
e F i r s t ( ) ; } p u b l i c b
- l
e a n e m p t y ( ) { r e t u r n s t
- r
a g e . i s E m p t y ( ) ; } p u b l i c S t r i n g t
- S
t r i n g ( ) { r e t u r n s t
- r
a g e . t
- S
t r i n g ( ) ; } } p u b l i c c l a s s S t a c k T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { S t a c k < S t r i n g > s t a c k = n e w S t a c k < S t r i n g > ( ) ; f
- r
( S t r i n g s : " M y d
- g
h a s fl e a s " . s p l i t ( " " ) ) s t a c k . p u s h ( s ) ; w h i l e ( ! s t a c k . e m p t y ( ) ) S y s t e m .
- u
t . p r i n t ( s t a c k . p
- p
( ) + " " ) ; } }
L i s t
- S
t a c k 的应用
– 上下文无关文法
- A
r r a y L i s t
–
对象存储在数组中 ( 可变长数组 )
–
优点 : 随机访问快
–
缺点 : 添加 / 删除慢 , 空间浪费
I t e m 1 I t e m 2 I t e m N
c a p a c i t y = N
I t e m 1 I t e m 2 I t e m N
c a p a c i t y = 2 N
I t e m N + 1 I t e m N + 1 I t e m N + 2 I t e m 2 N I t e m 1 I t e m 2 I t e m N
c a p a c i t y = 2 N
I t e m N + 1 I t e m N + 2 I t e m 2 N N / 2
I t e m N / 2 + 1
N / 2 f r e e
每次扩张或缩减数组长度时 , 保证新的数组有一半的可用空间
I t e m 1 I t e m 2
c a p a c i t y = N
扩张 缩减
- L
i n k e d L i s t
– 双向链表 – 优点 :
添加 / 删除较快 , 无空间浪费
– 缺点 :
随机访问慢
I t e m 1 I t e m 2 I t e m 3 I t e m N
… . . .
n e x t n e x t p r e v i
- u
s p r e v i
- u
s I t e m 1 I t e m 2 I t e m 3 n e x t p r e v i
- u
s p r e v i
- u
s I t e m p r e v i
- u
s n e x t p r e v i
- u
s n e x t n e x t I t e m 1 I t e m 2 I t e m 3
… . . .
n e x t n e x t p r e v i
- u
s p r e v i
- u
s
插入 删除
L i s t
- 总结
– L
i s t 接口
- a
d d ( ) , r e m
- v
e ( ) , g e t ( ) , s i z e ( ) , i n d e x O f ( )
– A
r r a y L i s t
- 可变长度数组
– L
i n k e d L i s t
- 链表
- 实现 Q
u e u e 接口
– 迭代器 I
t e r a t
- r
S e t
C
- l
l e c t i
- n
S e t Q u e u e L i s t H a s h S e t L i n k e d H a s L i s t T r e e S e t
S e t
- S
e t 接口
– 容器中不能出现重复的元素 – 没有对 C
- l
l e c t i
- n
接口扩展
– 三种主要实现
- H
a s h S e t
- T
r e e S e t
- L
i n k e d H a s h S e t
S e t
- S
e t 接口
– a
d d ( O b j e c t
- )
, a d d A l l ( C
- l
l e c t i
- n
< E > c )
– r
e m
- v
e ( O b j e c t
- )
, r e m
- v
e A l l ( C
- l
l e c t i
- n
< E > c )
– c
- n
t a i n s ( O b j e c t
- )
– i
t e r a t
- r
( )
– s
i z e ( )
– t
- A
r r a y ( )
– .
. .
S e t
- H
a s h S e t
– 特点 :
快速 ( 插入 , 删除 , 查找 ) , 无序
i m p
- r
t j a v a . u t i l . * p u b l i c c l a s s S e t O f I n t e g e r { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { R a n d
- m
r a n d = n e w R a n d
- m
( 4 7 ) ; S e t < I n t e g e r > i n t s e t = n e w H a s h S e t < I n t e g e r > ( ) ; f
- r
( i n t i = ; i < 1 ; i + + ) i n t s e t . a d d ( r a n d . n e x t I n t ( 3 ) ) ; S y s t e m .
- u
t . p r i n t l n ( i n t s e t ) ; }
S e t
- T
r e e S e t
– 特点 :
速度较慢 ( 插入 , 删除 , 查找 ) , 有序
- L
i n k e d H a s h S e t
– 特点 :
速度快 , 按插入顺序排列
Q u e u e
C
- l
l e c t i
- n
S e t Q u e u e L i s t P r i
- r
i t y Q u e u e A r r a y L i s t L i n k e d L i s t
Q u e u e
- Q
u e u e 接口
– 队列规则 :
先进先出 ( F i r s t i n , F i r s t
- u
t )
– 接口
- o
ff e r ( O b j e c t
- )
, a d d ( O b j e c t
- )
: 将对象加入队列尾部
- p
- l
l ( ) , r e m
- v
e ( ) : 弹出位于队首的对象
- p
e e k ( ) , e l e m e n t ( ) : 返回位于队首的对象 , 并不删除
– L
i n k e d L i s t
– P
r i
- r
i t y Q u e u e
i m p
- r
t j a v a . u t i l . * p u b l i c c l a s s Q u e u e T e s t { p u b l i c s t a t i c v
- i
d p r i n t Q ( Q u e u e q u e u e ) { w h i l e ( q u e u e . p e e k ( ) ! = n u l l ) S y s t e m .
- u
t . p r i n t ( q u e u e . r e m
- v
e ( ) + " " ) ; S y s t e m .
- u
t . p r i n t l n ( ) ; } p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { Q u e u e < I n t e g e r > q u e u e = n e w L i n k e d L i s t < I n t e g e r > ( ) ; R a n d
- m
r a n d = n e w R a n d
- m
( 4 7 ) ; f
- r
( i n t i = ; i < 1 ; i + + ) q u e u e .
- ff
e r ( r a n d . n e x t I n t ( i + 1 ) ) ; p r i n t Q ( q u e u e ) ; Q u e u e < C h a r a c t e r > q c = n e w L i n k e d L i s t < C h a r a c t e r > ( ) ; f
- r
( c h a r c : " B r
- n
t
- s
a u r u s " . t
- C
h a r A r r a y ( ) ) q c .
- ff
e r ( c ) ; p r i n t Q ( q c ) ; } }
Q u e u e
- P
r i
- r
i t y Q u e u e
– 优先级队列
- 每次出队时 ,
选择优先级最高的对象
- 队列中的对象可以比较优先级
- 普通队列也可看成优先级队列 :
优先级为加入队列的时间
i m p
- r
t j a v a . u t i l . * ; p u b l i c c l a s s P r i
- r
i t y Q u e u e T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P r i
- r
i t y Q u e u e < I n t e g e r > q i = n e w P r i
- r
i t y Q u e u e < I n t e g e r > ( ) ; i n t [ ] i a r r a y = { 2 5 , 2 2 , 2 , 1 8 , 1 4 , 9 , 3 , 1 , 1 , 2 , 3 , 9 , 1 4 , 1 8 , 2 1 , 2 3 , 2 5 } ; f
- r
( i n t i : i a r r a y ) q i .
- ff
e r ( i ) ; p r i n t Q ( q i ) ; P r i
- r
i t y Q u e u e < C h a r a c t e r > q c = n e w P r i
- r
i t y Q u e u e < C h a r a c t e r > ( ) ; f
- r
( c h a r c : " B r
- n
t
- s
a u r u s ” . t
- C
h a r A r r a y ( ) ) q c .
- ff
e r ( c ) ; p r i n t Q ( q c ) ; } }
Q u e u e
- 自定义优先级
– 构造函数 – C
- m
p a r a t
- r
接口
- 定义两个元素的优先级关系
- 包含方法 c
- m
p a r e ( E e 1 , E e 2 )
– C
- m
p a r e 返回负数当 e 1 优先级低于 e 2
– C
- m
p a r e 返回正数当 e 1 优先级高于 e 2
– C
- m
p a r e 返回 0 当 e 1 优先级等于 e 2 P r i
- r
i t y Q u e u e < E > ( i n t i n i t i a l C a p a c i t y , C
- m
p a r a t
- r
< E > c
- m
p a r a t
- r
)
p u b l i c c l a s s P r i
- r
i t y Q u e u e T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) { P r i
- r
i t y Q u e u e < C h a r a c t e r > q c = n e w P r i
- r
i t y Q u e u e < C h a r a c t e r > ( ) ; f
- r
( c h a r c : " B r
- n
t
- s
a u r u s ” . t
- C
h a r A r r a y ( ) ) q c .
- ff
e r ( c ) ; p r i n t Q ( q c ) ; P r i
- r
i t y Q u e u e < C h a r a c t e r > r q c = n e w P r i
- r
i t y Q u e u e < C h a r a c t e r > ( 1 , n e w C
- mp
a r a t
- r
< C h a r a c t e r > ( ) { p u b l i c i n t c
- mp
a r e ( C h a r a c t e r c 1 , C h a r a c t e r c 2 ) { i f ( c 1 > c 2 ) r e t u r n
- 1
; e l s e i f ( c 1 < c 2 ) r e t u r n 1 ; e l s e r e t u r n ; } } ) ; f
- r
( c h a r c : " B r
- n
t
- s
a u r u s " . t
- C
h a r A r r a y ( ) ) r q c .
- ff
e r ( c ) ; p r i n t Q ( r q c ) ; } }
M a p
C
- l
l e c t i
- n
S e t Q u e u e L i s t M a p T r e e M a p L i n k e d H a s h M a p H a s h M a p
M a p
- M
a p
– K
e y
- v
a l u e p a i r
K e y 1 V a l u e 1 K e y 2 V a l u e 2 K e y n V a l u e n V a l u e 3
M a p
- M
a p 接口
– 存入键值对 :
p u t ( K k e y , V v a l u e )
– 返回键对应的值 :
g e t ( K k e y )
– 是否包含键 k
e y : c
- n
t a i n s K e y ( O b j e c t k e y )
– 是否包含值 v
a l u e : c
- n
t a i n s V a l u e ( O b j e c t v a l u e )
– 返回键组成的 S
e t : k e y S e t ( )
– 返回值组成的 C
- l
l e c t i
- n
: v a l u e s ( )
i m p
- r
t j a v a . u t i l . * p u b l i c c l a s s M a p T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) {
H a s h M a p < S t r i n g , S t r i n g > m =
n e w H a s h M a p < S t r i n g , S t r i n g > ( ) m . p u t ( “ r a t ” , “ F u z z y ” ) ; m . p u t ( “ c a t ” , “ R a g s ” ) ; m . p u t ( “ d
- g
” , “ B
- s
c
- ”
) ; m . p u t ( “ d
- g
” , “ S p
- t
” ) ; S y s t e m .
- u
t . p r i n t l n ( m . g e t ( “ d
- g
” ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . c
- n
t a i n K e y ( “ d
- g
” ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . c
- n
t a i n V a l u e ( “ d
- g
” ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . k e y S e t ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . v a l u e s ( ) ) ; }
i m p
- r
t j a v a . u t i l . * p u b l i c c l a s s M a p T e s t { p u b l i c s t a t i c v
- i
d m a i n ( S t r i n g [ ] a r g s ) {
H a s h M a p < S t r i n g , A r r a y L i s t < I n t e g e r > > m =
n e w H a s h M a p < > ( ) m . p u t ( “ r a t ” , n e w A r r a y L i s t < I n t e g e r > ( A r r a y . a s L i s t ( 1 , 2 , 3 ) ) ) ; m . p u t ( “ c a t ” , n e w A r r a y L i s t < I n t e g e r > ( A r r a y . a s L i s t ( 4 , 5 , 6 ) ) ) ; m . p u t ( “ d
- g
” , n e w A r r a y L i s t < I n t e g e r > ( A r r a y . a s L i s t ( 7 , 8 , 9 ) ) ) ; m . p u t ( “ d
- g
” , n e w A r r a y L i s t < I n t e g e r > ( A r r a y . a s L i s t ( 1 , 1 1 , 1 2 ) ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . g e t ( “ d
- g
” ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . c
- n
t a i n K e y ( “ d
- g
” ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . k e y S e t ( ) ) ; S y s t e m .
- u
t . p r i n t l n ( m . v a l u e s ( ) ) ;
H a s h M a p < S t r i n g , H a s h M a p < S t r i n g , I n t e g e r > > n =
n e w H a s h M a p < > ( ) ; . . . }
M a p
- M
a p
– 建议 :
I m m u t a b l e k e y
迭代器与 f
- r
e a c h
- I
t e r a b l e 接口
– 提供 i
t e r a t
- r
( ) : 返回迭代器
- C
- l
l e c t i
- n
扩展了 I t e r a b l e 接口
- f
- r
e a c h 语句
– 对所有实现 I
t e r a b l e 接口的类
– 数组
C
- l
l e c t i
- n
S e t Q u e u e L i s t M a p T r e e M a p L i n k e d H a s h M a p H a s h M a p