JavaString類字符串的解析

      網友投稿 868 2022-05-30

      目錄

      一、前言

      二、String類概述

      三、字符串的特點

      四、String 構造方法

      圖示:

      代碼演示:

      五、String類對象的特點

      六、比較字符串的方法

      用法:

      代碼圖示:

      七、判斷兩個字符串地址是否相等

      StringBuilder和StringBuffer的區別

      一、前言

      在java中,和C語言一樣,也有關于字符串的定義,并且有他自己特有的功能,下面我們

      一起來學習一下。

      二、String類概述

      string在軟件包java.lang下,所以不需要導包。

      String字符串是java中的重點,String 類表示字符串類 ,所有的字符串(如"adf")都屬于

      此類,也就是說有" "雙引號括起來的都屬于此類,

      三、字符串的特點

      字符串不可變,他們的值在創建之后不能被改變。

      雖然String的值的不可變的,但是他們可以被共享。共享就是其他成員也可以擁有這個值,

      字符串效果相當于數組(char[]),但是底層原理是字節數組(byte[])

      jdk8以前是字符數組,jdk9以后是字節數組。

      四、String 構造方法

      public String()? //創建一個空白字符串對象,不含有任何內容。

      【Java】String類字符串的解析

      public String(char[] ch)//根據字符數組的內容來創建字符對象。

      public String (byte[] b)//根據字節數組的內容來創建字節對象。

      String s=“abc”? ? ? ? ?//字節賦值的方式創建對象,內容就是abc。

      圖示:

      代碼演示:

      public class StringDemo { public static void main(String[] args) { String s1=new String();//創建空的字符串,其中不包括任何內容 System.out.println("s1:"+s1); char[]chs={'a','b','c'}; String s2=new String(chs);//給chs創建對象 System.out.println("chs:"+s2);//輸出ch:abc byte[]bys={97,98,99}; String s3=new String(bys); System.out.println("bys:"+s3);//輸出bys:abc,他會 轉化成對應的Ascll碼值 String s4="abc"; System.out.println("s4:"+s4);//輸出s4:abc } }

      綜上看,推薦使用直接賦值的方式得到字符串對象。

      五、String類對象的特點

      通過new創建的的字符串對象,每一次new都會申請一個內存空間,雖然內容一樣,

      但是地址不同

      通過直接賦值的方式來創建對象,賦值相同的值,因為是常量在堆內存的常量池中,

      進入常量池的規則是:如果常量池中沒有這個常量,則在常量池中創建一個,如果有

      ,則把已經存在的常量地址賦值給他,所以創建不同的變量去接受相同的值,他的內容

      是一樣的,地址也是一樣的 。

      六、比較字符串的方法

      我們在比較兩個數字是否相同時,一般用的是==來判斷,那么要比較兩個字符串相等

      用的是什么呢,答案是用equals。

      ==用來判斷兩個字符串的地址是否相同,相同返回true,不同返回false。

      equals用來比較兩個字符串的值是否相同,相同返回true,不同返回false。

      用法:

      public class String1 { public static void main(String[] args) { String s1="hello"; String s2="world"; String s3= "helloworld"; String s4=s1+s2; System.out.println(s7==s8);//0 System.out.println(s3==s4);//比較兩個字符串的地址是否相同 System.out.println(s3.equals(s4));//比較兩個字符串中的值是否相同 } }

      代碼圖示:

      原因下文分析。

      七、判斷兩個字符串地址是否相等

      在字符串中,兩個字符串相加可以的到一個新的字符串,這是我們知道的,但是地址會是一樣的嗎

      看下列代碼:

      public class String1 { public static void main(String[] args) { String s1="hello"; String s2="world"; String s3= "helloworld"; String s4=s1+s2; String s5="he"+"llo"; String s6="hello"+"world"; String s7="hello"+s2; String s8=s1+"world"; System.out.println(s3==s6);//比較兩個地址是否相同 System.out.println(s1==s5); System.out.println(s3==s7); System.out.println(s3==s8); System.out.println(s7==s8); System.out.println(s3==s4); System.out.println(s3.equals(s4));//比較兩個字符串中的值是否相同 } }

      我們仔細分析:

      第一個:

      String s3= "helloworld"; String s6="hello"+"world";

      s3首先在常量池中創建了一個helloworld的常量,s6是有兩個新的字符串連接起來的,

      這兩個字符串常量創建新的字符串常量,存儲在常量池中時,因為helloworld已經存在,

      所以常量池就不會創建新的字符串了,直接把已經存在的s3地址賦值給s6,所以他們地址

      相同。

      第二個:

      String s1="hello"; String s5="he"+"llo";

      這個分析和第一個一樣,地址相同。

      第三個:

      String s2="world"; String s3= "helloworld"; String s7="hello"+s2;

      s2在常量池中創建world,s3在常量池中創建helloworld,s7是由一個變量s2連接一

      個新的字符串"world",首先會在常量池創建字符串"world",然后兩者之間進行"+"

      操作,根據字符串的串聯規則,s7會在堆內存中創建StringBuilder(或StringBuffer)

      對象,通過append方法拼接s2和字符串常量"world”,此時拼接成的字符串"helloworld"

      是StringBuilder(或StringBuffer)類型的對象,通過調用toString方法轉成String對

      象"helloworld",所以s7此時實際指向的是堆內存中的"helloworld"對象,堆內存中對

      象的地址和常量池中對象的地址不一樣。

      StringBuilder和StringBuffer的區別

      1.StringBuffer 對幾乎所有的方法都實現了同步,線程比較安全,在多線程系統中可以保

      證數據同步。

      2.StringBuilder 沒有實現同步,線程不安全,在多線程系統中不能使用 StringBuilder。

      3.當需要考慮線程安全的場景下使用 StringBuffer,如果不需要考慮線程安全,追求效率的場

      景下可以使用 StringBuilder。

      第四個:

      String s1="hello"; String s3= "helloworld"; String s8=s1+"world";

      解釋同上,重新簡單的說一下,s3在先在常量池中創建helloworld,s8是由變量s1和常量

      world加起來的,會先在常量池中創建world,然他他們現在之后會在堆內存中存在,所以

      他們的地址不同。

      總結:一般帶有變量的相加操作是在堆中創建的

      第五個:

      String s1="hello"; String s2="world"; String s7="hello"+s2; String s8=s1+"world";

      解釋和上面有些相似之處,他們都是有變量加常量,所以他們都是在堆內存中創建的,

      堆內存的地址是不會相同的。

      第六個:

      String s1="hello"; String s2="world"; String s3= "helloworld"; String s4=s1+s2;

      堆內存中的,所以地址不同。

      Java

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:第二彈!python爬蟲批量下載高清大圖
      下一篇:【設計模式】狀態模式 ( 簡介 | 適用場景 | 優缺點 | 代碼示例 )
      相關文章
      中国亚洲女人69内射少妇| 亚洲人成综合在线播放| 亚洲AV永久无码精品成人| 亚洲伊人成无码综合网| 五月婷婷亚洲综合| 日韩亚洲翔田千里在线| 国产精品亚洲天堂| 极品色天使在线婷婷天堂亚洲 | 亚洲乱码在线卡一卡二卡新区| 亚洲欧洲自拍拍偷综合| 中文字幕亚洲精品| 亚洲福利电影在线观看| 亚洲欧洲精品一区二区三区| 亚洲成av人片不卡无码| 亚洲国产成人久久| 99久久婷婷国产综合亚洲| 亚洲一级毛片免费看| 亚洲va在线va天堂成人| 在线观看亚洲AV每日更新无码| 亚洲人成网站色在线观看| 亚洲一线产区二线产区精华| 亚洲欧洲日韩国产一区二区三区| 亚洲午夜无码毛片av久久京东热| 亚洲色大成网站www尤物| 色婷婷亚洲一区二区三区| 亚洲国产精品一区二区九九| 亚洲午夜av影院| 亚洲成av人片在www鸭子| 亚洲中字慕日产2020| 麻豆亚洲av熟女国产一区二| 亚洲小视频在线播放| 久久久国产亚洲精品| 亚洲熟妇AV一区二区三区浪潮| 亚洲av无码偷拍在线观看| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲国产人成精品| 亚洲欧洲∨国产一区二区三区| 亚洲av日韩av天堂影片精品| 亚洲精品国产手机| 亚洲色大成网站www尤物| 国产亚洲视频在线观看|