java中字符串的有三種java
String ---稱爲靜態字符串,一經定義就長度和內容不在改變,一旦改變就會生成新的字符串,在頻繁進行字符串拼接的時候後會產生大量零散內存單元,家中jvm內存回收壓力,若是字符串內容不發生改變,則沒有問題算法
StringBuffer ---動態字符串,長度和內容均可以改變的字符串,但由於stringbuffer中大量方法都是線程同步的,該類通常用於多線程編程,在非線程環境下應用該類須要額外維持線程開銷,性能不佳。sql
StringBuilder ---從java5開始,對於非線程環境的動態數組, 是stringbuffer的替代類,取消了線程同步開銷的問題編程
三種類型 針對不一樣環境使用。數組
string str=「123」 ;string str2=str+「456」; +號是字符串拼接 至關於又生成了一個新的內存叫str2來存儲str和「456」這兩部分的內容多線程
stringbuffer 和stringbuilder 用於sql語句拼接app
//定義sql StringBuilder sql=new StringBuilder() .append("SELECT A.AAB102,A.AAB103,A.AAB104,A.AAB105,TO_CHAR(A.AAB106,'YYYY-MM-DD') AAB106 ") .append(" FROM AB01 A") .append(" WHERE A.AAB101=?") ;
字符串string比較方法 equals 比較的是地址 引用 可是字符串string重寫了equals方法 比較的是內容,equals不是final修飾 能夠被重寫jvm
private static void stringTest1() { String str1="1223"; String str3="1223"; StringBuffer sbf1=new StringBuffer() .append("1223") ; boolean tag=str1.equals(sbf1); System.out.println(tag); tag=str1.equals(str3); System.out.println(tag); System.out.println(str1.hashCode()+"str3: "+str3.hashCode()); }
equals是Object 定義的一個比較方法 而==叫作比較暈算法;ide
依據object原始定義 equals和== 並沒有區別都是比較兩個變量是否引用了同一個地址性能
代碼最後用了 hashcode方法 是hash碼,生成此碼有兩種方式,
一是 根據內存地址 默認方式
另外一個根據內容生成散列碼在string中
tostring 方法 打印出
該對象所屬類的完整路徑+」@」+該對象的內存地址
java5之後具備 自動裝箱拆箱 針對八大基本類型的基本類
注意 八大基本類型與其封裝類都屬於傳值
在封裝類中定義了一些靜態方法能夠實現類型的轉換
//手動裝箱 int i=1; Integer i1=new Integer(i); //手動拆箱 i=i1.intValue(); //自動拆箱 int c=i1; Integer d=c;
字符串轉換成數值類型
String str="123456789"; int ival=Integer.parseInt(str);
注意字符串中有別的字符會拋出異常,有小數也不行,由於轉換成int,字符串不能是null 都會會拋出java.lang.NumberFormatException 異常
相應的字符串能夠轉換成 double類型
String str="1233.22"; Double dval=Double.parseDouble(str); System.out.println(dval);
基本類型也能夠轉換成字符串
int a=100; String str=a+""; String sval=String.valueOf(a); System.out.println(str+" "+sval);
一樣的其他基本類型 也能夠 調用相應方法就行啦 valueof(參數) 參數包括各類基本類型
對象類型轉換成字符串 封裝類
Integer i=100; String str=i.toString(); String str2=String.valueOf(i); String str3=i+""; System.out.println(str.hashCode()+"str2: "+str2.hashCode()+"str3 :"+str3.hashCode());
特別注意 當封裝類是 null是 第一種方法 tostring是空指針異常 java.lang.NullPointerException 由於 null。方法 是沒法找到的
好比一個頗有意思的小問題 integer a=null; int b=a+20; 打印輸出b 結果是什麼
是空指針異常 就是 a是封裝類 與整型20相加 須要轉換成 整型 會先拆箱 可是拆箱的時候 a是null、就至關於null。intvalue方法 就引起異常啦
基本類型與其封裝類的共同父類是 java.lang.number
仍是迴歸主題 字符串
字符串是比較忽略大小寫問題 能夠本身寫方法實現(根據其ASCII碼特色,將其轉換成統一大寫或小寫 在比較),也能夠用其提供的方法equalsIgnoreCase()方法;
字符串比較大小 ,其提供的方法是從字符串左邊開始比較 返回第一個大的字符的字符串。好比123就比1204大 由於第三個字符比較時第一個字符串大
字符串檢索 : indexOf()方法 ,括號裏是檢索的目的串 返回目的串出現的首地址下標
String str="adsdasdsa"; //下標012345678 System.out.println(str.indexOf("sd"));
代碼執行結果打印2 若沒有檢索到目的串 就返回-1;
字符串截取:方法1 substring(參數1,參數2);該方法能夠從參數1開始截取到參數2 ;參數1下標 <= 目的串<參數2 下標
方法2 substring(參數1);從參數1 下標但是截取到最後 ;
方法1中若是參數2超出字符串最大下標會拋出異常 : java.lang.StringIndexOutOfBoundsException
字符串替換方法: replace(「原」,「目的」);把原替換成目的 返回一個新串 ,原串不改變
String str="adsdasdsa"; //下標012345678 System.out.println(str.substring(2, 6));