博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java String常见十大问题
阅读量:7137 次
发布时间:2019-06-28

本文共 4528 字,大约阅读时间需要 15 分钟。

Technorati 标记:  ,

一、如何判断两个String是否相等??使用”==“还是使用”equals()“?

    对String来说,”==“是用来判断两个字符串(对象)的地址是否相同,即判断是否是同一个字符串的应用。”equals()“则是判断两个字符串(对象)的值是否相等,如果相等则返回true。一般情况下,都是使用”equals()“来判断两个字符串的值是否相等,只有当你需要判断两个字符串是否是同一个对象时,才使用”==“。

String str1 = "abc";String str2 = "abc";String str3 = new String("abc");System.out.println(str1 == str2);	//trueSystem.out.println(str1 == str3);	//falseSystem.out.println(str1.equals(str3));	//true

    需要了解更多关于java内存管理分配的,可以点击 

二、如何实现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);	//123double d = Double.parseDouble(str2);	//12.3boolean flag = Boolean.parseBoolean(str3);	//true

    也许会见过使用valueOf()的转换,如下:

String str1 = "123";String str2 = "12.3";String str3 = "true";int a = Integer.valueOf(str1);	//123double d = Double.valueOf(str2);	//12.3boolean flag = Boolean.valueOf(str3);	//true

    这种形式也行,只不过没有直接使用parseXxx()好,因为Integer.valueOf()返回的是Integer类型,再通过自动集装箱转换为基本数据类型,其方法原型如下:

public static Integer valueOf(String s)

    注意的是,方法Boolean.parseBoolean(String str),只有在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);	//123String str2 = String.valueOf(b);	//13.05String str3 = String.valueOf(flag);	//true

    同时还有着更为简单快捷的方式,直接在基本数据类型之后添加“ ”,如下;

String str1 = a +"";	//aString str2 = flag + "";	//true

    最后谈一下wrapper class的转换,同样可以将基本数据类型转换为String,如下:

int a = 123;boolean flag = true;String str1 = Integer.toString(a);	//123String str2 = Boolean.toString(flag);	//true

    事实上,String.valueOf()方法也是调用了各种wrapper  class的toString()方法,如下。只不过String.valueOf()用起来会方便一点,因为不需要去判断数据属于哪一种类型。

public static 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 = "2013-9-24";SimpleDateFormat format = new SimpleDateFormat();format.applyPattern("yyyy-MM-dd");Date date = format.parse(str);System.out.println(date);//Tue Sep 24 00:00:00 CST 2013

六、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

其实现方式如下,注意,由于篇幅原因,并没有考虑任何异常,详细操作可以参考源码:

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 = new char[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 = new char[repeatTimes];		for(int i = repeatTimes-1; i >= 0; i--){			//复制repeatTimes			buf[i] = ch;		}				return buf.toString();	}


九、如何计算指定字符在字符串里出现的次数

    同样是使用Apache Commons Lang的StringUtils,如下:

int n = StringUtils.countMatches("aaaabbbb", "a");System.out.println(n);

 

    源码研究不透,不太会其实现方式.如果你知道的,希望你可以分享一下,万分感谢.

十.在一些敏感信息上,为什么倾向用char[],而不是String?

    当String一旦创建,便不可再修改,直到gc将它回收.可gc的回收时间无法预测.即使一个对象不存在引用,也需要在未来的某个时间才会让给出回收.所以String操作敏感信息,有渗漏的风险.可char[]就不一样了,我们可以通过程序直接控制其元素,一般敏感信息不再有用,直接将数组即可,因此更倾向使用char[]来保存密码等敏感信息.

本文转自peiquan 51CTO博客,原文链接:http://blog.51cto.com/peiquan/1302339

转载地址:http://jntrl.baihongyu.com/

你可能感兴趣的文章
2011蓝桥杯(高职)
查看>>
Kraft 0.50 发布,小型文档管理程序
查看>>
Nginx 1.3.10 开发版发布
查看>>
ASP.NET控件缩写大全
查看>>
windows 2003 下IIS没有ASP.NET 1.1.4322选项卡
查看>>
TP-Link 普联 TL-PA201 及TL-PWA2801N配对配置过程
查看>>
windows phone8 相比windows phone7中不同
查看>>
DDD~基础设施层
查看>>
Struts+iBatis+Spring+mysql整合开发
查看>>
将C++里的Mat矩阵保存并由matlab提取分析
查看>>
从程序员到项目经理(14):项目经理必须懂一点“章法”
查看>>
linux系统监控示例:vmstat
查看>>
Lock关键字的用法
查看>>
Automatic Tuning of Undo Retention
查看>>
Android 程序清单文件详解
查看>>
NFS挂载文件系统:unable to get mount port number from server, using default
查看>>
Attributes
查看>>
hdu 1270
查看>>
扩展整数poj 1061 青蛙的约会 扩展欧几里得
查看>>
c64x+ DSP/BIOS硬件中断的配置
查看>>