1. 程式人生 > >js與java字串物件的使用

js與java字串物件的使用

js字串物件的使用

java.lang.String 原始碼解析

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {}

是一個用 final 宣告的常量類,不能被任何類所繼承,而且一旦一個String物件被建立, 包含在這個物件中的字元序列是不可改變的, 包括該類後續的所有方法都是不能修改該物件的,直至該物件被銷燬,這是我們需要特別注意的(該類的一些方法看似改變了字串,其實內部都是建立一個新的字串)接著實現了 Serializable介面,這是一個序列化標誌介面,還實現了 Comparable 介面,用於比較兩個字串的大小(按順序比較單個字元的ASCII碼)最後實現了 CharSequence 介面,表示是一個有序字元的集合

一個 String 字串實際上是一個 char 陣列。

String str3 = new String(new char[]{'a','b','c'})

charAt(int index) 方法。

我們知道一個字串是由一個字元陣列組成,這個方法是通過傳入的索引(陣列下標),返回指定索引的單個字元。

1     public char charAt(int index) {
2         //如果傳入的索引大於字串的長度或者小於0,直接丟擲索引越界異常
3         if ((index < 0) || (index >= value.length)) {
4             throw new StringIndexOutOfBoundsException(index);
5         }
6         return value[index];//返回指定索引的單個字元
7     }

concat(String str) 方法

該方法是將指定的字串連線到此字串的末尾。

1     public String concat(String str) {
 2         int otherLen = str.length();
 3         if (otherLen == 0) {
 4             return this;
 5         }
 6         int len = value.length;
 7         char buf[] = Arrays.copyOf(value, len + otherLen);
 8         str.getChars(buf, len);
 9         return new String(buf, true);
10     }

首先判斷要拼接的字串長度是否為0,如果為0,則直接返回原字串。如果不為0,則通過 Arrays 工具類的copyOf方法建立一個新的字元陣列,長度為原字串和要拼接的字串之和,前面填充原字串,後面為空。接著在通過 getChars 方法將要拼接的字串放入新字串後面為空的位置。

  注意:返回值是 new String(buf, true),也就是重新通過 new 關鍵字建立了一個新的字串,原字串是不變的。這也是前面我們說的一旦一個String物件被建立, 包含在這個物件中的字元序列是不可改變的。

indexOf(int ch) 和 indexOf(int ch, int fromIndex) 方法 

indexOf(int ch),引數 ch 其實是字元的 Unicode 值,這裡也可以放單個字元(預設轉成int),作用是返回指定字元第一次出現的此字串中的索引。其內部是呼叫 indexOf(int ch, int fromIndex),只不過這裡的 fromIndex =0 ,因為是從 0 開始搜尋;而 indexOf(int ch, int fromIndex) 作用也是返回首次出現的此字串內的索引,但是從指定索引處開始搜尋。

 public int indexOf(int ch) {
        return indexOf(ch, 0);//從第一個字元開始搜尋
    }
 1 public int indexOf(int ch, int fromIndex) {
 2     final int max = value.length;//max等於字元的長度
 3     if (fromIndex < 0) {//指定索引的位置如果小於0,預設從 0 開始搜尋
 4         fromIndex = 0;
 5     } else if (fromIndex >= max) {
 6         //如果指定索引值大於等於字元的長度(因為是陣列,下標最多隻能是max-1),直接返回-1
 7         return -1;
 8     }
 9 
10     if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {//一個char佔用兩個位元組,如果ch小於2的16次方(65536),絕大多數字符都在此範圍內
11         final char[] value = this.value;
12         for (int i = fromIndex; i < max; i++) {//for迴圈依次判斷字串每個字元是否和指定字元相等
13             if (value[i] == ch) {
14                 return i;//存在相等的字元,返回第一次出現該字元的索引位置,並終止迴圈
15             }
16         }
17         return -1;//不存在相等的字元,則返回 -1
18     } else {//當字元大於 65536時,處理的少數情況,該方法會首先判斷是否是有效字元,然後依次進行比較
19         return indexOfSupplementary(ch, fromIndex);
20     }
21 }
	public static void main(String[] args) {
		String str="sasdwewuiundmxcss";
		System.out.println("d在字串str中第一次出現的索引位置:"+str.indexOf('d'));
		System.out.println("d在字串str中第一次出現的索引位置,從索引5位置開始:"+str.indexOf('d',4));
	}

split(String regex) 和 split(String regex, int limit) 方法

split(String regex) 將該字串拆分為給定正則表示式的匹配。split(String regex , int limit) 也是一樣,不過對於 limit 的取值有三種情況:

  ①、limit > 0 ,則pattern(模式)應用n - 1 次

1 String str = "a,b,c";
2 String[] c1 = str.split(",", 2);
3 System.out.println(c1.length);//2
4 System.out.println(Arrays.toString(c1));//{"a","b,c"}

 ②、limit = 0 ,則pattern(模式)應用無限次並且省略末尾的空字串

1 String str2 = "a,b,c,,";
2 String[] c2 = str2.split(",", 0);
3 System.out.println(c2.length);//3
4 System.out.println(Arrays.toString(c2));//{"a","b","c"}

③、limit < 0 ,則pattern(模式)應用無限次

1 String str2 = "a,b,c,,";
2 String[] c2 = str2.split(",", -1);
3 System.out.println(c2.length);//5
4 System.out.println(Arrays.toString(c2));//{"a","b","c","",""}

底層的原始碼實現。對於 split(String regex) 沒什麼好說的,內部呼叫  split(regex, 0) 方法:

public String[] split(String regex) {
       return split(regex, 0);
    }

replace(char oldChar, char newChar) 和 String replaceAll(String regex, String replacement) 方法

①、replace(char oldChar, char newChar) :將原字串中所有的oldChar字元都替換成newChar字元,返回一個新的字串。

②、String replaceAll(String regex, String replacement):將匹配正則表示式regex的匹配項都替換成replacement字串,返回一個新的字串。

substring(int beginIndex) 和 substring(int beginIndex, int endIndex) 方法

①、substring(int beginIndex):返回一個從索引 beginIndex 開始一直到結尾的子字串。

public String substring(int beginIndex) {
    if (beginIndex < 0) {//如果索引小於0,直接丟擲異常
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    int subLen = value.length - beginIndex;//subLen等於字串長度減去索引
    if (subLen < 0) {//如果subLen小於0,也是直接丟擲異常
        throw new StringIndexOutOfBoundsException(subLen);
    }
    //1、如果索引值beginIdex == 0,直接返回原字串
    //2、如果不等於0,則返回從beginIndex開始,一直到結尾
    return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}

②、 substring(int beginIndex, int endIndex):返回一個從索引 beginIndex 開始,到 endIndex 結尾的子字串。

    public static void main(String[] args) {
        // substring方式讀取
        String str="不開心每一天";
        String str2="不開心每一天,不可能";
        String newStr=str.substring(1);
        System.out.println(newStr);
        String newStr2=str2.substring(1, 6);
        System.out.println(newStr2);
    }

一、屬性

1.length計算字串的長度(不區分中英文)

2.constructor物件的建構函式

所有物件都是由constructor繼承而來的

var str="構造";
alert(str.constructor)
//
Function String(){
[native code]
}

二、方法

1.concat連線字串,或用+=進行連線  

var a = "hello";
var b = ",world";
var c = a.concat(b);
alert(c);
//c = "hello,world"

2.indexof()查詢索引字串,返回第一個出現的位置(從0開始計算)

var a = "hello";
var b = ",world";
var index1 = a.indexOf("l");
//index1 = 2
var index2 = a.indexOf("l",3);
//index2 = 3

lastindexof(searchstring[,startindex])最後一次出現的位置

var a = "hello";
var b = ",world";
var index1 = lastIndexOf('l');
//index1 = 3
var index2 = lastIndexOf('l',2)
//index2 = 2

3.charAt返回指定位置的字元

var a = "hello";
var b = ",world";
var get_char = a.charAt(0);
//get_char = "h"
”abc”.charcodeat(第幾個),返回第幾個字元的ascii碼值

myString.charCodeAt(num)返回指定位置的字元的Unicode編碼

var str="ABC";
alert(str.charCodeAt(0))
alert(str.charCodeAt(1))
alert(str.charCodeAt(2))
​
var str="Hello world!"
document.write(str.charCodeAt(1))
101

​

String.fromCharCode()接受一個或多個指定的Unicode值,然後返回一個或多個字串。  

String.fromCharCode()
alert(String.fromCharCode(65,66,67))

4.substring返回字串的一個子串取從第幾位到指定長度的字串.傳入引數是起始位置和結束位置。其內容是從 start 處到 stop-1 處的所有字元,其長度為 stop 減start。 從指定的開始位置,到結束位置(不包括)的所有字串。如果不指定結束位置,則從指定的開始位置,取到結尾

var a = "hello";
var b = ",world";
var sub_string1 = a.substring(1);
//sub_string1 = "ello"
var sub_string2 = a.substring(1,4);
//sub_string2 = "ell"
alert(str.substring(-1))

5.substr返回字串的一個子串,傳入引數是起始位置和長度。返回值:抽取從 start 下標開始的指定數目的字元。從指定的位置開始取指定長度的字串。如果沒有指定長度,從指定開始的位置取到結尾。

var a = "hello";
var b = ",world";
var sub_string1 = a.substr(1);
//sub_string1 = "ello"
var sub_string2 = a.substr(1,4);
//sub_string2 = "ello"

6.match()判斷字元是否匹配,檢查一個字串匹配一個正則表示式內容,如果沒有匹配返回 null。返回值:返回匹配的字串

        var str="Hello world!"
	document.write(str.match("world") + "<br />")
	document.write(str.match("World") + "<br />")
	document.write(str.match("worlld") + "<br />")
	document.write(str.match("world!"))

world
null
null
world!
var re = new RegExp(/^\w+$/);
var a = "hello";
var b = ",world";
var is_alpha1 = a.match(re);
//is_alpha1 = "hello"
var is_alpha2 = b.match(re);
//is_alpha2 = null

7.replace 返回值:返回替換後字串,用於在字串中用一些字元替換另一些字元,或替換一個與正則表示式匹配的子串。。

var str="Hello world!"
document.write(str.replace(/world/, "World"))
Hello World!

8.slice返回值:提取字串的某個部分,並以新的字串返回被提取的部分。從指定的開始位置,到結束位置(不包括)的所有字串。如果不指定結束位置,則從指定的開始位置,取到結尾

var a="Hello";
var sub_string1 = a.slice(1);
//sub_string1 = "ello"
var str="Hello happy world!"
document.write(str.slice(6,11))
happy

9.split返回值:用於把一個字串分割成字串陣列,返回分割後陣列。

var str="How are you doing today?"
document.write(str.split(" ") + "<br />")
document.write(str.split("") + "<br />")
document.write(str.split(" ",3))

How,are,you,doing,today?
H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
How,are,you

10.length返回字串的長度,所謂字串的長度是指其包含的字元的個數。

var len = a.length();
//len = 5

11.toLowerCase將整個字串轉成小寫字母。

var a="Hello";
var lower_string = a.toLowerCase();
//lower_string = "hello"

12.toUpperCase將整個字串轉成大寫字母。

var a="Hello";
var upper_string = a.toUpperCase();
//upper_string = "HELLO"

13.isnan(變數):測試是否為數值型. 

14.fontcolor() 給字串指定顏色,十六進位制表示、red、rgb(255,0,0)

var str="顏色";
 //document.write(str.fontcolor("red"))
 //document.write(str.fontcolor("#aaaaaa"))

15.fontsize() 指定字串的大小 (1-7)

var str="字型大小";
 document.write(str.fontsize(1))
 document.write(str.fontsize(3))
 document.write(str.fontsize(7))

 

java字串物件函式

 首先說String,我們說String是不可改變的字串,原因我們會說他是final修飾,所以不可變。

在Java中,String是一個引用型別,但是在作為引數傳遞的時候表現出來的卻是基本型別的特性,即在方法中改變了String型別的變數的值後,不會影響方法外的String變數的值。

每次對String進行改變的時候進行都要建立一個新的物件,然後將指引指向該新的物件,而原來的物件在堆區中不會被銷燬,原來物件中的內容會存放在堆中的常量池中。

StringBuffer和StringBuilder在修改字串的時候,是在棧區中完成的,不會建立物件。

二者的區別主要是在執行速度和執行緒安全這兩方面。

1、StringBuffer 與 StringBuilder 中的方法和功能完全是等價的

2、只是StringBuffer 中的方法大都採用了 synchronized 關鍵字進行修飾,因此是執行緒安全的,而 StringBuilder 沒有這個修飾,可以被認為是執行緒不安全的。

3、在單執行緒程式下,StringBuilder效率更快,因為它不需要加鎖,不具備多執行緒安全而StringBuffer則每次都需要判斷鎖,效率相對更低。

4、在執行速度方面的比較:StringBuilder >  StringBuffer 

總結 :

1.如果要操作少量的資料用 String
2.單執行緒操作字串緩衝區 下操作大量資料  StringBuilder
3.多執行緒操作字串緩衝區 下操作大量資料  StringBuffer

StringBuild 通過append拼接字串

StringBuilder bankval=new StringBuilder();
bankval.append(",").append("'"+bankId+"'");
bankval.append(",").append("'"+bankQueId+"'");
bankval.append(",").append("'"+mgtId+"'");
String bakval = bankval.toString();
String bakvalue = bakval.substring(1, bakval.length());

拼接的字串有時候根據資料型別引號要自己手動加入

String pointIdNum = "'"+IDNumber+"'";
upRoleSql = "UPDATE CT_USER SET ROLE_ID="+"'5afd389c10174e21af1680dd9f79f049'"+ "where ID_NUMBER="+pointIdNum;

StringBuffer拼接字串

	DateFormat dataFormat = new SimpleDateFormat("YYYY-MM-dd");
		StringBuffer sql = new StringBuffer("SELECT * FROM Data AS pcd WHERE pcd.type=2");
		sql.append(" and pcd.ID=?");
		sql.append(" and (pcd.SJ  BETWEEN ? AND ?)");
		sql.append(" and pcd.X!=0 AND pcd.Y!=0");
		List<Object> dataList = new ArrayList<Object>();
		dataList.add(userId);
		dataList.add(dataFormat.format(new Date())+" 00:00:00");
		dataList.add(dataFormat.format(new Date())+" 23:59:59");
		return this.querySqlObjects(sql.toString(),dataList);

拼接字串

	@RequestMapping (value="/user/showUserList")
	public String showUserList(Model model,String ids){
		String[] idsArray = ids.split(",");
		if(ids!="") {
			StringBuffer str = new StringBuffer();
			for(int i=0;i<idsArray.length;i++) {
				User user = userService.getUser(idsArray[i]);
				if(null != user)
				{
					String name = user.getUserName();
					str.append(name+',');
				}
			}
			model.addAttribute("membersName", str);
		}
		if(ids=="") {
			model.addAttribute("membersName", "");
		}
		
		model.addAttribute("members", ids);
		return "select/user/showUserList";
	}

StringBuffer轉String

StringBuffer sb=new StringBuffer("123");
		sb.append("abc");
		System.out.println(sb.toString());

java字串函式

1、replace()字串替換

 String Str = new String("hello");

 System.out.print("返回值 :" );
 System.out.println(Str.replace('o', 'T'));

 System.out.print("返回值 :" );
 System.out.println(Str.replace('l', 'D'));
返回值 :hellT
返回值 :heDDo

字串替換?

String sql = "delete from  user_log where  id in (?)";

使用:sql.replace("[?]", "")

2.contain()函式判斷是否包含,返回值true與false

	if(str.contains(",")){
    
             }


 String a = "l love feng ye";
 String b = "love";
 boolean c = a.contains(b);

3.compareTo()字串比較,字串函式 compareTo (string) ,compareToIgnoreCase(String) 及 compareTo(object string) 來比較兩個字串,並返回字串中第一個字母ASCII的差值。

 String str = "Hello World";
      String anotherString = "hello world";
      Object objStr = str;
 
      System.out.println( str.compareTo(anotherString) );
      System.out.println( str.compareToIgnoreCase(anotherString) );  //忽略大小寫
      System.out.println( str.compareTo(objStr.toString()));

4.indexOf()字串查詢索引出現的位置。String 類的 indexOf() 方法在字串中查詢子字串出現的位置,如過存在返回字串出現的位置(第一位為0),如果不存在返回 -1。

 String strOrig = "Google Java Taobao";
      int intIndex = strOrig.indexOf("Java");
      if(intIndex == - 1){
         System.out.println("沒有找到字串 Java");
      }else{
         System.out.println("Java 字串位置 " + intIndex);
      }
paramPrimarykey.indexOf(",")==0

5.lastIndexOf()查詢字串最後一次出現的位置

 String strOrig = "Hello world ,Hello Runoob";
      int lastIndex = strOrig.lastIndexOf("Hello");
      if(lastIndex == - 1){
         System.out.println("沒有找到字串");
      }else{
         System.out.println("字串最後出現的位置: "+ lastIndex);
      }
String path = "f:/assa/a.xlsx";
int index = path.lastIndexOf("/");
String name = path.substring(index);

獲得檔案字尾

	public static String getExtensionName(String fileName) {
		String extension = "";
		if(StringUtils.isNotBlank(fileName)){
			int lastIndex = fileName.lastIndexOf('.');
			lastIndex = lastIndex > 0 ? lastIndex + 1 : 0;
			extension = fileName.substring(lastIndex);
		}
		return extension;
	}

6.substring()擷取字串

StringBuilder paramSubval=new StringBuilder();
paramPrimarykey.substring(1)
String Str = new String("www.taobao.com");
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4) );
 
        System.out.print("返回值 :" );
        System.out.println(Str.substring(4, 10) );

返回值 :taobao.com
返回值 :taobao

字串擷取獲取除最後一位之前的字串

if(ids.indexOf(",") > -1)
ids = ids.substring(0, ids.length() - 1);
}
condictionSql = "UPDATE "+templateTable+" SET "+updateSqlValue.substring(0, updateSqlValue.length()-1)+ updateCondition +"";

7.reverse() 字串反轉

Java 的反轉函式 reverse() 可字串反轉。

String str="Hello Java.";
            String reverse = new StringBuffer(str).reverse().toString();
            System.out.println("字串反轉前:"+str);
            System.out.println("字串反轉後:"+reverse);

8.split()字串分割

split(string) 方法通過指定分隔符將字串分割為陣列。

String str="www-baidu-com";
            String[] temp;
            String delimeter = "-";  //指定分隔符
            temp = str.split(delimeter);  //分割字串
            //普通for迴圈
            for(int i =0; i < temp.length; i++){
                System.out.println(temp[i]);
                System.out.println("");
            }
            
            System.out.println("----java for each迴圈輸出的方法-----");
            String str1 = "www.baidu.com";
            String[] temp1;
            String delimeter1 = "\\.";   //指定分隔符,.號需要轉義
            temp1 = str1.split(delimeter1);
            for (String x : temp1){
                System.out.println(x);
                System.out.println("");
            }    

9.toUpperCase() 字串小寫轉大寫

String toUpperCase() 方法將字串從小寫轉為大寫。

String str = "string runoob";
String strUpper = str.toUpperCase();

10.regionMatches()測試兩個字串區域是否相等

 String first_str = "Welcome to Microsoft";
      String second_str = "I work with microsoft";
      boolean match1 = first_str.
      regionMatches(11, second_str, 12, 9);
      boolean match2 = first_str.
      regionMatches(true, 11, second_str, 12, 9); //第一個引數 true 表示忽略大小寫區別
      System.out.println("區分大小寫返回值:" + match1);
      System.out.println("不區分大小寫返回值:" + match2);

first_str.regionMatches(11, second_str, 12, 9) 表示將 first_str 字串從第11個字元"M"開始和 second_str 字串的第12個字元"M"開始逐個比較,共比較 9 對字元,由於字串區分大小寫,所以結果為false。

如果設定第一個引數為 true ,則表示忽略大小寫區別,所以返回 true。 

11.append()連線字串

通過 "+" 操作符和StringBuffer.append() 方法來連線字串。

  long startTime = System.currentTimeMillis();
        for(int i=0;i<5000;i++){
            String result = "This is"
            + "testing the"
            + "difference"+ "between"
            + "String"+ "and"+ "StringBuffer";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("字串連線" 
        + " - 使用 + 操作符 : " 
        + (endTime - startTime)+ " ms");
        long startTime1 = System.currentTimeMillis();
        for(int i=0;i<5000;i++){
            StringBuffer result = new StringBuffer();
            result.append("This is");
            result.append("testing the");
            result.append("difference");
            result.append("between");
            result.append("String");
            result.append("and");
            result.append("StringBuffer");
        }
        long endTime1 = System.currentTimeMillis();
        System.out.println("字串連線" 
        + " - 使用 StringBuffer : "
        + (endTime1 - startTime1)+ " ms");
字串連線 - 使用 + 操作符 : 0 ms 
字串連線 - 使用 StringBuffer : 42 ms

12.equalsIgnoreCase()比較字串是否相等

    /**
     * 匹配字首字元是否相同
     * @param str 源字串
     * @param prefix 目標字串
     * @return 字首字元相同與否
     */
    public static boolean startWithIgnoreCase(String str, String prefix) {
        if (prefix.length() > str.length()) {
            return false;
        }
        return str.substring(0, prefix.length()).equalsIgnoreCase(prefix);
    }