1.落筆緣由
字符串在程序中使用得太頻繁了穆刻,而java.lang.String中包含著許多有用的方法新锈,但是由于平時(shí)沒(méi)詳細(xì)去看過(guò)String的源碼梆暮,所以有些邏輯String已經(jīng)提供處理的方法了资溃,而由于對(duì)String的生疏大莫,于是又重復(fù)造輪子勿侯,做了許多無(wú)謂的功夫拓瞪。
總的來(lái)說(shuō),String常用的方法大概有幾類:
(1)將其他基本類型轉(zhuǎn)換為String
(2)將String轉(zhuǎn)換為char數(shù)組
(3)將字符串所以英文轉(zhuǎn)為大寫(xiě)字母或小寫(xiě)字母
(4)獲取指定的子字符串在字符串中出現(xiàn)的位置(返回的是首位置)
(5)返回該字符串指定位置的字符
(6)根據(jù)給定正則表達(dá)式的匹配拆分字符串
(7)替換字符
(8)連接字符
(9)比較字符串是否相等(compareTo和equal)
(10)去除字符串首位的空格(trim)
2.實(shí)踐檢驗(yàn)
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Test1 extends Activity
{
private final static String TAG = "lgy";
private String beseStr = "lgy哈嘍";
private int i = 111;
private float f = 222f;
private long l = 333333333;
private double d = 444F;
private short s = 555;
private byte b = 0010;
private char c = 'c';
private boolean bl = true;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.test1);
// typeToString();
// stringToType();
// stringConcat("_ok");
stringCompareTo("lgy哈嘍","lgy哈嘍", 0);
stringCompareTo("lgy哈嘍","lgy哈", 0);//返回多出的字符個(gè)數(shù) 3
stringCompareTo("lgy哈","lgy哈嘍", 0);//返回少了的字符個(gè)數(shù) -3
stringCompareTo("lgd","lgy哈嘍", 0);//d 100 y 121
stringCompareTo("lgy哈嘍","LGY哈嘍", 1);
// stringEndWith("l");
// stringEndWith("嘍");
// stringStartWith("l");
// stringToCharArrays(beseStr);
// stringSplit("lgy_123_rtt", "_");
// stringIndexOf("lgy_123_ktv_456","k");
// stringCharAt("abcdefg",5);
}
/**
* Administrator
* 2017-1-16
*TODO 基本類型轉(zhuǎn)String
*/
private void typeToString()
{
//Java中數(shù)值常量的默認(rèn)類型都是int類型的助琐,當(dāng)進(jìn)行賦值操作的時(shí)候祭埂,如果像這個(gè)一樣,賦值給byte類型的數(shù)據(jù)兵钮,
//這是系統(tǒng)內(nèi)部會(huì)先判斷這個(gè)數(shù)據(jù)是否超過(guò)byte類型的最大范圍(-128~127)蛆橡,如果沒(méi)有超過(guò)則可以正常賦值,超過(guò)了會(huì)報(bào)錯(cuò)
//如果賦的值前面沒(méi)有0,轉(zhuǎn)String的值對(duì)應(yīng)的是十進(jìn)制的數(shù)值
//如果賦的值前面有0(如b = 0111)掘譬,轉(zhuǎn)String的值貌似是對(duì)不上的,因?yàn)檫@個(gè)0111被系統(tǒng)認(rèn)為是8進(jìn)制轉(zhuǎn)為10進(jìn)制就是73
//0100 轉(zhuǎn)String 64
//0001 1
//0010 8
//0110 72
//0111 73
//反正把byte這個(gè)基本類型當(dāng)作10進(jìn)制泰演,但是值限定在-127~127來(lái)使用即可
//總結(jié):
//1.數(shù)值前面帶0的表示的是這個(gè)數(shù)值是8進(jìn)制的
//2.數(shù)值前面帶0x的標(biāo)識(shí)這個(gè)數(shù)值是16進(jìn)制的
Log.i(TAG, "byte:"+String.valueOf(b));
Log.i(TAG, "short:"+String.valueOf(s));
Log.i(TAG, "int:"+String.valueOf(i));
Log.i(TAG, "long:"+String.valueOf(l));
Log.i(TAG, "float:"+String.valueOf(f));
Log.i(TAG, "double:"+String.valueOf(d));
Log.i(TAG, "char:"+String.valueOf(c));
Log.i(TAG, "boolean:"+String.valueOf(bl));
//結(jié)果:
// 01-16 11:46:30.427: I/lgy(23893): byte:8
// 01-16 11:46:30.427: I/lgy(23893): short:555
// 01-16 11:46:30.427: I/lgy(23893): int:111
// 01-16 11:46:30.427: I/lgy(23893): long:333333333
// 01-16 11:46:30.427: I/lgy(23893): float:222.0
// 01-16 11:46:30.427: I/lgy(23893): double:444.0
// 01-16 11:46:30.427: I/lgy(23893): char:c
// 01-16 11:46:30.427: I/lgy(23893): boolean:true
}
private void stringToType()
{
Log.i(TAG, "stringToType================================");
//1.string to int
//parseInt(String string, int radix)的radix參數(shù)是進(jìn)制數(shù),這個(gè)方法可以將數(shù)值字符串轉(zhuǎn)為對(duì)應(yīng)radix進(jìn)制數(shù)的數(shù)值的10進(jìn)制數(shù)
//例如Integer.parseInt("100",2)=4葱轩,它將字符串“100”當(dāng)作2進(jìn)制數(shù)睦焕,換算成10進(jìn)制就是4
//Integer.parseInt("100",8)=64
//Integer.parseInt("100",16)=256
//Integer.parseInt("100",4)=16
//反正最后的返回值是10進(jìn)制數(shù)
Log.i(TAG, "int:"+Integer.parseInt("g",17));
//不帶radix參數(shù)的默認(rèn)是把string當(dāng)作10進(jìn)制數(shù)來(lái)轉(zhuǎn)換
Log.i(TAG, "int:"+Integer.parseInt("100"));
//除非radix>16,否則無(wú)法解析字母(不區(qū)分大小寫(xiě))
//例如Integer.parseInt("a")或Integer.parseInt("a",10)都是會(huì)報(bào)錯(cuò)的
//因?yàn)?6進(jìn)制的10到15是用A到F表示的藐握,所以Integer.parseInt("a",16)=10是能解析的
//但是如果Integer.parseInt("g",16)是會(huì)報(bào)錯(cuò)的,因?yàn)?6進(jìn)制中沒(méi)有用到g
//然而如果你將radix設(shè)置為17垃喊,也就是17進(jìn)制猾普,即Integer.parseInt("g",17),是能解析的Integer.parseInt("g",17)=16
Log.i(TAG, "int:"+Integer.parseInt("+100"));
//能識(shí)別‘-’和‘+’號(hào)
//看了源碼radix必須大于等于2本谜,小于等于36
//2.string to float
Log.i(TAG, "float:"+Float.parseFloat("100"));
//Float.parseFloat("100")==100.0
//Float無(wú)法設(shè)置進(jìn)制初家,只有parseFloat(String string)這個(gè)解析方法
Log.i(TAG, "float:"+Float.parseFloat("100.01"));
//3.string to double
Log.i(TAG, "double:"+Double.parseDouble("100"));
//Double.parseDouble("100")==100.0
//Double無(wú)法設(shè)置進(jìn)制,只有parseDouble(String string)這個(gè)解析方法
//4.string to char ---no char本來(lái)就表示字符乌助,轉(zhuǎn)為字符串有什么意義
//5.string to boolean
Log.i(TAG, "boolean:"+Boolean.parseBoolean("true"));
//Boolean.parseBoolean("true")=true
Log.i(TAG, "boolean:"+Boolean.parseBoolean("trues"));
//Boolean.parseBoolean("trues")=false
Log.i(TAG, "boolean:"+Boolean.parseBoolean("tru"));
//Boolean.parseBoolean("tru")=false
Log.i(TAG, "boolean:"+Boolean.parseBoolean("1"));
//Boolean.parseBoolean("1")=false
//感覺(jué)有點(diǎn)sb,我應(yīng)該去看parseBoolean源碼的笤成,代碼是return "true".equalsIgnoreCase(s)
//也就是只要字符串不是“true”或“TRUE”,就返回false
//6.string to byte
Log.i(TAG, "byte:"+Byte.parseByte("11"));
//看源碼它調(diào)用了Integer.parseInt("11",10);它的用法和parseInt一樣,只是它的數(shù)值限制在-127到127眷茁,超出這個(gè)范圍就報(bào)異常
//7.string to short
Log.i(TAG, "short:"+Short.parseShort("11"));
//看源碼它調(diào)用了Integer.parseInt("11",10);它的用法和parseInt一樣炕泳,只是它的數(shù)值限制在-256到256,超出這個(gè)范圍就報(bào)異常
//8.string to long
Log.i(TAG, "long:"+Long.parseLong("11"));
//它沒(méi)調(diào)用Integer.parseInt上祈,但是用法應(yīng)該也一樣培遵,只是他的數(shù)值范圍比較大
}
/**
* Administrator
* 2017-1-16
*TODO 連接兩個(gè)字符串,將指定的str加到beseStr字符串的結(jié)尾
* @param str
*/
private void stringConcat(String str)
{
Log.i(TAG, beseStr.concat(str));
}
/**
* Administrator
* 2017-1-16
*TODO 這個(gè)函數(shù)的作用就是對(duì)兩個(gè)字符串按字典排序的方式進(jìn)行比較登刺,返回兩個(gè)字符串中第一個(gè)不同的字符的ascII碼差值
* 如stringCompareTo("lgd","lgy哈嘍", 0);//d 100 y 121 返回的是-21
* 但是stringCompareTo("lg","lgy哈嘍", 0);這樣子會(huì)返回-3籽腕,也就是返回少了的字符的個(gè)數(shù)
*compareTo:If the strings are the same length and every {@code char} is the same, the result is 0
*compareToIgnoreCase:不區(qū)分大小寫(xiě),If the strings are the same length and every {@code char} is the same, the result is 0
* @param string
* @param m
*/
private void stringCompareTo(String str ,String string ,int m)
{
if (m==0)
{
Log.i(TAG, "return value:"+str.compareTo(string));
}else if (m==1)
{
Log.i(TAG, "return value:"+str.compareToIgnoreCase(string));
}
}
/**
* Administrator
* 2017-1-16
*TODO 此字符串是否以指定的后綴結(jié)束
*/
private void stringEndWith(String suffix)
{
Log.i(TAG, "return value:"+beseStr.endsWith(suffix));
}
/**
* Administrator
* 2017-1-16
*TODO 測(cè)試此字符串是否以指定的前綴開(kāi)始
* @param prefix
*/
private void stringStartWith(String prefix)
{
Log.i(TAG, "return value:"+beseStr.startsWith(prefix));
}
/**
* Administrator
* 2017-1-16
*TODO 將此字符串轉(zhuǎn)換為一個(gè)新的字符數(shù)組
* @param string
*/
private void stringToCharArrays(String string)
{
char[] cs = string.toCharArray();
for (int i = 0; i < cs.length; i++)
{
Log.i(TAG, "i:"+cs[i]);
}
}
/**
* Administrator
* 2017-1-16
*TODO 根據(jù)給定正則表達(dá)式的匹配拆分此字符串
* @param string
*/
private void stringSplit(String beSplitString,String regularExpression)
{
String str[] = beSplitString.split(regularExpression);
for (int i = 0; i < str.length; i++)
{
Log.i(TAG, "i:"+str[i]);
}
}
/**
* Administrator
* 2017-1-16
*TODO 返回指定子字符串在此字符串中第一次出現(xiàn)處的索引(首位置)
* @param beIndexString
* @param string
*/
private void stringIndexOf(String beIndexString,String string)
{
int index = beIndexString.indexOf(string);
Log.i(TAG, "index:"+index);
}
/**
* Administrator
* 2017-1-16
*TODO 返回指定索引處的字符,別忘了纸俭,索引從0開(kāi)始
* @param string
* @param index
*/
private void stringCharAt(String string,int index)
{
Log.i(TAG, "char:"+string.charAt(index));
}
}
3. compareTo的用途
compareTo這個(gè)方法確實(shí)不常用皇耗,但是覺(jué)得他挺有意思的,想仔細(xì)了解它的用途揍很。在上面例子中也說(shuō)明了:
這個(gè)函數(shù)的作用就是對(duì)兩個(gè)字符串按字典排序的方式進(jìn)行比較郎楼,返回兩個(gè)字符串中第一個(gè)不同的字符的ascII碼差值
如stringCompareTo("lgd","lgy哈嘍", 0);//d 100 y 121 返回的是-21
但是stringCompareTo("lg","lgy哈嘍", 0);這樣子會(huì)返回-3,也就是返回少了的字符的個(gè)數(shù)
stringCompareTo("lgy哈嘍","lg", 0);這樣子會(huì)返回3窒悔,也就是返回多出的字符個(gè)數(shù)
但是還是不是很清楚compareTo有很用呜袁,雖然知道它的作用,但是具體用途還是不清楚简珠,要它何用阶界?還是通過(guò)現(xiàn)實(shí)例子來(lái)展示它的作用:
//使用compareTo 進(jìn)行姓名的排序
//需要進(jìn)行排序的字符串
String[] array = new String[] { "lilei", "libai", "james", "poly",
"wobfei" };
//使用簡(jiǎn)單的循環(huán)排序
for (int i = 0; i < array.length - 1; i++) {
for (int j = i + 1; j < array.length; j++) {
if (array[i].compareTo(array[j]) > 0) {
String temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
//結(jié)果:
//james libai lilei poly wobfei
4.總結(jié)
這里只是列舉一下比較常用的,如果想深入了解還是要看源碼聋庵,可以比較深入的了解這些方法的實(shí)現(xiàn)過(guò)程和具體的使用限制膘融。
5.源碼地址
http://download.csdn.net/detail/lgywsdy/9741104