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
SMART_READER_LITE
LIVE PREVIEW

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 , (


slide-1
SLIDE 1

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

slide-2
SLIDE 2

O O P w i t h J a v a

  • 通知

– P

r

  • j

e c t 6 : 6 月 6 日晚 9 点

slide-3
SLIDE 3
  • 复习

– 继承

  • 代码复用
  • 向上转换 ,

多态 ( 父类与子类的类型转换 )

– 接口

  • 代码复用
  • 向上转换 ,

多态 ( 多个父接口 )

– 内部类

  • 代码复用
  • 向上转换 ,

多态 ( 灵活实现多继承 )

slide-4
SLIDE 4
  • 复习

– 内部类

  • 定义在一个类的内部

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 ( ) ; } }

slide-5
SLIDE 5
  • 复习

– 内部类

  • 每个内部类对象包含的有一个外部类对象的引用

– 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

slide-6
SLIDE 6

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 ( ) ; } }

slide-7
SLIDE 7
  • 复习

– 匿名内部类

  • 没有名字的内部类
  • 必须继承某个类 ,

或实现某个接口

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 ( ) ; } }

slide-8
SLIDE 8
  • 复习

– 通过内部类灵活实现多继承

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 ( ) ) ; } }

slide-9
SLIDE 9

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
slide-10
SLIDE 10

容器简介

  • 如何将对象组织起来 ?

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 ( ) ;

slide-11
SLIDE 11

容器简介

  • 数组

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 )

slide-12
SLIDE 12

容器简介

  • 容器

– 提供更灵活的组织对象的方式

  • 动态添加 ,

删除

– 例如

  • L

i s t , S e t , Q u e u e

  • M

a p

– 位于包 j

a v a . u t i l 中

slide-13
SLIDE 13

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 接口

slide-14
SLIDE 14

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 接口

slide-15
SLIDE 15

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 接口

slide-16
SLIDE 16
  • 队列

– 先进先出 (

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 )

slide-17
SLIDE 17

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 接口

slide-18
SLIDE 18

容器简介

  • 泛型 (

g e n e r i c ) 与类型安全的容器

– 容器可以存放的类型为 O

b j e c t

– 任何类型的对象都能放入容器 – 容器的类型只能在运行时确定

slide-19
SLIDE 19

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 } }

slide-20
SLIDE 20

容器简介

  • 类型安全的容器

– 定义容器为只能存放某种类型的对象 – 编译时确定类型

  • 泛型编程 (

g e n e r i c )

slide-21
SLIDE 21

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 ( ) ) ; } }

slide-22
SLIDE 22

容器简介

  • 类型安全的容器

U p c a s t i n g 适用

slide-23
SLIDE 23

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 ) ; } }

slide-24
SLIDE 24

容器简介

  • 类型安全的容器

– 不能指定基本类型 – 使用基本类型的 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

slide-25
SLIDE 25

容器简介

  • 容器接口

– 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

slide-26
SLIDE 26

容器简介

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 > ( ) ;

slide-27
SLIDE 27

容器简介

  • 容器重写了 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 ) ;

slide-28
SLIDE 28

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 : 按照插入顺序排列

slide-29
SLIDE 29

容器简介

  • 总结

– 容器类型

  • 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

slide-30
SLIDE 30

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 接口

slide-31
SLIDE 31

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

slide-32
SLIDE 32

L i s t

  • L

i s t 接口

– a

d d ( ) : 添加元素

– r

e m

  • v

e ( ) : 删除元素

– g

e t ( ) : 返回第 i 个位置的元素

– s

i z e ( ) : 返回元素数量

– .

. .

slide-33
SLIDE 33

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 ) ;

slide-34
SLIDE 34
  • 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 ” ) ;

slide-35
SLIDE 35

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 ( ) ; ….

slide-36
SLIDE 36

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 的迭代器

slide-37
SLIDE 37

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 ) ; }

slide-38
SLIDE 38

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

( ) ) ; } }

slide-39
SLIDE 39

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 ( )

slide-40
SLIDE 40

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 ( )

– 提供更多的方法

slide-41
SLIDE 41

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 ( ) ;

slide-42
SLIDE 42

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

” ) ;

slide-43
SLIDE 43

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原则

slide-44
SLIDE 44

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 > ( ) ;

slide-45
SLIDE 45

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

( ) + " " ) ; } }

slide-46
SLIDE 46

L i s t

  • S

t a c k 的应用

– 上下文无关文法

slide-47
SLIDE 47
  • 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

扩张 缩减

slide-48
SLIDE 48
  • 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

插入 删除

slide-49
SLIDE 49

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
slide-50
SLIDE 50

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

slide-51
SLIDE 51

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

slide-52
SLIDE 52

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 ( )

– .

. .

slide-53
SLIDE 53

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 ) ; }

slide-54
SLIDE 54

S e t

  • T

r e e S e t

– 特点 :

速度较慢 ( 插入 , 删除 , 查找 ) , 有序

  • L

i n k e d H a s h S e t

– 特点 :

速度快 , 按插入顺序排列

slide-55
SLIDE 55

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

slide-56
SLIDE 56

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

slide-57
SLIDE 57

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 ) ; } }

slide-58
SLIDE 58

Q u e u e

  • P

r i

  • r

i t y Q u e u e

– 优先级队列

  • 每次出队时 ,

选择优先级最高的对象

  • 队列中的对象可以比较优先级
  • 普通队列也可看成优先级队列 :

优先级为加入队列的时间

slide-59
SLIDE 59

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 ) ; } }

slide-60
SLIDE 60

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

)

slide-61
SLIDE 61

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 ) ; } }

slide-62
SLIDE 62

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

slide-63
SLIDE 63

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

slide-64
SLIDE 64

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 ( )

slide-65
SLIDE 65

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 ( ) ) ; }

slide-66
SLIDE 66

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 < > ( ) ; . . . }

slide-67
SLIDE 67

M a p

  • M

a p

– 建议 :

I m m u t a b l e k e y

slide-68
SLIDE 68

迭代器与 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 接口的类

– 数组

slide-69
SLIDE 69

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