(1)java空字符串和null的区别
StringmString=””;
System.out.println(mString.length());
输出0;
StringmString=null;
System.out.println(mString.length());
报空指针异常,因为null这个对象并没有length()方法。
(2)获取字符串长度
intlength=mString.length();
获取数组长度
intlength=array.length;
获取集合size
intsize=mArrayList.size();
(3)TextUtils类
importandroid.text.TextUtils;
常用api
//字符串拼接
Log.d(TAG,TextUtils.concat("Hello", "", "world!").toString());
//判断是否为空字符串
Log.d(TAG,TextUtils.isEmpty("Hello") +"");
//判断是否只有数字
Log.d(TAG,TextUtils.isDigitsOnly("Hello")+ "");
//判断字符串是否相等
Log.d(TAG,TextUtils.equals("Hello","Hello") + "");
//获取字符串的倒序
Log.d(TAG,TextUtils.getReverse("Hello",0, "Hello".length()).toString());
//获取字符串的长度
Log.d(TAG,TextUtils.getTrimmedLength("Helloworld!") + "");
Log.d(TAG,TextUtils.getTrimmedLength(" Helloworld! ") + "");
//获取html格式的字符串
Log.d(TAG,TextUtils.htmlEncode("<html>\n"+
"<body>\n"+
"这是一个非常简单的HTML。\n"+
"</body>\n"+
"</html>"));
//获取字符串中第一次出现子字符串的字符位置
Log.d(TAG,TextUtils.indexOf("Hello world!","Hello") + "");
//截取字符串
Log.d(TAG,TextUtils.substring("Hello world!",0, 5));
//通过表达式截取字符串
Log.d(TAG,TextUtils.split(" Hello world! "," ")[0]);
(4)String的属性translable
<stringname="voice_mode_off" translatable="false">on</string>
这种字符串加上translatable=”false”意思是不用翻译成其他语言,一般用于不用本地化的字符串。
不用本地化的意思就是不用显示出来的。
这种字符串一般是用来传值的。
比如getString(voice_mode_off).equals(”on”)。代码中有这句判断。
如果voice_mode_off有多个语言下的版本,假如有中文的。
那么英文时候,这个判断为true,中文版本判断为false.
为了避免这种情况,就加入属性translatable=”false”
实际去找了下,暂时发现除了res/value下的string.xml有的字符串有这条属性,其他语言的都没有。
有这条属性的对应名字的字符串,在其他语言也并没有给。
(5)res/values/strings.xml
<xliff:g>标签介绍:
先举例:
<stringname=”time”>当前时间为:<xliff:gid=”hour”>%1$s</xliff:g>时<xliff:gid=”minute”>%2$s</xliff:g>分</string>
这个主要用于程序中,动态的插入内容时候使用,例如,
然后通过程序,context.getString(R.string.time,"10","05");
将会输出——当前时间:10时05分
属性id可以随便命名
属性example表示举例说明,可以省略
%n$ms:代表输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格,该功能还不错。
%n$md:代表输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0
%n$mf:代表输出的是浮点数,n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00,这个挺有意思。
(6)SpannableStringBuilder类学习
注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。
因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。
参数说明:
objectwhat :对应的各种Span,后面会提到;
intstart:开始应用指定Span的位置,索引从0开始
intend:结束应用指定Span的位置,特效并不包括这个位置。比如如果这里数为3(即第4个字符),第4个字符不会有任何特效。从上面的例子也可以看出来。
intflags:取值有如下四个,这个一般只有在用EditText的时候会涉及到。
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。
要应用一个Span总共分三步:
1、构造String
2、构造Span
3、利用SetSpan()对指定范围的String应用这个Span
字体背景颜色(BackgroundColorSpan)
字体大小(AbsoluteSizeSpan)
粗体、斜体(StyleSpan)
删除线(StrikethroughSpan)
下划线(UnderlineSpan)
图片置换(ImageSpan)
(7)String,StringBuffer,StringBuilder,CharSequence的区别
String:字符串常量
StringBuffer:字符串变量,线程安全
StringBuilder:字符串变量,线程不安全
Stringstr = “This is only a” + “ simple” + “test”;
其实就是:
Stringstr = “This is only a simple test”;
所以不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String对象的话,速度就没那么快了,譬如:
Stringstr2 = “This is only a”;
Stringstr3 = “ simple”;
Stringstr4 = “ test”;
Stringstr1 = str2 +str3 + str4;
String类拼接直接使用加号就可以了。
StringBuffer,StringBuilder需要调用append()方法。
StringBufferbuilder = new StringBuilder(“This is only a”).append(“simple”).append(“ test”);
CharSequence是一个接口,直译是字符序列。
除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
需要说明的是,CharSequence就是字符序列,String,StringBuilder和StringBuffer本质上都是通过字符数组实现的!
里面有以下方法:
packagejava.lang;
publicinterfaceCharSequence {
publicintlength();
publiccharcharAt(intindex);
publicCharSequence subSequence(intstart, intend);
publicString toString();
}
接口不能创建实例,但是下例是实现这个接口的实例(多态)
CharSequencestr = "dd";
就是CharSequencestr = new String("dd");
(8)String类常用方法
1.创建String对象
Stringstr1=”hello”;
2.字符串转化为字符数组
charc[] = str1.toCharArray();//将一个字符串变为字符数组
3.字符数组转化为字符串(直接调用构造方法)
Stringstr2 = new String(c);//将全部的字符数组变为String
Stringstr3 = new String(c,0,3);//将部分字符数组变为String
4.获取给定的Index处的字符
charm=str1.charAt(3);
6.替换给定的Index处的字符
这个方法String类没有,StringBuffer类的。
str1.setCharAt(intwhere,char ch);
5.字符串的长度
intlength=str1.length();
6.以给定的字符串开头或结尾
startsWith()和endsWith()
7.比较字符串
equals();
8.截取子串
Stringsubstring(int startIndex)
Stringsubstring(int startIndex,intendIndex)
9.查找指定字符出现的位置
indexOf()查找字符或者子串第一次出现的地方。
lastIndexOf()查找字符或者子串是后一次出现的地方.
10.大小写字母间的转换
StringtoLowerCase() 将String中的所有字符都转换为小写
StringtoUpperCase() 将String中的所有字符都转换为大写
11.当把字符串转换成基本类型时,例如,int,integer.praseInt(Strings)
当把基本类型转换成字符串时,例如,staticString valueOf(int I)
12.去除字符串前面的空白和尾部空白
Stringtrim() 返回字符串的副本,忽略前导空白和尾部空白//trim修剪的意思
13.替换字符
Stringreplace(char original,charreplacement)
(9)String常量池
常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
Strings1=”hello”;
Strings2=new String(“hello”);
s1中的”hello”是字符串常量,它们在编译期就被确定.
s2用newString() 创建的字符串不是常量,不能在编译期就确定,所以newString() 创建的字符串不放入常量池中,它们有自己的地址空间。
(10)String类型增加””空字符串或者调用replace方法用空字符串替代后,String长度的变化
Stringstring="my";
System.out.println(string.length());
for(inti = 0; i < 10; i++) {
string=string+"";
}
结果String依然是my,长度为2。
Strings=string.replace("m","");
System.out.println(s);
System.out.println(s.length());
s为y,长度为1。
(11)模拟退格键,删除字符串最后一个字符
方法1:
直接取子串
a= a.substring(0, a.length()-1);
方法2:
转化为StringBuffer类,用它的setCharAt方法
StringBuffermBuffer=newStringBuffer(a);
mBuffer.setCharAt(mBuffer.length()-1,'\0');
a=mBuffer.toString();
System.out.println(a);