常用类回顾之(String类)
String類(lèi):
String類(lèi):表示不可變的字符串,當(dāng)前對(duì)象創(chuàng)建完畢之后,該對(duì)象的內(nèi)容(字符序列)是不能改變的,一旦內(nèi)容改變就是一個(gè)新的對(duì)象.
String對(duì)象的創(chuàng)建:
1):直接賦一個(gè)字面量: String str1 = “ABCD”;
2):通過(guò)構(gòu)造器創(chuàng)建: String str2 = new String(“ABCD”);
兩種方式有什么區(qū)別,分別在內(nèi)存中如何分布?
String對(duì)象的空值:
1):表示引用為空(null): String str 1 = null; 沒(méi)有初始化,沒(méi)有分配內(nèi)存空間.
2):內(nèi)容為空字符串: String str2 = “”; 以及初始化,分配內(nèi)存空間,不過(guò)沒(méi)有內(nèi)容.
判斷字符串非空:
1):引用不能為空(null);
2):字符內(nèi)容不能為空字符串(“”);
字符串的比較操作:
1):使用”==”號(hào): 只能比較引用的內(nèi)存地址是否相同.
2):使用equals方法: 在Object類(lèi)中和”==”號(hào)相同,建議子類(lèi)覆蓋equals方法去比較自己的內(nèi)容.String類(lèi)覆蓋equals方法,比較的是字符內(nèi)容.
面試題1:
:::下列代碼分別創(chuàng)建了幾個(gè)String對(duì)象.
String str1 = “ABCD”;
//最多創(chuàng)建一個(gè)String對(duì)象,最少不創(chuàng)建String對(duì)象.如果常量池中,以及存在”ABCD”,那么str1直接引用,此時(shí)不創(chuàng)建String對(duì)象.否則,先在常量池先創(chuàng)建”ABCD”內(nèi)存空間,再引用.
String str2 = new String(“ABCD”);
最多創(chuàng)建兩個(gè)String對(duì)象,至少創(chuàng)建一個(gè)String對(duì)象.new關(guān)鍵字:絕對(duì)會(huì)在堆空間,創(chuàng)建內(nèi)存區(qū)域. 所以至少創(chuàng)建一個(gè)String個(gè)對(duì)象.
面試題2:
:::說(shuō)說(shuō)下面String對(duì)象,彼此之間是否相等.
String str1="ABCD";String str2="A"+"B"+"C"+"D";String str3="AB"+"CD";String temp="CD";String str4="AB"+temp;System.out.println(str1==str2);System.out.println(str1==str3);System.out.println(str1==str4);String對(duì)象比較:
1):單獨(dú)使用""引號(hào)創(chuàng)建的字符串都是直接量,編譯期就已經(jīng)確定存儲(chǔ)到常量池中;
2):使用new String("")創(chuàng)建的對(duì)象會(huì)存儲(chǔ)到堆內(nèi)存中,是運(yùn)行期才創(chuàng)建;
3):使用只包含直接量的字符串連接符如"aa" + "bb"創(chuàng)建的也是直接量編譯期就能確定,已經(jīng)確定存儲(chǔ)到常量池中(str2和str3);
4):使用包含String直接量(無(wú)final修飾符)的字符串表達(dá)式(如"aa" + s1)創(chuàng)建的對(duì)象是運(yùn)行期才創(chuàng)建的,存儲(chǔ)在堆中;
通過(guò)變量/調(diào)用方法去連接字符串,都只能在運(yùn)行時(shí)期才能確定變量的值和方法的返回值,不存在編譯優(yōu)化操作.
常用方法:
1):String的創(chuàng)建和轉(zhuǎn)換:
byte[] getBytes():把字符串轉(zhuǎn)換為byte數(shù)組
String(byte[] bytes):把byte數(shù)組轉(zhuǎn)換為字符串
————————————————————————————————————————————————————————————————————
String str="abcd";byte[] bytes=str.getBytes();for (byte b : bytes) {System.out.println(b);}String str2=new String(bytes);System.out.println(str2);——————————————————————————————————————————————————————————————————
char[] toCharArray():把字符串轉(zhuǎn)換為char數(shù)組
String(char[] value):把char數(shù)組轉(zhuǎn)換為字符串
String str="abcd";char[] chars=str.toCharArray();for (char c : chars) {System.out.println(c);}System.out.println(new String(chars));獲取字符串信息
int length() 返回此字符串的長(zhǎng)度
char charAt(int index) 返回指定索引處的 char 值
int indexOf(String str)返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
int lastIndexOf(String str)返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引
String str="abcda";System.out.println(str.length());System.out.println(str.charAt(0));System.out.println(str.indexOf("cd"));System.out.println(str.lastIndexOf('a'));System.out.println(str.contains("b"));字符串比較判斷
boolean equals(Object anObject) 將此字符串與指定的對(duì)象比較。
boolean equalsIgnoreCase(String anotherString) 將此 String 與另一個(gè) String 比較,不考慮大小寫(xiě)
boolean contentEquals(CharSequence cs) 將此字符串與指定的 CharSequence 比較
String a1="abc";String a2="aBc";System.out.println(a1.equals(a2));System.out.println(a1.equalsIgnoreCase(a2));System.out.println(a1.contentEquals(a2));字符串大小寫(xiě)轉(zhuǎn)換
String toUpperCase() 把當(dāng)前字符串轉(zhuǎn)換為大寫(xiě)(誰(shuí)調(diào)用該方法,誰(shuí)就是當(dāng)前字符)
String toLowerCase() 把當(dāng)前字符串轉(zhuǎn)換為小寫(xiě)
練習(xí)1:有這么樣一個(gè)字符串"a1.txt;a2.txt;a3.jpg;hello.java;33.png",獲取以hello開(kāi)頭的文件的文件名和擴(kuò)展名.
String str="a1.txt;a2.txt;a3.jpg;hello.java;33.png";String[] filenames=str.split(";");for (String s : filenames) {//System.out.println(s);if(s.startsWith("hello")){int index=s.lastIndexOf(".");System.out.println("hello"+s.substring(index));}}練習(xí)2:寫(xiě)一個(gè)工具類(lèi),判斷字符串非空或空
package gwd.com.day12;public class utils {private utils(){}public static boolean hasLength(String str){return str!=null && !"".equals(str.trim()); }public static boolean isBlank(String str) { return !hasLength(str); }}String、StringBuilder、StringBuffer
分別使用String/StringBuilder/StringBuffer來(lái)拼接30000次字符串,對(duì)比各自損耗的時(shí)間:
經(jīng)過(guò)測(cè)試:
String做字符串拼接的時(shí)候,性能極低(耗時(shí)),原因是Sting是不可變的,每次內(nèi)容改變都會(huì)在內(nèi)存中創(chuàng)建新的對(duì)象.
String耗時(shí):1964ms
StringBuffer耗時(shí):3ms
StringBuilder耗時(shí):1ms
結(jié)論:以后拼接字符串,統(tǒng)統(tǒng)使用StringBuffer/StringBuilder,不要使用String.
String和StringBuilder以及StringBuffer的區(qū)別(建議使用StringBuilder):
StringBuffer和StringBuilder都表示可變的字符串,功能方法都是相同的.
唯一的區(qū)別:
StringBuffer: StringBuffer中的方法都使用了synchronized修飾符,表示同步的,在多線程并發(fā)的時(shí)候可以保證線程安全,保證線程安全的時(shí)候,性能(速度)較低.
StringBuilder:StringBuilder中的方法都沒(méi)有使用了synchronized修飾符,不安全,但是性能較高.
使用StringBuilder無(wú)參數(shù)的構(gòu)造器,在底層創(chuàng)建了一個(gè)長(zhǎng)度為16的char數(shù)組:
char[] value = new char[16];
此時(shí)該數(shù)組只能存儲(chǔ)16個(gè)字符,如果超過(guò)了,得自動(dòng)擴(kuò)容.自動(dòng)擴(kuò)容(創(chuàng)建長(zhǎng)度更大的數(shù)組,再把之前的數(shù)組拷貝到新數(shù)組)
此時(shí)性能極低,一般的,我們事先知道大概需要存儲(chǔ)多少字符,在構(gòu)造器中就應(yīng)該設(shè)置.
//創(chuàng)建一個(gè)長(zhǎng)度為80的char數(shù)組.
new StringBuilder(80);常用方法:
append(Object val):表示追加任意類(lèi)型數(shù)據(jù)
StringBuilder deleteCharAt(int index) :刪除字符串中,指定位置的字符
StringBuilder sb=new StringBuilder();sb.append("xx");sb.append("tt");System.out.println(sb);轉(zhuǎn)載于:https://www.cnblogs.com/java-gwd/p/6589179.html
總結(jié)
以上是生活随笔為你收集整理的常用类回顾之(String类)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows 下安装 rabbitmq
- 下一篇: 基于token与基于服务器的身份认证