String類的本質StringBuffer和StringBuilder 常見包裝類 |
一、 String類
特點
String用於保存字符串
String創建對象
“hello” 默認就是 一個String的對象(實例)
1、通過構造方法
String str = new String(“hello”);
2、直接賦值
String str = “hello”;
1、★★問題思考?
兩種創建對象方式的區別:
直接賦值:
先去常量池中查看 是否有字面值一樣的 空間,如果沒有則創建,如果有,則直接 指向。
通過構造方法:
肯定會在堆中創建空間,空間中的字符串值引用了 常量池中的字面上的值。
如果常量池中有和字面值一樣的空間,則直接引用,否則 就創建
2、★★問題思考?
String str=new String("hello");創建了幾個對象
創建了兩個對象
3、★★問題思考?
String str="hello"+"world";創建了幾個對象
創建了 三個對象
"hello"/"world"/"helloworld"
str+="xiaohua";每次拼接都要新開空間,所以效率比較低
原因:字符串保存的是常量,一旦開闢空間,裏面的值不能更改!
String類的常用方法
見已發佈String相關javaSe基礎博客文章
二、 StringBuffer類
(1)特點
String類的增強版
實質上也是保存字符串,但 增刪改的話是在原來的空間上,不需要新開闢空間,效率 比較高!!
StringBuffer
1、創建對象
通過構造器
2、常用方法
append追加
insert插入
replace修改
delete刪除
reverse反轉
length獲取長度
indexOf獲取字符或字符串第一次出現的索引
lastIndexOf 獲取字符串或字符串最後一次出現的索引
3、String和StringBuffer的轉換
String——StringBuffer
通過構造器
StringBuffer——String
通過toString
4、StringBuffer和StringBuilder、String對比
《1》效率不同,StringBuilder>StringBuffer>String
《2》StringBuffer和StringBuilder都是保存字符串變量
《3》增刪改操作都是在自身基礎上修改,不用重新開闢空間,String 保存字符串常量
每次增刪改都需要重新開闢空間。
《4》StringBuffer 線程安全、同步、效率低、版本老的,
StringBuilder線程不安全、不同步、
《5》效率高、版本新的
1、★★思考問題
String和StringBuffer的區別
String 保存字符串 常量
StringBuffer 保存字符串 變量
(2)創建對象
StringBuffer s = new StringBuffer(“hello”);
(3)StringBuilder/StringBuffer/String對比
String 保存字符串常量,裏面的值不能更改
StringBuffer和StringBuilder保存字符串變量,裏面的值可以更改
線程安全 同步 效率 版本
StringBuilder 不安全 不同步 高 新(1.5)
StringBuffer 安全 同步 低 老(1.0)
效率
StringBuilder>StringBuffer>String
常見方法
見代碼:
public class TestStringBuffer {
public static void main(String[] args) throws Exception {
//創建StringBuffer對象
StringBuffer s = new StringBuffer("hello");
//方法一:append 追加
/*
* 特點:
*
* ☆可以在本身基礎上追加
* ★可以追加任意類型
* ★返回類型 :StringBuffer
*/
// s.append("張三");
// s.append("李四");
// s.append(true);
// s.append('男');
// s.append(1.5);
// s.append(100);
System.out.println(s.append("張無忌").append("周芷若").append("小昭"));
//方法二:insert 插入
System.out.println(s.insert(8, true));;
//方法三:replace 修改
/*
* 參數1: 要替換的起始索引(包含)
* 參數2:要替換的結束索引(不包含)
* 參數3: 新的元素
*/
System.out.println(s.replace(8, 12, "曹小華"));;
//方法四:delete 刪除
/*
* 參數1: 要刪除的起始索引(包含)
* 參數2:要刪除的結束索引(不包含)
*/
System.out.println(s.delete(11, s.length()));;
//indexOf、lastIndexOf、length、substring
//-------------String類和StringBuffer的轉換--------------
/*
* String——StringBuffer,通過構造器
* StringBuffer——String,通過 toString方法
*/
StringBuffer bu1=new StringBuffer("hlll");
String string = bu1.toString();
三、包裝類
1、概念:
將基本類型 包裝成 對應的引用類型,保存的數值一樣,但可以有屬性和方法
2、對應關係
byte-Byte
short-Short
int-Integer
long-Long
float-Float
double-Double
char-Character
boolean-Boolean
3、自動裝箱和拆箱
自動裝箱(基本類型——包裝類)
Integer i = 10;
自動拆箱(包裝類——基本類型)
int a= i;
int x=i+3;
4、類型轉換
《1》Integer和String之間
Integer——String
調用方法toString
拼接字符串
String——Integer
Integer i=new Integer(string);
調用方法valueOf
《2》Integer和int之間
Integer——int
自動拆箱
調用方法intValue
int——Integer
自動裝箱
Integer i=new Integer(int);
《3》int和String之間
int——String
拼接字符串
String——int
調用方法parseInt
《4》Character類的常見方法
isLetter 確定指定字符是否爲字母。
isUpperCase 確定指定字符是否爲大寫字母。
isLowerCase 確定指定字符是否爲小寫字母。
isDigit 確定指定字符是否爲數字
toUpperCase 使用取自 UnicodeData 文件的大小寫映射信息將字符參數轉換爲大寫。
toLowerCase 使用取自 UnicodeData 文件的大小寫映射信息將字符(Unicode 代碼點)參數轉換爲小寫。
四、常用類方法
1、此類用於演示Date類的使用
按格式顯示當前日期
public class TestDate {
public static void main(String[] args) {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strDate = sdf.format(d);
System.out.println(strDate);
}
}
2、此類用於演示日曆(Calendar)類的使用
public class TestCalendar {
public static void main(String[] args) {
//創建Calendar對象
Calendar c=Calendar.getInstance();
System.out.println(c);
//調用方法
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日 "+hour+":"+minute+":"+second);
}
}
3、此類用於演示(System)類的使用
public class TestSystem {
public static void main(String[] args) {
//方法一:exit退出程序
System.out.println("hehehhe");
// System.exit(0);
// System.out.println("hhahahha"); 已退出未執行
//方法二:arrayCopy
/*
* 參數1:源數組
* 參數2:源數組 複製的起始索引
* 參數3:目標數組
* 參數4:目標數組的起始索引
* 參數5:複製的個數
*/
int[] src={1,2,3};
int[] dest=new int[src.length];
System.arraycopy(src, 0, dest, 1, src.length-1);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
}
//方法三:currentTimeMillens,單位ms
long start = System.currentTimeMillis();
//執行某段代碼花費了一定時間
long end = System.currentTimeMillis();
//方法四:getProperties 獲取系統屬性
System.out.println("-----------------------------------");
Properties properties = System.getProperties();
properties.list(System.out);
}
}
4、此類用於演示(Character)類的使用
public class TestCharacter {
public static void main(String[] args) {
Character c=new Character('a');
Character c2 ='a';//自動裝箱
char ch=c2;//自動拆箱
//調用方法
// 判斷
System.out.println(Character.isLetter('4'));
System.out.println(Character.isLetter('x'));
System.out.println(Character.isDigit('4'));
System.out.println(Character.isDigit('*'));
System.out.println(Character.isUpperCase('M'));
System.out.println(Character.isLowerCase('M'));
//和String之間的轉換
//將String 轉換成 char[]
String str="abc";
char[] chs = str.toCharArray();
// for (int i = 0; i < chs.length; i++) {
// System.out.println(chs[i]);
// }
//
//將char 轉換成 String
String string = c2.toString();
System.out.println(string);
}
}