tong hop 16-09
DESCRIPTION
JavaTRANSCRIPT
Tổng hợp: Tổng hợp: Polymorphism and Polymorphism and generic programming generic programming -- Utility Utility classes and collectionsclasses and collections
I. POLYMORPHISM
1. Example
Đ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
Đ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
Đ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
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 + ")");
}
}
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
II. DOWN CASTING AND UP CASTING
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;
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
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
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
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
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
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
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
IV. METHOD CALL BINDING
1. Static binding
2. Dynamic binding
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
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
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
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
V. GENERIC PROGRAMMING
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
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.
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
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;
}
}
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
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
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
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;}
}
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;}
}
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
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) { … }
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);
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 & .. >
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
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
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
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();
}
PuzzlePuzzle
class MyStack<T> {
...
public void push(T x) {...}
public T pop() {
...
}
}
40
I. Utility classI. Utility class
1. Wrapper Class
2. Math Class
3. String and StringBuffer
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
Các lớp bao Các lớp bao
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ố
Các lớp bao Các lớp bao
• Chuyển đổi kiểu dữ liệu
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
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
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
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
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)
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
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
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)
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)
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).
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)
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.
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.
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,...
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"));
}
}
Lớp System Lớp System
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;
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ả?
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"
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
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");
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
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')
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)
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.
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'});
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.
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ớ.
Xâu Xâu
• StringBuffer
String s = new String(“hello”);
String t = s;
s = new String(“goodbye”);
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
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.
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().
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."
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()
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()