在Java中,字串被作爲String型別的物件來處理。String類位於java.lang包中,預設情況下,該包被自動匯入所有的程式。建立String物件的方法如以下程式碼所示:
String s=「Hello World」;
或者
String s=new String(「Hello World」);
String類提供了許多有用的方法。例如,獲得字串的長度、對兩個字串進行比較、連線兩個字串以及提取一個字串中的某一個部分等。可以使用String類提供的方法來完成對字串的操作。
(1)求字串長度length()
呼叫length()方法的語法格式如下:
字串.length()
length()方法返回字串的長度。
範例一:註冊新使用者,要求密碼長度不能小於6位。
程式碼展示:
import java.util.Scanner;
public class Register {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String uname,pwd;
System.out.print("請輸入使用者名稱:");
uname = sc.next();
System.out.print("請輸入密碼:");
pwd = sc.next();
if (pwd.length() >= 6) {
System.out.println("註冊成功!");
} else {
System.out.println("密碼長度不能小於6位!");
}
}
}
輸出結果:
(2)字串比較
字串比較的語法格式如下:
字串1.equals(字串2);
比較兩個字串的值是否相同,返回值爲boolean型別,如果相同,則返回真值,否則返回假值。
範例二:註冊成功後,實現登錄驗證。使用者名稱爲「TOM」,密碼爲「1234567」。
分析如下:在使用equals()方法比較兩個字串時,它逐個字元比較組成兩個字串的每個字元是否相同。如果都相同,則返回真值,否則返回假值。對於字元的大小寫,也在檢查範圍之內。
程式碼展示:
import java.util.Scanner;
public class Register {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String uname,pwd;
System.out.print("請輸入使用者名稱:");
uname = sc.next();
System.out.print("請輸入密碼:");
pwd = sc.next();
if (uname.equals("TOM") && pwd.equals("1234567")) {
System.out.println("登錄成功!");
} else {
System.out.println("使用者名稱或密碼錯誤,登錄失敗!");
}
}
}
輸出結果:
範例三:實現會員註冊,要求使用者名稱長度不小於3,密碼長度不小於6,註冊時兩次輸入密碼必須相同 。
程式碼展示:
import java.util.Scanner;
public class ZhuCE {
public static void main(String[] args) {
String name;
String mima1;
String miam2;
boolean flag=false;
do {
System.out.println("***歡迎進入註冊系統***");
Scanner sc = new Scanner(System.in);
System.out.print("請輸入使用者名稱:");
name = sc.next();
System.out.print("請輸入密碼:");
mima1 = sc.next();
System.out.print("請再次輸入密碼");
miam2 = sc.next();
if (name.length() < 3 || mima1.length() < 6 || miam2.length() < 6) {
System.out.println("使用者名稱長度小於3,密碼長度不能小於6!");
flag = false;
} else if (!mima1.equals(miam2)) {
System.out.println("兩次密碼輸入不相同!");
flag = false;
} else {
flag = true;
}
}while (flag==false);
System.out.println("註冊成功,請記住密碼!");
}}
輸出結果:
(3)字串拼接
字串拼接的語法格式如下:
字串1.concat(字串2);
字串2被拼接到字串1的後面,返回拼接後的新字串。
範例四:
程式碼展示:
public class Register {
public static void main(String[] args) {
String s = new String("你好,");
String name = new String("張三!");
String sentence = s.concat(name);
System.out.println(sentence);
String sayHi = name + "你好";
System.out.println(sayHi);
}
}
輸出結果:
拼接字串的方法有兩種:使用「+」運算子或使用String類的concat()方法。
(4)字串提取和查詢
常用的提取和搜尋字串的方法如下所示:
範例五:
public class TestString {
public static void main(String[] args) {
String str = " 你好 |我1是一名 老2師|教jav3a|歡迎來口碑 ";
System.out.println(str.trim());//左右去空格
System.out.println(str.contains("我1是一名"));
System.out.println(str.startsWith("a", 20));
byte[] bytes=str.getBytes();
System.out.println(str.length());
System.out.println(bytes.length);
}
}
輸出結果:
字串是一個字元序列,每一個字元都有自己的位置,字串事實上也是一個字元陣列,因此它的索引位置從0到字串長度-1結束。
範例六:
import java.util.Arrays;
public class TestString2 {
public static void main(String[] args) {
String str = "我是一名老師";
String s = new String(str.getBytes(), 0, 3);
System.out.println(s);
char[] chars = str.toCharArray();
System.out.println(Arrays.toString(chars));//轉成char型別陣列
}
}
輸出結果:
(5)字串拆分
字串拆分的語法格式如下:
字串名.split(separator,limit);
separator是可選項,表示根據匹配指定的正則表達式來拆分此字串。如果匹配不上,則結果陣列只有一個元素,即此字串。
limit可選項,該值用來限制返回陣列中的元素個數。
範例七:現有一個字串,它是一段歌詞,每句都以空格「 」結尾,輸出結果如下所示:
分析如下:實現這個需求,只要將每局歌詞按照空格拆分即可。此時就可以使用split()方法實現這個需求。
程式碼展示:
public class Lyric {
public static void main(String[] args) {
String words = "長亭外 古道邊 芳草碧連天 晚風扶 柳笛聲殘 夕陽山外山 ";
String[] printword = new String[100];//定義接收陣列
System.out.println("***原歌詞格式***\n" + words);
System.out.println("\n***拆分後歌詞格式***");
printword=words.split(" ");//按照空格進行拆分
for (int i = 0; i < printword.length; i++) {
System.out.println(printword[i]);//列印輸出
}
}
}
輸出結果:
範例八:輸入一個字串,再輸入要查詢的字元,判斷該字元在該字串中出現的次數。
程式碼展示:
import java.util.Scanner;
public class TestAi {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入字元");
String r1=sc.next();
System.out.print("請輸入要查詢的字元:");
char zi=sc.next().charAt(0);
char[] a=r1.toCharArray();
int r=0;
for (int i = 0; i <r1.length() ; i++) {
if(zi==a[i])
r++;
}
System.out.println(r1+"中包含"+r+"個"+zi+"字!");
}
}
輸出結果:
除了使用String類儲存字串之外,還可以使用StringBuffer類來儲存字串。StringBuffer類也是Java提供的用於處理字串的一個類。而且它是比String類更高效地儲存字串的一種參照數據型別。特別是對字串進行連線操作時,使用StringBuffer類可以大大提高程式的執行效率。
(1)如何使用StringBuffer類
StringBuffer類位於java.util包中,是String類的增強類、StringBuffer類提供了很多方法可供使用。
宣告StringBuffer物件並初始化的方法如下所示:
StringBuffer sb2=new StringBuffer(「青春無悔」);
(2)常用的StringBuffer類方法
①toString()方法
轉換爲String型別的語法格式如下:
字串1.toString();
將StringBuffer型別的字串1轉換爲String型別的物件並返回。
②append()方法
追加字串的語法格式如下:
字串.append(參數);
將參數連線到字串後並返回。
該方法和String類的concat()方法一樣,都是把一個字串追加倒另一個字串後面,所不同的是String類中只能將String型別的字串追加到一個字串後,而StringBuffer類可以將任何型別的值追加到字串之後。
範例九:
使用StringBuffer類實現字串追加。
程式碼展示:
public class SbAppend {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("青春無悔");
int num = 110;
//在字串後面追加字串
StringBuffer sb1 = sb.append("我心永恆");
System.out.println(sb1);
//在字串後面追加字元
StringBuffer sb2 = sb1.append('啊');
System.out.println(sb2);
//在字串後面追加整型數位
StringBuffer sb3 = sb2.append(num);
System.out.println(sb3);
}
}
輸出結果:
③insert()方法
插入字串的語法格式如下:
字串.insert(位置,參數);
將參數插入到字串指定位置後並返回。參數值可以是包括String任何型別。
範例十:編寫一個方法,實現將一個數字字串轉換成以逗號分隔的數位串,即從右邊開每3個數字用逗號分隔
分析:利用StringBuffer類的length()方法,獲取數位串的長度,使用for回圈從後向前每隔3位插入逗號。
程式碼展示:
import java.util.Scanner;
public class TestInsert {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//接收數位串,存放於StringBuffer型別的物件中
System.out.print("請輸入一串數位:");
String nums = sc.next();
StringBuffer str = new StringBuffer(nums);
//從後往前每隔3位新增逗號
for (int i = str.length() - 3; i > 0; i = i - 3) {
str.insert(i, ',');
}
System.out.print(str);
}
}
輸出結果:
java.lang.StringBuilder是JDK 5.0版本新增的類,它是一個 可變的字元序列。 此類提供一個與StringBuffer 相容的API,被設計用作StringBuffer 的一.個簡易替換,在大多數實現中,它比StringBuffer執行要快。使用StringBuilder類處理字串的方法與StringBuffer類基本一樣。
String、StringBuffer和StringBuilder 這3個類在處理字串時有各自的特點和適用場合,具體如下:
(1)String:字串常數
String是不可變的物件,在每次對String型別進行改變時其實都等同於生成了一個新的String物件,然後指向新的String 物件,所以經常改變內容的字串最好不要用String型別,因爲每次生成物件都會對系統效能產生影響。
(2) StringBuffer:字串變數
StringBuffer是可變的字串,在每次對StringBuffer物件進行改變時,會對StringBuffer物件本身進行操作,而不是生成新的物件,再改變物件參照。所以,在字串物件經常改變的情況下推薦使用StringBuffer類。
字串連線操作中,Stringuffer 類的執行效率要比String類高,例如:
String str=new String(「welcome to」);
str+=「here」;
以上這兩句程式碼是使用String型別來操作字串,但其處理步驟實際上是通過建立一個StringBuffer物件,讓它呼叫append()方法,最後再轉化成String,這樣的話,String的連線操作比StringBuffer多出了一些附加操作,當然效率要低。並且由於String物件的不可變性也會影響效能。
(3 ) StringBuilder:字串變數
JDK5.0版本以後提供了StringBuilder類,它和StringBuffer類等價,區別在於StringBuffer類是執行緒安全的,StringBuilder 類是單執行緒的,不提供同步,理論上效率更高。
java.util包也是Java內建的一一個工具包,它包含了集合框架、日期和時間、隨機函數生成器等各種實用工具。java.util 包不會預設匯入,如果要使用該包中的類,則必須在程式的開始部分進行手工匯入。
下面 下麪介紹java.util包中幾個常見的類。
java.util 包中提供的和日期時間相關的類有Date類、Calendar 類和SimpleDateFormat類等。
Date類物件用來表示日期和時間,該類提供了一系列操作 日期和時間各組成部分的方法。Date 類中使用最多的是獲取系統當前的日期和時間,如Date date= new Date();這句程式碼是使用系統當前時間建立日期物件。
Calendar類也是用來操作日期和時間的類,它可以看作是Date類的一個增強版。Calendar類提供了一組方法, 允許把一個以毫秒 爲單位的時間轉換成年、 月、日、小時、分、秒。可以把Calendar類當作是萬年曆,預設顯示的是當前的時間,當然也可以檢視其他時間。
Calendar類是抽象類,可以通過靜態方法getlnstance0O獲得Calender類的物件,其實這個獲得的物件是它的子類的物件。
Calendar類提供一些方法和靜態欄位來操作日曆,例如:
➢int get(int field):返回給定日曆欄位的值。
➢YEAR: 指示年。
➢MONTH: 指示月。
➢DAY_ OF_ MONTH:指示一個月中的某天。
➢DAY OF_ WEEK:指示一個星期中的某天。
另外常用的還有格式化日期時間的類DateFormat類,它在java.text包下,是|一個抽象類,提供了多種格式化和解析時間的方法。格式化是指將日期轉換成文字,解析是指將文字轉換成日期格式。使用比較多的是它的子類SimpleDateFormat,SimpleDateFormat類是一個以與語言環境有關的方式來格式化和解析日期的具體類,如「yyyy-MM-dd HH:mm:ss」就是指定的一種日期和時間格式。
範例十一:
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class TestDate {
public static void main(String[] args) {
//格林威治時間1970 01 01 00 00 00 000毫秒到當前毫秒的差值
long now = System.currentTimeMillis();
// System.out.println(now/60/60/24/365);
Date d = new Date();
System.out.println(d);
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String rst = format.format(d);
System.out.println(rst);
//SimpleDateFormat f = new SimpleDateFormat();
System.out.println(d.getTime());
Calendar c = format.getCalendar();
System.out.println("當前的年:"+c.getWeekYear());
System.out.println("一年有多少個周:" + c.getWeeksInWeekYear());
// System.out.println(c.get(Calendar.MONTH));
//System.out.println(c.get(Calendar.DAY_OF_MONTH));
// System.out.println(c.get(Calendar.DAY_OF_YEAR));
System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH));
// System.out.println(c.getFirstDayOfWeek());
}
}
輸出結果:
Random類用於生成亂數。每當需要以任意或非系統方式生成數位時,可使用此類。之前學習過的Math類的random()方法也可以產生亂數,其實Math類的random()方法底層就是使用Random類實現的。
Random類中還定義了很多方法用於獲取亂數,最常用的是nextInt()方法,它返回下一個僞亂數,返回值型別是整型。
返回下一個僞亂數的語法格式如下:
int nextInt();
int nextInt(int n);
前者返回下一個僞亂數,它是此亂數生成器的序列中均勻分佈的int值。
後者返回下一個僞亂數,它是取自亂數生成器序列的、在0(包括)和指定值n(不包括n)之間均勻分佈的int值。
範例十二:隨機生成20個10以內或等於0的整數,並將顯示出來。
程式碼展示:
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
//建立一個Random物件
Random rand = new Random();
//隨機生成20個隨機整數,並顯示
for (int i = 0; i < 20; i++) {
int num = rand.nextInt(10);
System.out.println("第"+(i+1)+"個亂數是:"+num);
}
}
}
輸出結果:
注意:如果用同樣一個種字值來初始化兩個Random物件,然後用每個物件呼叫相同的方法,那麼得到的亂數也是相同的。