Java 字符串

1、String 類

一、建立對象

public static void main(String[] args){
		String str1 = "hello";
		String str2 = "hello";
		String str3 = new String("hello");
		String str4 = new String("hello");
		
		System.out.println(str1 == str2);//true
		System.out.println(str1 == str3);//false
		System.out.println(str3 == str4);//false
		/**
         * 一、使用String str1 = "hello";這種方式 
         *         第一次建立str1時,隱式的new一個字符串對象,在運行時常量池中開闢一個空間,來存放新建立的"hello"對象,str1中存放指向這個對象的引用
         *         第二次建立str2時,JVM會先在在常量池中查找是否存在相同的常量,若已經存在跟"hello"同樣的對象,就直接引用了這個對象,若是沒有仍是會在運行時常量池中新new一個
         * 二、使用String str3 = new String("hello");這種
         *         無論堆裏面有沒有一樣的對象,都會在堆內存中新建一個對象,因此str3 和 str4 總會是false
         */
		
		System.out.println(str1.equals(str3));//true
		System.out.println(str3.equals(str4));//true
		//String類中已經把equals方法重寫過了,比較的是具體的值  
		
		
		/**
		 *String拼接
		 */
		String s1 = "a"+"b"+"c";
	    String s2 = "abc";
	    String s3 = "ab";
	    String s4 = s3 + "c";
	    System.out.println(s1==s2);//true
	    System.out.println(s2 == s4);//false
	    
	    //先在常量池中建立 abc ,地址指向 s1,也指s2, 再建立 ab ,指向 s3,再建立s4,
	    //對於 s4,實際上是先建立StringBuilder(或 StringBuffer)對象,經過 append 鏈接獲得 abc ,再調用 toString() 轉換獲得的地址指向 s3。
	    //因此(s4==s2) 爲 false
	
		 	
		
		
	}

  

String重寫的equals方法

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
    }

  

二、經常使用方法

 

str : "1abc1239" str.length() :8 str.indexOf("a") :1 str.indexOf('b') :2 str.indexOf(49) :0 str.substring(3) :c1239 str.substring(2, 5) :bc1 str.trim() :1abc1239 str.equals("abc123") :false str.equals("abc123") :false str.toLowerCase() :1abc1239 str.toUpperCase() :1ABC1239 str.charAt(2) :b str.split("c", 2) : 1ab 1239 str.split("c", 1) : 1abc1239 str.getBytes() : 49
                 97
                 98
                 99
                 49
                 50
                 51
                 57

 ##注意html

str.indexOf(49) :0
這裏的index(int)裏的int值注意一下
貼一個連接,詳細

三、String.format()方法

有兩個重載:java

String.format(String format, Object... args)
String.format(Locale locale, String format, Object... args)

 

重點提一下 format 參數的格式:

%[argument_index$][flags][width][.precision]conversion數組

 

一、%:必填

二、[argument_index$]:從1開始取值,表示的是拿後面的args中的第幾個參數來格式化,默認是按照參數順序輸出

System.out.println(String.format("你好,這是%s,那是%s!", "anna","beta"));//默認按順序
System.out.println(String.format("你好,這是%2$s,那是%1$s!", "anna","beta"));//按照自定義的順序

/**
* 你好,這是anna,那是beta! 你好,這是beta,那是anna!
*/

  

三、[flags]標識:控制輸出格式,好比左對齊,三個數用逗號隔開,少位補0等

  •  '-'    在最小寬度內左對齊,不能夠與"用0填充"同時使用
  •  '#'   只適用於8進制和16進制,8進制時在結果前面增長一個0,16進制時在結果前面增長0x
  •  '+'   結果老是包括一個符號(通常狀況下只適用於10進制,若對象爲BigInteger才能夠用於8進制和16進制)
  •  ' '    正值前加空格,負值前加負號(通常狀況下只適用於10進制,若對象爲BigInteger才能夠用於8進制和16進制)
  •  '0'    結果將用零來填充
  •  ','    只適用於10進制,每3位數字之間用","分隔
  •  '('    若參數是負數,則結果中不添加負號而是用圓括號把數字括起來(同'+'具備一樣的限制)

 

System.out.println(String.format("%-3d", 123456789));//123456789
System.out.println(String.format("%011d", 123456789));//00123456789
System.out.println(String.format("%#o", 123456789));//0726746425
System.out.println(String.format("%#x", 123456789));//0x75bcd15
System.out.println(String.format("%+d", 123456789));//+123456789
System.out.println(String.format("%(d", -123456789));//(123456789)
System.out.println(String.format("%,d", 123456789));//123,456,789

  

四、[width]最小寬度:  輸出最小寬度,例如5

五、[.precision] :只有傳入參數是浮點數時纔有用,傳入整數或者日期會拋異常(注意這裏前面有個 . 

System.out.println(String.format("%,10.4f", 12345.6789456));//12,345.6789
System.out.println(String.format("%.2f", 12345.6789456));//12345.68

  

六、conversion轉換格式 : 如上轉換符所示,s/f等

轉  換  符安全

說    明 多線程

示    例app

%s性能

字符串類型ui

"mingrisoft"this

%cspa

字符類型

'm'

%b

布爾類型

true

%d

整數類型(十進制)

99

%x

整數類型(十六進制)

FF

%o

整數類型(八進制)

77

%f

浮點類型

99.99

%a

十六進制浮點類型

FF.35AE

%e

指數類型

9.38e+5

%g

通用浮點類型(f和e類型中較短的)

 

%h

散列碼

 

%%

百分比類型

%n

換行符

 

%tx

日期與時間類型(x表明不一樣的日期與時間轉換符

 

 

conversion差很少看看就行,應該用得多的也就 s/f 啥的  

 

參考文檔:

https://blog.csdn.net/jiangyu1013/article/details/52607257

http://kgd1120.iteye.com/blog/1293633

http://www.runoob.com/java/java-string.html

2、StringBuilder和StringBuffer

一、定義

可變字符串

二、String、StringBuilder和StringBuffer 異同

String:字符串常量,不可變,底層用於存放字符的數組是final的,所以只能賦值一次,不能再更改;

StringBuilder:字符串變量,線程不安全,也所以性能高一點,因此單線程操做大量數據就用這個;

StringBuffer:字符串變量,線程安全,可將字符串緩衝區安全的用於多個線程,因此多線程操做大量數據用這個;

三、StringBuffer經常使用方法

兩個可變字符串差很少,最重要的是 toString() 方法,轉換成 String 類型;

StringBuffer sb = new StringBuffer();
		sb.append("abc123");
		System.out.println(sb.toString());//abc123
		sb = sb.reverse();
		System.out.println(sb.toString());//321cba
相關文章
相關標籤/搜索