Giới thiệu
Bài viết minh họa cách dùng phương thức String.concat() để nối chuỗi trong Android TextView. So sánh với các cách nối chuỗi khác.
Các bước thực hiện
Bước 1: Tạo project mới
Android Studio → File → New Project → Empty Activity.
Bước 2: Giao diện (res/layout/activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="16dp">
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nhập tên của bạn"
android:inputType="textCapWords" />
<Button
android:id="@+id/btnConcat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Nối chuỗi" />
<TextView
android:id="@+id/tvResult"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
Bước 3: Logic (MainActivity.kt)
package com.example.stringconcat
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnConcat.setOnClickListener {
val input = etName.text.toString().trim()
if (input.isEmpty()) {
etName.error = "Vui lòng nhập tên"
return@setOnClickListener
}
// Cách 1: concat() - trả về String mới
val result1 = input.concat(" tutorialspoint.com")
// Cách 2: Toán tử + (khuyên dùng cho Kotlin)
val result2 = "$input tutorialspoint.com"
// Cách 3: StringBuilder (hiệu quả cho nhiều lần nối)
val result3 = StringBuilder(input).append(" tutorialspoint.com").toString()
// Cách 4: String.format
val result4 = "%s tutorialspoint.com".format(input)
tvResult.text = "Kết quả: $result1"
// Log để so sánh
println("concat: $result1")
println("template: $result2")
println("StringBuilder: $result3")
println("format: $result4")
}
}
}
So sánh các cách nối chuỗi
| Cách | Cú pháp | Hiệu năng | Độ đọc | Ghi chú |
|---|---|---|---|---|
concat() |
s1.concat(s2) |
Tạo object mới mỗi lần | Trung bình | Null-safe (throw NPE nếu s1 null) |
+ / Template |
"$s1 $s2" |
Tối ưu bởi compiler (StringBuilder) | ✅ Tốt nhất (Kotlin) | Null-safe, đọc dễ |
StringBuilder |
StringBuilder().append()... |
✅ Tốt nhất (loop, nhiều lần) | Thấp | Dùng cho loop, build lớn |
String.format() |
"%s %s".format(a,b) |
Chậm (parse format) | Tốt cho format phức tạp | Localization, format số/ngày |
joinToString() |
list.joinToString(" ") |
Tốt | ✅ Rất tốt | Nối collection/list |
Lưu ý quan trọng
- String bất biến (immutable): Mỗi lần nối tạo String mới → tránh nối trong loop lớn.
concat()némNullPointerExceptionnếu receiver null, khác với+(null thành "null").- Kotlin: ưu tiên String Template
"$var"- an toàn, đọc dễ, hiệu năng tốt. - Android: Dùng
getString(R.string.fmt, args)cho string resource có placeholder.
Ví dụ với String Resource
<!-- res/values/strings.xml --> <string name="welcome_message">Chào %1$s, bạn đang xem %2$s</string>
val msg = getString(R.string.welcome_message, "Sairam", "tutorialspoint.com") tvResult.text = msg