java.lang.String類的使用
一、String的用法
String類在java.lang包中,java使用String類創(chuàng)建一個(gè)字符串變量,字符串變量屬于對(duì)象。java把String類聲明的final類,不能有子類。String類對(duì)象創(chuàng)建后不能修改,由0或多個(gè)字符組成,包含在一對(duì)雙引號(hào)之間,下面簡(jiǎn)單的熟悉一下其常用的API
java.lang.String
char charAt (int index) 返回index所指定的字符
String concat(String str) 將兩字符串連接
boolean endsWith(String str) 測(cè)試字符串是否以str結(jié)尾
boolean equals(Object obj) 比較兩對(duì)象
char[] getBytes 將字符串轉(zhuǎn)換成字符數(shù)組返回
char[] getBytes(String str) 將指定的字符串轉(zhuǎn)成制服數(shù)組返回
boolean startsWith(String str) 測(cè)試字符串是否以str開始
int length() 返回字符串的長度
String replace(char old ,char new) 將old用new替代
char[] toCharArray 將字符串轉(zhuǎn)換成字符數(shù)組
String toLowerCase() 將字符串內(nèi)的字符改寫成小寫
String toUpperCase() 將字符串內(nèi)的字符改寫成大寫
String valueOf(Boolean b) 將布爾方法b的內(nèi)容用字符串表示
String valueOf(char ch) 將字符ch的內(nèi)容用字符串表示
String valueOf(int index) 將數(shù)字index的內(nèi)容用字符串表示
String valueOf(long l) 將長整數(shù)字l的內(nèi)容用字符串表示
String substring(int1,int2) 取出字符串內(nèi)第int1位置到int2的字符串
1.構(gòu)造方法
//直接初始化
String str = "abc";
//使用帶參構(gòu)造方法初始化
char[] char = {'a','b','c'};
String str1 = new String("abc");String str2 = new String(str);
String str3 = new String(char);
2.求字符串長度和某一位置字符
String str = new String("abcdef");
int strlength = str.length();//strlength = 7
char ch = str.charAt(4);//ch = e
3.提取子串
用String類的substring方法可以提取字符串中的子串,該方法有兩種常用參數(shù): 1)public String substring(int beginIndex)//該方法從beginIndex位置起,從當(dāng)前字符串中取出剩余的字符作為一個(gè)新的字符串返回。 2)public String substring(int beginIndex, int endIndex)//該方法從beginIndex位置起,從當(dāng)前字符串中取出到endIndex-1位置的字符作為一個(gè)新的字符串返回。
String str1 = new String("abcdef");
String str2 = str1.substring(2);//str2 = "cdef"
String str3 = str1.substring(2,5);//str3 = "cde"
4.字符串比較
1)public int compareTo(String anotherString)//該方法是對(duì)字符串內(nèi)容按字典順序進(jìn)行大小比較,通過返回的整數(shù)值指明當(dāng)前字符串與參數(shù)字符串的大小關(guān)系。若當(dāng)前對(duì)象比參數(shù)大則返回正整數(shù),反之返回負(fù)整數(shù),相等返回0。
2)public int compareToIgnoreCase(String anotherString)//與compareTo方法相似,但忽略大小寫。
3)public boolean equals(Object anotherObject)//比較當(dāng)前字符串和參數(shù)字符串,在兩個(gè)字符串相等的時(shí)候返回true,否則返回false。
4)public boolean equalsIgnoreCase(String anotherString)//與equals方法相似,但忽略大小寫。
String str1 = new String("abc");
String str2 = new String("ABC");
int a = str1.compareTo(str2);//a>0
int b = str1.compareToIgnoreCase(str2);//b=0
boolean c = str1.equals(str2);//c=false
boolean d = str1.equalsIgnoreCase(str2);//d=true
5.字符串鏈接
public String concat(String str)//將參數(shù)中的字符串str連接到當(dāng)前字符串的后面,效果等價(jià)于"+"
String str = "aa".concat("bb").concat("cc");
//相當(dāng)于String str = "aa"+"bb"+"cc";
6.字符串中單個(gè)字符查找
1)public int indexOf(int ch/String str)//用于查找當(dāng)前字符串中字符或子串,返回字符或子串在當(dāng)前字符串中從左邊起首次出現(xiàn)的位置,若沒有出現(xiàn)則返回-1。
2)public int indexOf(int ch/String str, int fromIndex)//改方法與第一種類似,區(qū)別在于該方法從fromIndex位置向后查找。
3)public int lastIndexOf(int ch/String str)//該方法與第一種類似,區(qū)別在于該方法從字符串的末尾位置向前查找。
4)public int lastIndexOf(int ch/String str, int fromIndex)//該方法與第二種方法類似,區(qū)別于該方法從fromIndex位置向前查找。
String str = "I really miss you !";
int a = str.indexOf('a');//a = 4
int b = str.indexOf("really");//b = 2
int c = str.indexOf("gg",2);//c = -1
int d = str.lastIndexOf('s');//d = 6
int e = str.lastIndexOf('s',7);//e = 7
7.大小寫轉(zhuǎn)換
1)public String toLowerCase()//返回將當(dāng)前字符串中所有字符轉(zhuǎn)換成小寫后的新串
2)public String toUpperCase()//返回將當(dāng)前字符串中所有字符轉(zhuǎn)換成大寫后的新串
String str = new String("abCD");
String str1 = str.toLowerCase();//str1 = "abcd"
String str2 = str.toUpperCase();//str2 = "ABCD"
8.字符串中字符的替換
1)public String replace(char oldChar, char newChar)//用字符newChar替換當(dāng)前字符串中所有的oldChar字符,并返回一個(gè)新的字符串。
2)public String replaceFirst(String regex, String replacement)//該方法用字符replacement的內(nèi)容替換當(dāng)前字符串中遇到的第一個(gè)和字符串regex相匹配的子串,應(yīng)將新的字符串返回。
3)public String replaceAll(String regex, String replacement)//該方法用字符replacement的內(nèi)容替換當(dāng)前字符串中遇到的所有和字符串regex相匹配的子串,應(yīng)將新的字符串返回。
String str = "asdzxcasd";
String str1 = str.replace('a','g');//str1 = "gsdzxcgsd"
String str2 = str.replace("asd","fgh");//str2 = "fghzxcfgh"
String str3 = str.replaceFirst("asd","fgh");//str3 = "fghzxcasd"
String str4 = str.replaceAll("asd","fgh");//str4 = "fghzxcfgh"
9.其他方法
1)String trim()//截去字符串兩端的空格,但對(duì)于中間的空格不處理。
String str = " a bc "; String str1 = str.trim(); int a = str.length();//a = 6 int b = str1.length();//b = 4
2)boolean statWith(String prefix)或boolean endWith(String suffix)//用來比較當(dāng)前字符串的起始字符或子字符串prefix和終止字符或子字符串suffix是否和當(dāng)前字符串相同,重載方法中同時(shí)還可以指定比較的開始位置offset。
String str = "abcdef";
boolean a = str.statWith("ab");//a = true
boolean b = str.endWith("ef");//b = true
3)contains(String str)//判斷參數(shù)s是否被包含在字符串中,并返回一個(gè)布爾類型的值。
String str = "abcdef";
str.contains("ab");//true
str.contains("gh");//false
4)String[] split(String str)//將str作為分隔符進(jìn)行字符串分解,分解后的字字符串在字符串?dāng)?shù)組中返回。
String str = "abc def ghi";
String[] str1 = str.split(" ");//str1[0] = "abc";str1[1] = "def";str1[2] = "ghi";
10.類型轉(zhuǎn)換
- 字符串轉(zhuǎn)基本類型 java.lang包中有Byte、Short、Integer、Float、Double類的調(diào)用方法:
public static byte parseByte(String s)
public static short parseShort(String s)
public static short parseInt(String s)
public static long parseLong(String s)
public static float parseFloat(String s)
public static double parseDouble(String s)
int n = Integer.parseInt("12");
float f = Float.parseFloat("12.34");
double d = Double.parseDouble("1.124");
- 基本類型轉(zhuǎn)字符串 String類中提供了String valueOf()放法,用作基本類型轉(zhuǎn)換為字符串類型
static String valueOf(char data[])
static String valueOf(char data[], int offset, int count)
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
//將char '8' 轉(zhuǎn)換為int 8
String str = String.valueOf('8');
int num = Integer.parseInt(str);
- 進(jìn)制轉(zhuǎn)換 使用Long類中的方法得到整數(shù)之間的各種進(jìn)制轉(zhuǎn)換的方法:
Long.toBinaryString(long l)//二進(jìn)制
Long.toOctalString(long l)//十進(jìn)制
Long.toHexString(long l)//十六進(jìn)制
Long.toString(long l, int p)//p作為任意進(jìn)制
二、String特性
這一部分介紹String的一些特性,涉及到字符串常量池、String.intern()以及我們經(jīng)常遇到的“==”和“equals()”問題。 下面我們將通過不同的例子來解釋:
例子1:
String a = "Hello World!";
String b = "Hello World!";
String c = new String("Hello World!");
String d = "Hello"+" "+"World!";
System.out.println(a == b);//true
System.out.println(a == c);//false
System.out.println(a == d);//true
我們應(yīng)該明白:
- 首先String不屬于8種基本數(shù)據(jù)類型,String是一個(gè)對(duì)象。 因?yàn)閷?duì)象的默認(rèn)值是null,所以String的默認(rèn)值也是null;但它又是一種特殊的對(duì)象,有其它對(duì)象沒有的一些特性。
- 在這里,我們先不談堆,也不談棧,只先簡(jiǎn)單引入常量池這個(gè)簡(jiǎn)單的概念。 常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。它包括了關(guān)于類、方法、接口等中的常量,也包括字符串常量。
- Java會(huì)確保一個(gè)字符串常量只有一個(gè)拷貝。 因?yàn)槔又械腶和b都是字符串常量,它們?cè)诰幾g期就被確定了,所以 a==b為true;而"Hello"和" "以及"World!"也都是字符串常量,當(dāng)一個(gè)字符串由多個(gè)字符串常量連接而成時(shí),它自己肯定也是字符串常量,所以d也同樣在編譯期就被解析為一個(gè)字符串常量,所以d也是常量池中"Hello World!"的一個(gè)引用。所以我們得出a==b==d; 用new String() 創(chuàng)建的字符串不是常量,不能在編譯期就確定,所以new String()創(chuàng)建的字符串不放入常量池中,它們有自己的地址空間。
例子2:
String a = "HelloWorld";
String b = new String("HelloWorld");
String c = "Hello"+ new String("World");
System.out.println( a == b );//false
System.out.println( a == c );//false
System.out.println( b == c );//false
例子2中a還是常量池中”HelloWorld”的引用,b因?yàn)闊o法在編譯期確定,所以是運(yùn)行時(shí)創(chuàng)建的新對(duì)象”HelloWorld”的引用,c因?yàn)橛泻蟀氩糠謓ew String(“World”)所以也無法在編譯期確定,所以也是一個(gè)新創(chuàng)建對(duì)象”HelloWorld”的引用,明白了這些也就知道為何得出此結(jié)果了。 **PS: ** String.intern(): 再補(bǔ)充介紹一點(diǎn):存在于.class文件中的常量池,在運(yùn)行期被JVM裝載,并且可以擴(kuò)充。String的intern()方法就是擴(kuò)充常量池的一個(gè)方法;當(dāng)一個(gè)String實(shí)例str調(diào)用intern()方法時(shí),Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個(gè)Unicode等于str的字符串并返回它的引用,看例3就清楚了。
例子3:
String a = "Hello";
String b = new String("Hello");
String c = new String("Hello");
System.out.println( a == b );//false
System.out.println( “**********” );
b.intern();
c = c.intern(); //把常量池中"Hello"的引用賦給c
System.out.println( a == b);//false雖然執(zhí)行了b.intern()但沒有賦值給b
System.out.println( a == b.intern() );//true
System.out.println( a == c ); //true
例子4:
關(guān)于equals()和==: equals()是比較兩個(gè)對(duì)象的值是否相等,這個(gè)對(duì)于String簡(jiǎn)單來說就是比較兩字符串的Unicode序列是否相當(dāng),如果相等返回true;而==是比較兩字符串的地址是否相同,也就是是否是同一個(gè)字符串的引用。
例子5:
String是不可變的 : 這一說又要說很多,大家只要知道String的實(shí)例一旦生成就不會(huì)再改變了,比如說: String str=”aa”+”bb”+” “+”cc”; 就是有4個(gè)字符串常量,首先”aa”和”bb”生成了”aabb”存在內(nèi)存中,后”aabb”又和” “ 生成 ”aabb “存在內(nèi)存中,最后又和生成了”aabb cc”,并把這個(gè)字符串的地址賦給了str,就是因?yàn)镾tring的“不可變”產(chǎn)生了很多臨時(shí)變量,這也就是為什么建議用StringBuffer的原因了。
三、StringBuffer和StringBuiler
我們對(duì)String、StringBuffer、StringBuiler先有一個(gè)簡(jiǎn)單的認(rèn)識(shí)。String是不可變字符串,StringBuffer和StringBuilder是長度可變的字符串,區(qū)別是前者是線程安全的,后者是線程不安全的,同樣后者的效率也會(huì)更高。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數(shù)據(jù)。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區(qū)中。append 方法始終將這些字符添加到緩沖區(qū)的末端;而 insert 方法則在指定的點(diǎn)添加字符。
例如,如果 z 引用一個(gè)當(dāng)前內(nèi)容為 "start" 的字符串緩沖區(qū)對(duì)象,則此方法調(diào)用 z.append("le") 會(huì)使字符串緩沖區(qū)包含 "startle",而 z.insert(4, "le") 將更改字符串緩沖區(qū),使之包含 "starlet"。
通常,如果 sb 引用 StringBuilder 的一個(gè)實(shí)例,則 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。
還有delete刪除方法 deleteCharAt(int index) delete(int start ,int end)
以上就是java.lang.String類的使用的詳細(xì)內(nèi)容,更多關(guān)于java.lang.String的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java中for和forEach的速度比較實(shí)例Demo
for循環(huán)中的循環(huán)條件中的變量只求一次值,而foreach語句是java5新增,在遍歷數(shù)組、集合的時(shí)候,foreach擁有不錯(cuò)的性能,這篇文章主要給大家介紹了關(guān)于java中for和forEach速度比較的相關(guān)資料,需要的朋友可以參考下2021-08-08
SpringBoot基于Disruptor實(shí)現(xiàn)高效的消息隊(duì)列?
Disruptor是一個(gè)開源的Java框架,它被設(shè)計(jì)用于在生產(chǎn)者-消費(fèi)者問題上獲得盡量高的吞吐量和盡量低的延遲,本文主要介紹了SpringBoot基于Disruptor實(shí)現(xiàn)高效的消息隊(duì)列?,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過程(連接數(shù)據(jù)庫進(jìn)行測(cè)試)
這篇文章主要介紹了springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過程(連接數(shù)據(jù)庫進(jìn)行測(cè)試),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springmvc使用REST出現(xiàn):Request?method?'PUT'?not?sup
這篇文章主要介紹了springmvc使用REST出現(xiàn):Request?method?'PUT'?not?supported問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java?HttpURLConnection使用方法與實(shí)例演示分析
這篇文章主要介紹了Java?HttpURLConnection使用方法與實(shí)例演示,HttpURLConnection一個(gè)抽象類是標(biāo)準(zhǔn)的JAVA接口,該類位于java.net包中,它提供了基本的URL請(qǐng)求,響應(yīng)等功能,下面我們來深入看看2023-10-10
Java實(shí)現(xiàn)求數(shù)組最長子序列算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)求數(shù)組最長子序列算法,涉及java針對(duì)數(shù)組的遞歸遍歷、判斷相關(guān)操作技巧,需要的朋友可以參考下2018-07-07

