String相关知识点

(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");

将会输出——当前时间:1005

属性id可以随便命名

属性example表示举例说明,可以省略

%n$ms代表输出的是字符串n代表是第几个参数,设置m的值可以在输出之前放置空格该功能还不错。

%n$md代表输出的是整数n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m0

%n$mf代表输出的是浮点数n代表是第几个参数,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00,这个挺有意思

(6)SpannableStringBuilder类学习

注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如前一章讲到的Canvas绘制文字,对于不支持的情况,SpannableStringSpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的额外信息。

因为Spannable等最终都实现了CharSequence接口,所以可以直接把SpannableStringSpannableStringBuilder通过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之外,StringBufferStringBuilder也实现了CharSequence接口。

需要说明的是,CharSequence就是字符序列,String,StringBuilderStringBuffer本质上都是通过字符数组实现的!

里面有以下方法:

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.当把字符串转换成基本类型时,例如,intinteger.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”是字符串常量,它们在编译期就被确定.

s2newString() 创建的字符串不是常量,不能在编译期就确定,所以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());

sy,长度为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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值