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);
}