首页 > 代码库 > Java String常见问题
Java String常见问题
一、如何判断两个String是否相等??使用”==“还是使用”equals()“?
对String来说,”==“是用来判断两个字符串(对象)的地址是否相同,即判断是否是同一个字符串的应用。”equals()“则是判断两个字符串(对象)的值是否相等,如果相等则返回true。一般情况下,都是使用”equals()“来判断两个字符串的值是否相等,只有当你需要判断两个字符串是否是同一个对象时,才使用”==“。
<span style="font-size:18px;">String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1 == str2); //true System.out.println(str1 == str3); //false System.out.println(str1.equals(str3)); //tru</span>
二、如何实现String与基本数据类型的装换
首先了解一下如何将String转换为基本的数据类型。8个wrapper class(Integer,Double….)提供了相对应的方法parseXxx(String str)将字符串转换为基本的数据类型,如下:
String str1 = "123";
String str2 = "12.3";
String str3 = "true";
int a = Integer.parseInt(str1); //123
double d = Double.parseDouble(str2);//12.3
boolean flag = Boolean.parseBoolean(str3);//true
也许会见过使用valueOf()的转换,如下:
String str1 = "123";
String str2 = "12.3";
String str3 = "true";
int a = Integer.valueOf(str1);//123
double d = Double.valueOf(str2); //12.3
boolean flag = Boolean.valueOf(str3); //true
这种形式也行,只不过没有直接使用parseXxx()好,因为Integer.valueOf()返回的是Integer类型,再通过自动集装箱转换为基本数据类型,其方法原型如下:
publicstatic Integer valueOf(String s)
注意的是,方法Boolean.parseBoolean(Stringstr),只有在str为字符串“true”时(忽略大小写),才会返回true。换句话说就是其他字符串都是返回false。Boolean.parseBoolean(“yes”)将返回false。接着下来看一下如何将基本数据类型转换为String,可以使用String.valueOf()方法进行转换,如下:
int a = 123;
double b = 13.05;
boolean flag =true;
String str1 = String.valueOf(a); //123
String str2 = String.valueOf(b); //13.05
String str3 = String.valueOf(flag); //true
同时还有着更为简单快捷的方式,直接在基本数据类型之后添加“”,如下;
String str1 = a +""; //a
String str2 = flag + "";//true
最后谈一下wrapper class的转换,同样可以将基本数据类型转换为String,如下:
int a = 123;
boolean flag =true;
String str1 = Integer.toString(a); //123
String str2 = Boolean.toString(flag); //true
事实上,String.valueOf()方法也是调用了各种wrapper class的toString()方法,如下。只不过String.valueOf()用起来会方便一点,因为不需要去判断数据属于哪一种类型。
publicstatic String valueOf(double d) {
return Double.toString(d);//其余的转换都与之类似
}
三、如何分割字符串
在java里分割字符串是通过正则表达式来分割的,在此我只是简单谈论一下如何分割,想深入了解正则表达式的,可以点击 这里。
首先看一个简单的例子,如下使用“-”来分割字符串,
String str = "aa-bb-cc-dd";
String[] res = str.split("-");//aa bb cc dd
看起来很简单,只需要在找出分割复就行了,如你想使用“c”作为分割符,那输出就是aa-bb- -dd。另外再看一下,使用空格符(\s)来分割字符串(Space键,tab键或者换行符),如下:
String str4 = "aa bb cc dd";
String[] res = str4.split("\\s"); //aa bb cc dd
在这里就有点不同的,在java里反斜线(\)有着特别的含义,为避免混淆或者出现异常, 应该使用(\\),类似的,看一下使用“|”分割字符串,
String str4 = "aa|bb|cc|dd";
String[] res = str4.split("\\|"); //aa bb cc dd
四、取子串
String str = "abcdefg";
str = str.substring(2, 5); //cde
在java7里,substring会创建一个字符串,如果是在java6,倡导使用如下方式:
String str = "abcdefg";
str = str.substring(2, 5)+""; //cde
关于substring在java6和java7的区别,可以查阅相关文档。
五、如何将字符串转换日期
String str = "2014-6-27";
SimpleDateFormat format =new SimpleDateFormat();
format.applyPattern("yyyy-MM-dd");
Date date = format.parse(str);
System.out.println(date);
六、String,StringBuilder,StringBuffer的区别
String与StringBuilder的区别,String是创建之后不可以再修改,StringBuilder是可变的,创建之后可以修改。StringBuilder与StringBuffer的区别,StringBuffer是线程安全的,执行速度相对StringBuffer会慢一点。
七、在switch语句中使用字符串
从java7开始,可以在switch语句中使用字符串,如下:
switch (str) {
case "a":
break;
case "b":
break;
}
八、让字符串重复出现
使用Apache Commons Lang的StringUtils,可以实现这一功能:
String str = "1234";
String repeated = StringUtils.repeat(str,3);
//1234 1234 1234
其实现方式如下,注意,由于篇幅原因,并没有考虑任何异常,详细操作可以参考源码:
<span style="font-size:18px;">public String repeat(String str,int repeatTimes){ int inputLen = str.length(); //获取字符串的长度 int outputLen = inputLen *repeatTimes; //输出字符串的长度 switch (inputLen) { //当长度只有1或2时,选择直接使用字符操作,增加效率 case 1: return repeat(str.charAt(0),repeatTimes); case 2: char ch0 = str.charAt(0); char ch1 = str.charAt(1); char[] output = newchar[outputLen]; for(int i = repeatTimes * 2 -1;i>=0;){ output[i] =ch0; output[i+1] =ch1; i +=2; } return output.toString(); default: StringBuilder buf =new StringBuilder(); for(int i = 0;i <= repeatTimes -1; i++){ buf.append(str); } return buf.toString(); } } public String repeat(char ch,int repeatTimes){ char[] buf = newchar[repeatTimes]; for(int i = repeatTimes-1; i >=0; i--){ //复制repeatTimes buf[i] = ch; } return buf.toString(); }</span>
九、如何计算指定字符在字符串里出现的次数
同样是使用Apache CommonsLang的StringUtils,如下:
int n = StringUtils.countMatches("aaaabbbb", "a");
System.out.println(n);
十.在一些敏感信息上,为什么倾向用char[],而不是String?
当String一旦创建,便不可再修改,直到gc将它回收.可gc的回收时间无法预测.即使一个对象不存在引用,也需要在未来的某个时间才会让给出回收.所以String操作敏感信息,有渗漏的风险.可char[]就不一样了,我们可以通过程序直接控制其元素,一般敏感信息不再有用,直接将数组即可,因此更倾向使用char[]来保存密码等敏感信息.