天天看點

J2SE的學習——String類系統性學習

String類是我們在寫代碼的時候用到的最多的一種資料類型,那麼關于String類有常用方法有哪些呢,又有哪些需要注意的地方的呢?這次我對String類進行了簡單的學習。

1、String類常用的兩種執行個體化的方法
J2SE的學習——String類系統性學習
2、用equals比較内容
package page20;

//equals比較的是具體的内容
public class Demo2 {
	public static void main(String[] args) {
		String name1="張三";
		String name2=new String("張三");
		String name3=name2;//傳遞,相當于C語言中的指針
		//比較的是引用,作用相當于位址
		System.out.println("name1==name2:"+(name1==name2));
		System.out.println("name1==name3:"+(name1==name3));
		System.out.println("name2==name3:"+(name2==name3));
		//比較的是内容
		System.out.println("name1==name2:"+(name1.equals(name2)));
		System.out.println("name1==name3:"+(name1.equals(name3)));
		System.out.println("name2==name3:"+(name2.equals(name3)));
	}
}
           
運作結果
J2SE的學習——String類系統性學習
先了解一下堆和棧的
J2SE的學習——String類系統性學習
name的相關視圖
J2SE的學習——String類系統性學習

我們從下面把name1,name2,name3塞進去,出口就這一個,是以在資料結構中學的棧和隊中,棧是先進後出的,并且系統配置設定的空間是連續的,而堆中,是在一個大的記憶體區域,開辟一塊小區域,用于存放我們建立的對象,我們的name3是來源于對name2的引用的。

對于引用的了解我比較認同這個人說的,網址,自己點一下

J2SE的學習——String類系統性學習

通過上面的棧中的name對堆中的指向,可以看到,引用,和C語言中的指針很像,很可惜,java中是沒有指針的,但是我們可以看到,name3中的資料,來自name2,是以系統是不會為一個引用配置設定新的堆存儲單元的。

這裡有一個常量池的概念,還有關于堆、棧、靜态區、常量區、方法區的知識,因為自身能力的問題,沒法寫,不過這個人寫的挺不錯的,通俗易懂

Java記憶體圖以及堆、棧、常量區、靜态區、方法區的差別

3、String的兩種執行個體化的差別 直接指派的方式:建立的對象存放到字元串對象池裡,加入池子中存在這個對象,就不會再建立新的。 new對象方式:每次都建立一個新的對象,不管是否存在,都會重新建立。
package page20;

public class Demo1 {
	public static void main(String[] args) {
		//執行個體化String的方式一
		String name1="張三";
		String name2="張三";//這裡的name2是拿池子裡面的
   			//執行個體化String的方式二 			String name3=new String("張三"); 			String name4=new String("張三");//name3,name4都是建立的
  	System.out.println("name1==name2:"+(name1==name2));//括号用于處理優先級問題
  	System.out.println("name1==name3:"+(name1==name3));
  	System.out.println("name3==name4:"+(name3==name4)); 		}
}
           
運作結果
J2SE的學習——String類系統性學習
本質上來說,這裡相當于是位址的比較,建立相同的對象,取自一個池子裡面的同一個,是以是一樣的,這就是棧裡面的name1,name2同時指向堆中的一個字元串,這個字元串就在字元串常量池中。
J2SE的學習——String類系統性學習

4、字元串的内容不可變性

字元串的特征:不能改變字元串的内容;

想要改變,隻能通過指向一個新的記憶體内位址;

J2SE的學習——String類系統性學習
J2SE的學習——String類系統性學習
改變了,就是一個新的位址,此時張這個堆記憶體塊就會被垃圾回收了,是以不是在張這個記憶體中增加個三,而是建立一個記憶體塊,再把老的記憶體塊回收掉!

5、String類的常用方法和基本使用

老樣子,看Jdk文檔

J2SE的學習——String類系統性學習
簡單的兩個執行個體
J2SE的學習——String類系統性學習
J2SE的學習——String類系統性學習
6、indexof:傳回指定字元在字元串中第一次出現的索引
J2SE的學習——String類系統性學習
代碼:
package page20;

public class Demo5 {
	public static void main(String[] args) {
		String st="xbwudbwcweib";//随便打一個字元串
		//這個索引是從零開始的
		System.out.println("d這個字元在字元串中第一次出現的位置是:"+st.indexOf('d'));
	}
}
           
運作效果
J2SE的學習——String類系統性學習
下面看一下這個
J2SE的學習——String類系統性學習
簡單的看一下差別吧
package page20;

public class Demo6 {
	public static void main(String[] args) {
		String st="xbwudbwcweib";//随便打一個字元串
		//這個索引是從零開始的
		System.out.println("b這個字元在字元串中第一次出現的位置是:"+st.indexOf('b'));
		System.out.println("b這個字元在字元串中第一次出現的位置是,從索引4的位置開始找:"+st.indexOf('b',4));
	}
}
           
運作結果
J2SE的學習——String類系統性學習

7、substring:傳回一個新的字元串,它是此字元串的子字元串

用Ctrl+F能夠快速的找到

J2SE的學習——String類系統性學習
代碼
package page20;

public class Demo7 {
	public static void main(String[] args) {
		String st="張三很帥!";
		System.out.println(st.substring(2));
	}
}
           
結果
J2SE的學習——String類系統性學習
下面這個是範圍内進行輸出:
J2SE的學習——String類系統性學習
7、字母轉換大小寫
J2SE的學習——String類系統性學習
J2SE的學習——String類系統性學習

一個是大寫轉化,一個是小寫的轉化,簡單的寫一下:

代碼:

package page21;

public class Demo4 {
	public static void main(String[] args) {
		String st="I love English!";
		String upst=st.toUpperCase();
		System.out.println(upst);
		String lowerst=st.toLowerCase();
		System.out.println(lowerst);
	}
}
           
結果:
J2SE的學習——String類系統性學習
其他的可以自己簡單的試一下,還蠻好玩的,很多細節的知識點,以後都能用上,特别是在開發時候,能夠有效的減少代碼的複雜度和代碼的執行效率問題。page20、21