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類系統性學習 name的相關視圖![]()
J2SE的學習——String類系統性學習 ![]()
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)); } }
本質上來說,這裡相當于是位址的比較,建立相同的對象,取自一個池子裡面的同一個,是以是一樣的,這就是棧裡面的name1,name2同時指向堆中的一個字元串,這個字元串就在字元串常量池中。![]()
J2SE的學習——String類系統性學習 ![]()
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