80
Tổng hợp: Tổng hợp: Polymorphism and Polymorphism and generic programming generic programming - Utility Utility classes and collections classes and collections

Tong hop 16-09

  • Upload
    deto

  • View
    18

  • Download
    0

Embed Size (px)

DESCRIPTION

Java

Citation preview

Page 1: Tong hop 16-09

Tổng hợp: Tổng hợp: Polymorphism and Polymorphism and generic programming generic programming -- Utility Utility classes and collectionsclasses and collections

Page 2: Tong hop 16-09

I. POLYMORPHISM

1. Example

Page 3: Tong hop 16-09

Đa hình (Polymophism)

• Ví dụ: Nếu đi du lịch, bạn có thể chọn ô tô, thuyền, hoặc máy bay

– Dù đi bằng phương tiện gì, kết quả cũng giống nhau là bạn đến được nói cần đến

– Cách thức đáp ứng các dịch vụ có thể khác nhau

3

Page 4: Tong hop 16-09

Đa hình (2)• Các lớp khác nhau có thể đáp ứng danh sách các

thông điệp giống nhau, vì vậy cung cấp các dịch vụ giống nhau

4

▫ Cách thức đáp ứng thông điệp, thực hiện dịch vụ khác nhau

▫ Chúng có thể tráo đổi cho nhau mà không ảnh hưởng đến đối tượng gửi thông điệp

Đa hình

Page 5: Tong hop 16-09

Đa hình (3)

• Polymorphism: Nhiều hình thức thực hiện, nhiều kiểu tồn tại

• Đa hình trong lập trình– Đa hình phương thức:

• Phương thức trùng tên, phân biệt bởi danh sách tham số.

– Đa hình đối tượng• Nhìn nhận đối tượng theo nhiều kiểu khác nhau

• Các đối tượng khác nhau cùng đáp ứng chung danh sách các thông điệp có giải nghĩa thông điệp theo cách thức khác nhau.

5

Page 6: Tong hop 16-09

Example

public class Circle extends 2DShape{

public static final double PI = 3.14159;

private Point p;

private double r; //radious

...

public void display(){

System.out.print("Circle: " + r + ",");

p.display();

System.out.println();

}

}

public class Quadrilateral extends 2DShape {

private Point p1, p2, p3, p4;

.....

public void display(){

System.out.println("Quadrilateral: ");

p1.display(); p2.display();

p3.display(); p4.display();

System.out.println();

}

}

public class 2DShape {

public void display() {

System.out.println("2D Shape");

}

}

public class Point extends 2DShape {

private int x, y;

...

public void display(){

System.out.print("(" + x + "," + y + ")");

}

}

Page 7: Tong hop 16-09

Example

• There are many choice once a method is invoked through a super class reference.

7

Application

program2DShape

display()

Object of super

class

display()display()

display()

Object of Circle class

Object of Quadrilateral class

Circle: 1, (0,0)

Quadrilateral:

(0,0), (0,1), (1,0), (1,1)

display()

Object of Point class

(0,1)

2D Shape

Page 8: Tong hop 16-09

II. DOWN CASTING AND UP CASTING

Page 9: Tong hop 16-09

Primitive type casting

• Java performs automatic primitive type casting when:

– Two types are compatible

– The destination type is larger then the source type

– Example:

• int i;

• double d = i;

• We have to perform manual primitive type casting when:

– Two types are compatible

– The destination type is smaller then the source type

– Example:

• int i;

• byte b = i; byte b = (byte)i;

Page 10: Tong hop 16-09

Reference type casting

• Java performs automatic reference type casting when:

– Two types are compatible

– The destination type extends from the source type

Up casting

• We have to perform manual reference type casting when:

– two types are compatible

– The source type extends from the destination type

Down casting

Page 11: Tong hop 16-09

Upcasting

• Moving up the inheritance hierarchy

• Up casting là khả năng nhìn nhận đối tượng thuộc lớp dẫn xuất như là một đối tượng thuộc lớp cơ sở.

• Tự động chuyển đổi kiểu

11

Page 12: Tong hop 16-09

Ví dụ

public class Test1 {

public static void main(String arg[]){

Person p;

Employee e = new Employee();

p = e;

p.setName(“Hoa”);

p.setSalary(350000); // compile error

}

12

Page 13: Tong hop 16-09

Ví dụ (2)class Manager extends Employee {

Employee assistant;

// ...

public void setAssistant(Employee e) {

assistant = e;

}

// ...

}

public class Test2 {

public static void main(String arg[]){

Manager junior, senior;

// ...

senior.setAssistant(junior);

}

}

13

Page 14: Tong hop 16-09

Ví dụ (3)

public class Test3 {

String static teamInfo(Person p1, Person p2){

return "Leader: " + p1.getName() +

", member: " + p2.getName();

}

public static void main(String arg[]){

Employee e1, e2;

Manager m1, m2;

// ...

System.out.println(teamInfo(e1, e2));

System.out.println(teamInfo(m1, m2)); System.out.println(teamInfo(m1, e2));

}

}

14

Page 15: Tong hop 16-09

Downcasting

• Move back down the inheritance hierarchy

• Down casting là khả năng nhìn nhận một đối tượng thuộc lớp cơ sở như một đối tượng thuộc lớp dẫn xuất.

• Không tự động chuyển đổi kiểu

Phải ép kiểu.

15

Page 16: Tong hop 16-09

Ví dụ

public class Test2 {

public static void main(String arg[]){

Employee e = new Employee();

Person p = e; // up casting

Employee ee = (Employee) p; // down casting

Manager m = (Manager) ee; // run-time error

Person p2 = new Manager();

Employee e2 = (Employee) p2;

}

}

16

Page 17: Tong hop 16-09

IV. METHOD CALL BINDING

1. Static binding

2. Dynamic binding

Page 18: Tong hop 16-09

Liên kết tĩnh (Static Binding)

• Liên kết tại thời điểm biên dịch

– Early Binding/Compile-time Binding

– Lời gọi phương thức được quyết định khi biên dịch, do đó chỉ có một phiên bản của phương thức được thực hiện

– Nếu có lỗi thì sẽ có lỗi biên dịch

– Ưu điểm về tốc độ

18

Page 19: Tong hop 16-09

Ví dụpublic class Test {

public static void main(String arg[]){

Person p = new Person();

p.setName(“Hoa”);

p.setSalary(350000); //compile-time error

}

}

19

Page 20: Tong hop 16-09

Liên kết động (Dynamic binding)

• Lời gọi phương thức được quyết định khi thực hiện (run-time)

– Late binding/Run-time binding

– Phiên bản của phương thức phù hợp với đối tượng được gọi.

– Java mặc định sử dụng liên kết động

20

Page 21: Tong hop 16-09

Ví dụpublic class Test {

public static void main(String arg[]){

Person p = new Person();

// ...

Employee e = new Employee();

// ...

Manager m = new Manager();

// ...

Person pArr[] = {p, e, m};

for (int i=0; i< pArr.length; i++){

System.out.println(

pArr[i].getDetail());

}

}

}

21

Page 22: Tong hop 16-09

V. GENERIC PROGRAMMING

Page 23: Tong hop 16-09

Lập trình tổng quát (generic programming)

• Tổng quát hóa chương trình để có thể hoạt động với các kiểu dữ liệu khác nhau, kể cả kiểu dữ liệu trong tương lai– thuật toán đã xác định

• Ví dụ:– C: dùng con trỏ void

– C++: dùng template

– Java: lợi dụng upcasting

– Java 1.5: template

23

Page 24: Tong hop 16-09

24

Lập trình tổng quátLập trình tổng quát

• Đa hình thái cho phép các phương thức được sử

dụng chung cho một dải rộng các tham số đối

tượng → generic programming.

• Trong lập trình hướng đối tượng, nên lập trình

theo cách dùng chung: khai báo 1 biến có kiểu

superclass, nó sẽ có thể chấp nhận một giá trị

của bất kỳ kiểu subclass nào Object

• Khi sử dụng cần ép kiểu đối tượng.

Page 25: Tong hop 16-09

25

Lập trình tổng quátLập trình tổng quát

• Ngoại lệ xảy ra khi thực thipublic class OldBox {

Object data;

public OldBox(Object data) {

this.data = data;

}

public Object getData() {

return data;

}

}

OldBox intBox = new OldBox(42);

int x = (Integer) intBox.getData();

OldBox strBox = new OldBox(“Hi”);

String s = (String) strBox.getData();

int y = (Integer) strBox.getData();

intBox = strBox;

ClassCastException!

Compiles but fails at runtime

Page 26: Tong hop 16-09

26

10.4 Lập trình tổng quát10.4 Lập trình tổng quát

• Giải pháp thông thường:public class IntBox {

Integer data;

public IntBox(Integer data) {

this.data = data;

}

public Integer getData() {

return data;

}

}

IntBox intBox = new IntBox(42);

int x = intBox.getData();

StrBox strBox = new StrBox(“Hi”);

String s = strBox.getData();

int y = (Integer) strBox.getData();

intBox = strBox;

Lỗi biên dịch

public class FooBox {

Foo data;

public FooBox(Foo data) {

this.data = data;

}

public Foo getData() {

return data;

}

} Phải xây dựng vô số lớp

public class StrBox {

String data;

public StrBox(String data) {

this.data = data;

}

public String getData() {

return data;

}

}

Page 27: Tong hop 16-09

27

Lập trình tổng quátLập trình tổng quát

• Tổng quát hóa chương trình để có thể hoạt động với các kiểu dữ liệu khác nhau, kể cả kiểu dữ liệu trong tương lai– thuật toán đã xác định

• Ý tưởng chính:– Tham số hóa các định nghĩa kiểu dữ liệu

• Tham số hóa định nghĩa lớp và phương thức

– Cung cấp các kiểu dữ liệu an toàn• Kiểm tra ngay tại thời điểm biên dịch

• Ngăn chặn các lỗi thực thi

Page 28: Tong hop 16-09

28

Lập trình tổng quátLập trình tổng quát

public class OldBox {

Object data;

public OldBox(Object data) {

this.data = data;

}

public Object getData() {

return data;

}

}

• Chúng ta muốn Box là một lớp “xác định” –

nhưng được biểu diễn một cách trừu tượng

• Sử dụng Object không phù hợp

• Giải pháp – tham số hóa định nghĩa lớp

public class Box<E> {

E data;

public Box(E data) {

this.data = data;

}

public E getData() {

return data;

}

}

• E chỉ một kiểu xác định

• Constructor nhận một đối tượng có kiểu là E,

không phải là một đối tượng bất kỳ

• Khi sử dụng, E phải được thay thế bằng một

lớp xác định

Page 29: Tong hop 16-09

29

Lập trình tổng quátLập trình tổng quát

• Sử dụngpublic class Box<E> {

E data;

public Box(E data) {

this.data = data;

}

public E getData() {

return data;

}

}

Box<Integer> intBox =

new Box<Integer>(42);

int x = intBox.getData();//no cast needed

Box<String> strBox =

new Box<String>(“Hi”);

String s = strBox.getData();//no cast needed

Following lines will not compile anymore:

String s = (String) intBox.getData();

int y = (Integer) strBox.getData();

intBox = strBox;

Runtime errors now converted to

compile time errors

Page 30: Tong hop 16-09

Generic class

• Syntaxmodifier class generic_class_name <type_param_1, .. type_param_n> {

// instance variable

// constructor

// methods

}

• Example: public class Information<T> {

private T value;public Information(T value) {this.value = value;

}public T getValue() {

return value;}

}

Page 31: Tong hop 16-09

Example: Type arguments

....// Can be instantiated with class or interface type:Information<String> string = new Information<String>("hello"); //okInformation<Circle> circle = new Information<Circle>(new Circle());Information<2DShape> shape = new Information<2DShape>(new 2DShape());

// Cannot use a primitive type as a type variableInformation<int> integer = new Information<int>(2012); // failed// Use corresponding wrapper class insteadInformation<Integer> integer = new Information<Integer>(2012); //ok

public class Information<T> {private T value;

public Information(T value) {this.value = value;

}public T getValue() {

return value;}

}

Page 32: Tong hop 16-09

Type parameter naming convention

Type Variable Name Meaning

E Element type in a collection

K Key type in a map

V Value type in a map

T General type

S, U Additional general types

Page 33: Tong hop 16-09

Generic methods

• Method introducing its own type parameters

• Can be defined inside either generic or non-generic classes

• Can be either static or non static

• Syntax:

modifier <type_param1, …> return_type method_name(parameters_list) {

}

• Example:

public <E> static void print(E[] a) { … }

Page 34: Tong hop 16-09

Example

public class ArrayTool {// method, printing all elements of a string array

public static void print(String[] a) {for (String e : a) System.out.print(e + " "); System.out.println();

}// generic method, printing all array elements of different types

public static <E> void print(E[] a) { for (E e : a) System.out.print(e + " "); System.out.println();

}}

...Point[] p = new Point[3];String[] str = new String[5];int[] intnum = new int[2];ArrayTool.print(p);ArrayTool.print(str);// can not call generic method with primitive typesArrayTool.print(intnum);

Page 35: Tong hop 16-09

Bounded Type Parameters

• Bound: limits the parameter types that may be applied to a generic type

– Class

– Interface

• Single bound:

<type_param extends bound>

• Multiple bounds:

<type_param extends bound_1 & bound_2 & .. >

Page 36: Tong hop 16-09

Example

public class Information<T extends 2DShape> {private T value;public Information(T value) {

this.value = value; }public T getValue() {

return value;}

}

...Information<Point> pointInfo = new Information<Point>(new Point()); //OK

Information<String> stringInfo = new Information<String>(); // error

Page 37: Tong hop 16-09

Example

public class ShapeInfo<T> {private T t; public void set(T t) {

this.t = t;}public T get() {

return t;}public <U extends 2DShape> void inspect(U u){System.out.println("T: " + t.getClass().getName());

System.out.println("U: " + u.getClass().getName());}

}

...ShapeInfo<Point> pointInfo = new ShapeInfo<Point>();ShapeInfo<String> stringInfo = new ShapeInfo<String>();

pointInfo.set(new Point()); // OKstringInfo.set(new Point()); // error: this is not a string

pointInfo.inspect(new Circle()); // OKstringInfo.inspect(new Point()); // OKpointInfo.inspect("some text"); // error: this is not a 2DShapestringInfo.inspect("some text"); // erroe: this is not a 2Dshape

Page 38: Tong hop 16-09

38

PuzzlePuzzle

• Xây dựng lớp Stack tổng quát với các kiểu dữ liệuStackOfChars

- elements: char[]

- size: int

+ StackOfChars()

+ StackOfChars (capacity: int)

+ isEmpty(): boolean

+ isFull(): boolean

+ peak(): char

+ push(ch:char): void

+ pop(): char

+ getSize(): int

StackOfIntegers

- elements: int[]

- size: int

+ StackOfIntegers()

+ StackOfIntegers (capacity: int)

+ isEmpty(): boolean

+ isFull(): boolean

+ peak(): int

+ push(value:int): void

+ pop(): int

+ getSize(): int

Page 39: Tong hop 16-09

39

PuzzlePuzzle

• Stack of Objectclass MyStack {

...

public void push(Object obj) {...}

public Object pop() {...}

}

public class TestStack{

MyStack s = new MyStack();

Point p = new Point();

Circle c = new Circle();

s.push(p); s.push(c);

Circle c1 = (Circle) s.pop();

Point p1 = (Point) s.pop();

}

Page 40: Tong hop 16-09

PuzzlePuzzle

class MyStack<T> {

...

public void push(T x) {...}

public T pop() {

...

}

}

40

Page 41: Tong hop 16-09

I. Utility classI. Utility class

1. Wrapper Class

2. Math Class

3. String and StringBuffer

Page 42: Tong hop 16-09

Các lớp bao Các lớp bao

• Các kiểu dữ liệu nguyên thủy không có các

phương thức liên quan đến nó.

• Mỗi kiểu dữ liệu nguyên thủy có một lớp

tương ứng gọi là lớp bao:

– Các lớp bao sẽ “gói” dữ liệu nguyên thủy và

cung cấp các phương thức thích hợp cho dữ

liệu đó.

– Mỗi đối tượng của lớp bao đơn giản là lưu trữ

một biến đơn và đưa ra các phương thức để xử

lý nó.

– Các lớp bao là một phần của Java API

Page 43: Tong hop 16-09

Các lớp bao Các lớp bao

Page 44: Tong hop 16-09

Các lớp bao Các lớp bao

• Chuyển đổi kiểu dữ liệu

• Sử dụng toString() để chuyển các giá trị

số thành xâu.

• Sử dụng parse<type>() và valueOf() để

chuyển xâu thành các giá trị số

• Sử dụng các phương thức chuyển đổi rõ

ràng để chuyển giữa các kiểu dữ liệu số

Page 45: Tong hop 16-09

Các lớp bao Các lớp bao

• Chuyển đổi kiểu dữ liệu

Page 46: Tong hop 16-09

Các lớp bao Các lớp bao

• Các hằng giá trị Boolean

Boolean FALSE Boolean TRUE

Byte byte MIN_VALUE byte MAX_VALUE

Character int MAX_RADIX char MAX_VALUE int MIN_RADIX char MIN_VALUE Unicode classification constants

Double double MAX_VALUE double MIN_VALUE double NaN double NEGATIVE_INFINITY double POSITIVE_INFINITY

Float float MAX_VALUE float MIN_VALUE float NaN float NEGATIVE_INFINITY float POSITIVE_INFINITY

Integer int MIN_VALUE int MAX_VALUE

Long long MIN_VALUE long MAX_VALUE

Short short MIN_VALUE short MAX_VALUE

Page 47: Tong hop 16-09

Các lớp bao Các lớp bao

• Ví dụ

float f = Float.parseFloat("3.14159");

); // 3.14159

int i System.out.println(f= (new

Float(f)).intValue();

String s = (new Integer(i)).toString();

System.out.println(s); // 3

double d = (new

Integer(Integer.MAX_VALUE)).doubleValue(

);

System.out.println(d); // 2.147483647E9

Page 48: Tong hop 16-09

Các lớp bao Các lớp bao

• Ví dụdouble number = Double.parseDouble("42.76");

String hex = Integer.toHexString(42);

double value = new Integer("1234").doubleValue();

String input = "test 1-2-3";

int output = 0;

for (int index = 0;index < input.length();index++)

{

char c = input.charAt(index);

if (Character.isDigit(c))

output = output * 10 + Character.digit(c,

10);

}

System.out.println(output);

// 123// 123

Page 49: Tong hop 16-09

51

Lớp MathLớp Math

• java.math

– Các hằng lớp:

• PI

• E

– Các phương thức lớp:

• Các phương thức lượng giác

• Các phương thức số mũ

• Các phương thức làm tròn

• Các phương thức min, max, abs, và random

Page 50: Tong hop 16-09

52

Lớp MathLớp Math

• java.math

– Các phương thức lượng giác

• Math.sin(double rad)

• Math.cos(double rad)

• Math.tan(double rad)

• Math.acos(double rad)

• Math.asin(double rad)

• Math.atan(double rad)

• Math.toRadians(double deg)

• Math.toDegrees(double rad)

Page 51: Tong hop 16-09

53

Lớp MathLớp Math

• java.math

– Các phương thức lượng giác

Phương thức Giá trị trả về

• Math.sin(0) 0.0

• Math.sin(Math.PI/6) 0.5

• Math.cos(0) 1.0

• Math.cos(Math.PI/6) 0.866

Page 52: Tong hop 16-09

54

Lớp MathLớp Math

• java.math

– Các phương thức số mũ

Phương thức Giá trị trả về

• Math.exp(double a) ea

• Math.log(double a) ln(a)

• Math.pow(double a, double b) ab

• Math.sqrt(double a) căn bậc hai của a

Page 53: Tong hop 16-09

55

Lớp MathLớp Math

• java.math

– Các phương thức làm tròn– double ceil(double x)

x được làm tròn lên giá trị nguyên gần nhất. Giá trị nguyên này được trả về như một giá trị thực.

– double floor(double x)

x được làm tròn xuống giá trị nguyên gần nhất. Giá trị nguyên này được trả về như một giá trị thực.

– double rint(double x)

x được làm tròn đến giá trị nguyên gần nhất. Nếu phần lẻ của x bằng 0.5 thì giá trị đó là số chẵn.

– int round(float x)

Trả về (int)Math.floor(x+0.5)

– long round(double x)

Trả về (long)Math.floor(x+0.5)

Page 54: Tong hop 16-09

56

Lớp MathLớp Math

• java.math

– Các phương thức làm tròn

• Math.ceil(2.1) 3.0

• Math.ceil(-2.1) -2.0

• Math.floor(2.1) 2.0

• Math.floor(-2.1) -3.0

• Math.rint(2.1) 2.0

• Math.rint(-2.1) -2.0

• Math.rint(2.5) 2.0

• Math.round(2.6f) 3 (g/t int)

• Math.round(-2.6) -3 (g/t long)

• Math.round(2.0) 2 (g/t long)

Page 55: Tong hop 16-09

57

Lớp MathLớp Math

• java.math

– Các phương thức min, max, abs, và random

• Math.max(a, b) ; Math.min(a, b)

Trả về giá trị lớn nhất / nhỏ nhất của 2 tham số a, b.

• Math.abs(a)

Trả về giá trị tuyệt đối của a.

• Math.random()

Trả về một giá trị double ngẫu nhiên trong

khoảng[0.0, 1.0).

Page 56: Tong hop 16-09

58

Lớp MathLớp Math

• java.math

– Các phương thức min, max, abs, và random

• Math.max(2, 3) 3

• Math.max(2.5, 3) 3.0

• Math.abs(-2.4) 2.4

• 10+(int)(Math.random()*20)

Số nguyên thuộc [10, 29]

• 10 + (Math.random()*20)

Số thực thuộc [10.0, 30.0)

Page 57: Tong hop 16-09

Lớp System Lớp System

• Không cần/được khởi tạo đối tượng

– Lớp System là lớp final, các phương thức khởi tạo được khai báo là private.

– Tất cả các thuộc tính và phương thức của System đều được khai báo là static.

Page 58: Tong hop 16-09

Lớp System Lớp System

• java.lang.System chứa nhiều hàm tiện ích hữu dụng

– Kiểm soát vào ra (I/O) chuẩn

• Các luồng InputStream in, PrintStream out và err là các thuộc tính của lớp System.

• Có thể thiết lập lại nhờ các hàm setIn(), setOut() và setErr()

– arraycopy(): Sao chép mảng hoặc tập con với hiệu

năng cao.

Page 59: Tong hop 16-09

Lớp System Lớp System

– currentTimeMillis(): Trả về thời gian hiện tại theo

millisecond

– exit(): Kết thúc hoạt động của Java Virtual Machine

– gc(): Yêu cầu bộ thu gom rác hoạt động

– Các phương thức liên quan đến thuộc tính của hệ thống:Lấy các thông tin thuộc tính như phiên bản của Java Runtime Environment version, thư mục cài đặt Java,...

Page 60: Tong hop 16-09

Lớp System Lớp System

import java.util.Properties;

public class PropertiesTest {

public static void main(String[] args) {

System.out.println(

System.getProperty("path.separator"));

System.out.println(

System.getProperty("file.separator"));

System.out.println(

System.getProperty("java.class.path"));

System.out.println(

System.getProperty("os.name"));

System.out.println(

System.getProperty("os.version"));

System.out.println(System.getProperty("user.dir"));

System.out.println(System.getProperty("user.home"));

System.out.println(System.getProperty("user.name"));

}

}

Page 61: Tong hop 16-09

Lớp System Lớp System

Page 62: Tong hop 16-09

Xâu Xâu

• Một String được tạo thành từ một dãy các ký tự nằm trong dấu nháy kép:String a = "A String";

String b = "";

• Đối tượng String có thể khởi tạo theo nhiều cách:String c = new String();

String d = new String("Another String");

String e = String.valueOf(1.23);

String f = null;

Page 63: Tong hop 16-09

Xâu Xâu

• Ghép xâu:

– Toán tử + có thể nối các String:String a = "This" + " is a " + "String";

//a = “This is a String”

– Các kiểu dữ liệu cơ bản sử dụng trong lời gọi println() được chuyển đổi tự động sang kiểu Strings

System.out.println("answer = " + 1 + 2 + 3);

System.out.println("answer = " + (1+2+3));

• Hai câu lệnh trên có in ra cùng một kết quả?

Page 64: Tong hop 16-09

Xâu Xâu

• Các phương thức của xâu:

String name = "Joe Smith";

name.toLowerCase(); // "joe smith"

name.toUpperCase(); // "JOE SMITH"

"Joe Smith ".trim(); // "Joe Smith"

"Joe Smith".indexOf('e'); // 2

"Joe Smith".length(); // 9

"Joe Smith".charAt(5); // 'm'

"Joe Smith".substring(5); // "mith"

"Joe Smith".substring(2,5); // "e S"

Page 65: Tong hop 16-09

Xâu Xâu

• So sánh hai xâu:• So sánh oneString == anotherString sẽ gây

nhập nhằng:String s1 = “Hello”;

String s2 = “Hello”;

(s1==s2) trả về true

String s1 = new String (“Hello”);

String s2 = new String (“Hello”);

(s1==s2) trả về false

Hello

s1

s2

Hello

s1

s2

Hello

Page 66: Tong hop 16-09

Xâu Xâu

• So sánh hai xâu:

– Một xâu có thể so sánh xem có tương đương với một xâu khác

– oneString.equals(anotherString)

• Kiểm tra tính tương đương

• Trả về true hoặc false

– oneString.equalsIgnoreCase(anotherString

)

• Kiểm tra KHÔNG xét đến ký tự hoa, thường

• Trả về true hoặc false String name = "Joe";

if ("Joe".equals(name))

name += " Smith";

boolean same = "Joe".equalsIgnoreCase("joe");

Page 67: Tong hop 16-09

Xâu Xâu

• Lấy các ký tự trong chuỗi:

– Không sử dụng message[0]

– Mà dùng message.charAt(index)

– Chỉ số (index) bắt đầu từ 0

W e l c o m e t o J a v a

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

message

Indices

message.charAt(0) message.charAt(14) message.length() is 15

Page 68: Tong hop 16-09

Xâu Xâu

• String Conversions:– Nội dung của một chuỗi không thể thay đổi mỗi khi

chuỗi được tạo. Nhưng có thể convert một chuỗi thành một chuỗi mới bằng cách sử dụng các phương thức sau

• "Welcome".toLowerCase()

• "Welcome".toUpperCase()

• " Welcome ".trim()

• "Welcome".replace('e','A')

• "Welcome".replaceFirst('e','A')

• "Welcome".replaceAll('e','A')

Page 69: Tong hop 16-09

Xâu Xâu

• Tìm ký tự và chuỗi con:

– Sử dụng các phương thức sau:

– public int indexOf(int ch)

– public int lastIndexOf(int ch)

– public int indexOf(int ch, int fromIndex)

– public int lastIndexOf(int ch, int endIndex)

– public int indexOf(String str)

– public int lastIndexOf(String str)

– public int indexOf(String ch, int fromIndex)

– public int lastIndexOf(String str, int

endIndex)

Page 70: Tong hop 16-09

Xâu Xâu

• Tìm ký tự và chuỗi con:

– Ví dụ:

"Welcome to Java!".indexOf('W') returns 0.

"Welcome to Java!".indexOf('x') returns -1.

"Welcome to Java!".indexOf('o', 5) returns 9.

"Welcome to Java!".indexOf("come") returns 3.

"Welcome to Java!".indexOf("Java", 5) returns 11.

"Welcome to Java!".indexOf("java", 5) returns -1.

Page 71: Tong hop 16-09

Xâu Xâu

• Chuyển đổi ký tự và số thành chuỗi:char[] chars = "Java".toCharArray();

String str = new String(new char[]

{'J','a','v','a'});

– Lớp String cung cấp một số phương thức static valueOf để chuyển đổi một ký tự, mảng ký tự, và các giá trị số thành chuỗi.

– Những phương thức này có cùng tên valueOf với tham số khác nhau có kiểu char, char[], double, long, int, và float.String str = String.valueOf(5.44);

String str = String.valueOf(new char[]

{'J','a','v','a'});

Page 72: Tong hop 16-09

Xâu Xâu

• StringBuffer

– Kiểu bất biến và kiểu biến đổi

• Một kiểu có thể là bất biến hoặc có thể thay đổi

• Đối tượng của kiểu bất biến không thay đổi giá trị sau khi chúng được tạo ra

• Ngược lại, đối tượng của kiểu biến đổi có thể thay đổi giá trị sau khi chúng được tạo ra.

– String là kiểu bất biến, StringBuffer là kiểu biến đổi.

Page 73: Tong hop 16-09

Xâu Xâu

• StringBuffer

• String:

– Các xâu của lớp String được thiết kế để không thay đổi giá trị.

– Khi các xâu được ghép nối với nhau một đối tượng mới được tạo ra để lưu trữ kết quả.

– Ghép nối xâu thông thường rất tốn kém về bộ nhớ.

Page 74: Tong hop 16-09

Xâu Xâu

• StringBuffer

String s = new String(“hello”);

String t = s;

s = new String(“goodbye”);

Page 75: Tong hop 16-09

Xâu Xâu

• StringBuffer

• StringBuffer:

– Cung cấp các đối tượng xâu có thể thay đổi giá trị Sử

dụng StringBuffer khi:

• Dự đoán các ký tự trong xâu có thể thay đổi.

• Khi xử lý các xâu một cách linh động, ví dụ như đọc dữ liệu text từ một tệp tin.

– Cung cấp các cơ chế hiệu quả hơn cho việc xây dựng, ghép nối các xâu

Page 76: Tong hop 16-09

Xâu Xâu

• StringBuffer

• Tính biến đổi: Nếu một đối tượng bị biến đổi, thì tất cả các quan hệ với đối tượng sẽ nhận giá trị mới.

Page 77: Tong hop 16-09

Xâu Xâu

• StringBuffer

– public StringBuffer()

Xây dựng một string buffer rỗng có dung lượng = 16.

– public StringBuffer(int length)

Xây dựng một string buffer rỗng có dung lượng = length.

– public StringBuffer(String str)

Xây dựng một string buffer với nội dung là chuỗi str.

Dung lượng khởi tạo bằng 16 + str.length().

Page 78: Tong hop 16-09

Xâu Xâu

• StringBuffer

• Nếu tạo xâu thông qua vòng lặp thì sử dụng StringBuffer

StringBuffer buffer = new StringBuffer(15);

buffer.append("This is ") ;

buffer.append("String") ;

buffer.insert(7," a") ;

buffer.append('.');

System.out.println(buffer.length()); // 17

System.out.println(buffer.capacity()); // 32

String output = buffer.toString() ;

System.out.println(output); // "This is a String."

Page 79: Tong hop 16-09

Xâu Xâu

• Lớp String:– Constructor:

• String()• String(byte[] bytes)• String(byte[] bytes, int offset, int length)• String(char[] value)• String(char[] value, int offset, int length)• String(String original)• String(StringBuffer buffer)

– Một số phương thức:• char charAt(int index)• boolean equals(Object anObject)• int indexOf(String str)• int length()• boolean matches(String regex)• String substring(int beginIndex, intendIndex)• String toUpperCase()• String trim()

Page 80: Tong hop 16-09

Xâu Xâu

• Lớp StringBuffer:

– Constructors:

• StringBuffer()

• StringBuffer(int length)

• StringBuffer(String str)

– Một số phương thức:

• StringBuffer append(…)

• StringBuffer insert(…)

• StringBuffer delete(int start, int end)

• int length()

• StringBuffer reverse()

• String substring(int start, int end)

• String toString()