String的点点滴滴
一、String 的 equals()到底比较的是什么?equals() 与 == 的区别?
当使用关系运算符==比较两个对象时,是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false
当使用对象的equals( )方法比较两个对象时,是比较两个对象的内容是否相同。而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false
例如:
String str1 = new String("hello");
String str2 = new String("hello");
String str3 = str2;
图解:
代码:
1 public class CompareObjectDemo {
2 public static void main(String[] args) {
3 String str1 = new String("hello");
4 String str2 = new String("hello");
5 String str3 = str2;
6 //用==比较
7 System.out.println("str1 == str2的比较结果为:
" + (str1 == str2));
8 System.out.println("str2 == str3的比较结果为:
" + (str2 == str3));
9 //用equals比较
10 System.out.println("str1.equals(str2)的比较结果为:
" +str1.equals(str2));
11 System.out.println("str2.equals(str3)的比较结果为:
" +str2.equals(str3));
12 }
13 }
结果:
注意:在Java中,如果将同一个字符串常量赋值给多个字符串变量来创建字符串对象,则这些字符串对象具有相同的地址,因为同一个字符串常量在内存中的地址是不变的,所以多个对象共用同一个内存地址
又如:
String str1 = "hello";
String str2 = "hello";
String str3 = str2;
图解:
代码:
1 public class CompareObjectDemo {
2 public static void main(String[] args) {
3 String str1 = "hello";
4 String str2 = "hello";
5 String str3 =str2;
6
7 //用==比较
8 System.out.println("str1 == str2的比较结果为:
" + (str1 == str2));
9 System.out.println("str2 == str3的比较结果为:
" + (str2 == str3));
10 //用equals比较
11 System.out.println("str1.equals(str2)的比较结果为:
" +str1.equals(str2));
12 System.out.println("str2.equals(str3)的比较结果为:
" +str2.equals(str3));
13 }
14 }
结果为:
二、String、StringBuffer、StringBuilder 它们的不同之处
(1)效率: String < StringBuffer < StringBuilder .
为什么?有没有想过?
每次改变String 的值, 底层重新创建了一个新的String对象,如:String str = ""; Str +="xpw"; Str +="yuanmeng"; 前面对str 进行了两次叠加,也创建了两个String对象,并不是简单同一个String对象。所以,不断地改变、string的值,会不断地创建对象,这肯定要耗 时;另外,创建对象,也需要占用一定的内存吧,而且StringBuffer和StringBuilder 每次改变String值,不会重新创建新的对象,可以采用append(str)改变str值。所以有时在程序调优时,有必要采用 Stringbuffer 或者 StringBuilder进行替换。
那么,StringBuffer为什么效率上会比StringBuilder慢?读过源代码的同学,想必知道了吧,StringBuffer它 是线性安全的,就是说它的底层相关方法有Synchronize修饰,在并发时,如果多个线程要访问共享变量,不能简单地同时访问,一旦有一个线程锁住当 前对象,其它线程就必须等;而StringBuiler是非线性安全的,允许多个线程同时访问,所以在效率上,StringBuilder 》 StringBuffer。
(2)StringBuffer:线性安全
StringBuider:非线性安全
注意:在并发时,要使用StringBuffer比较好,非并发,考虑到效率问题,尽量使用StringBuilder
三、String 与 其它 基本类型数据的转换
1 /**
2 * String -> other type
3 */
4 public static void testString2OtherType(){
5 String s1 = "121";
6 int parseInt = Integer.parseInt(s1);
7 System.out.println(parseInt);
8
9 String s2 = "12.1";
10 double parseDouble = Double.parseDouble(s2);
11 System.out.println(parseDouble);
12
13 String s3 = "12.1f";
14 float parseFloat = Float.parseFloat(s3);
15 System.out.println(parseFloat);
16
17 String s4 = "false";
18 boolean parseBoolean = Boolean.parseBoolean(s4);
19 System.out.println(parseBoolean);
20
21 //或者使用如下也可
22 Integer i = Integer.valueOf(s1);
23 System.out.println(i);
24
25 Double d = Double.valueOf(s2);
26 System.out.println(d);
27
28 //...
29 }
30
31 /**
32 * other type --> String
33 */
34 public static void otherType2String(){
35 int i = 38;
36 String s1 = String.valueOf(i);
37 System.out.println(s1);
38
39 float f = 38.38f;
40 String s2 = String.valueOf(f);
41 System.out.println(s2);
42
43 //...
44 }
四、[很好用] 字符串分割 split
1 public static void main(String[] args) {
2 String src = "hello world,I love you";
3 StringDemo.testStringSplit(src);
4 }
5
6 public static void testStringSplit(String src){
7
8 String[] strArray = src.split("\W");//按照单词来划分,具体的正则表达式可以参考Pattern类,里面有详细介绍
9
10 for(String s : strArray){
11 System.out.println(s);
12 }
13 }
结果
hello
world
I
love
you
String的点点滴滴
一、String 的 equals()到底比较的是什么?equals() 与 == 的区别?
当使用关系运算符==比较两个对象时,是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false
当使用对象的equals( )方法比较两个对象时,是比较两个对象的内容是否相同。而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false
例如:
String str1 = new String("hello");
String str2 = new String("hello");
String str3 = str2;
图解:
代码:
1 public class CompareObjectDemo {
2 public static void main(String[] args) {
3 String str1 = new String("hello");
4 String str2 = new String("hello");
5 String str3 = str2;
6 //用==比较
7 System.out.println("str1 == str2的比较结果为:
" + (str1 == str2));
8 System.out.println("str2 == str3的比较结果为:
" + (str2 == str3));
9 //用equals比较
10 System.out.println("str1.equals(str2)的比较结果为:
" +str1.equals(str2));
11 System.out.println("str2.equals(str3)的比较结果为:
" +str2.equals(str3));
12 }
13 }
结果:
注意:在Java中,如果将同一个字符串常量赋值给多个字符串变量来创建字符串对象,则这些字符串对象具有相同的地址,因为同一个字符串常量在内存中的地址是不变的,所以多个对象共用同一个内存地址
又如:
String str1 = "hello";
String str2 = "hello";
String str3 = str2;
图解:
代码:
1 public class CompareObjectDemo {
2 public static void main(String[] args) {
3 String str1 = "hello";
4 String str2 = "hello";
5 String str3 =str2;
6
7 //用==比较
8 System.out.println("str1 == str2的比较结果为:
" + (str1 == str2));
9 System.out.println("str2 == str3的比较结果为:
" + (str2 == str3));
10 //用equals比较
11 System.out.println("str1.equals(str2)的比较结果为:
" +str1.equals(str2));
12 System.out.println("str2.equals(str3)的比较结果为:
" +str2.equals(str3));
13 }
14 }
结果为:
二、String、StringBuffer、StringBuilder 它们的不同之处
(1)效率: String < StringBuffer < StringBuilder .
为什么?有没有想过?
每次改变String 的值, 底层重新创建了一个新的String对象,如:String str = ""; Str +="xpw"; Str +="yuanmeng"; 前面对str 进行了两次叠加,也创建了两个String对象,并不是简单同一个String对象。所以,不断地改变、string的值,会不断地创建对象,这肯定要耗 时;另外,创建对象,也需要占用一定的内存吧,而且StringBuffer和StringBuilder 每次改变String值,不会重新创建新的对象,可以采用append(str)改变str值。所以有时在程序调优时,有必要采用 Stringbuffer 或者 StringBuilder进行替换。
那么,StringBuffer为什么效率上会比StringBuilder慢?读过源代码的同学,想必知道了吧,StringBuffer它 是线性安全的,就是说它的底层相关方法有Synchronize修饰,在并发时,如果多个线程要访问共享变量,不能简单地同时访问,一旦有一个线程锁住当 前对象,其它线程就必须等;而StringBuiler是非线性安全的,允许多个线程同时访问,所以在效率上,StringBuilder 》 StringBuffer。
(2)StringBuffer:线性安全
StringBuider:非线性安全
注意:在并发时,要使用StringBuffer比较好,非并发,考虑到效率问题,尽量使用StringBuilder
三、String 与 其它 基本类型数据的转换
1 /**
2 * String -> other type
3 */
4 public static void testString2OtherType(){
5 String s1 = "121";
6 int parseInt = Integer.parseInt(s1);
7 System.out.println(parseInt);
8
9 String s2 = "12.1";
10 double parseDouble = Double.parseDouble(s2);
11 System.out.println(parseDouble);
12
13 String s3 = "12.1f";
14 float parseFloat = Float.parseFloat(s3);
15 System.out.println(parseFloat);
16
17 String s4 = "false";
18 boolean parseBoolean = Boolean.parseBoolean(s4);
19 System.out.println(parseBoolean);
20
21 //或者使用如下也可
22 Integer i = Integer.valueOf(s1);
23 System.out.println(i);
24
25 Double d = Double.valueOf(s2);
26 System.out.println(d);
27
28 //...
29 }
30
31 /**
32 * other type --> String
33 */
34 public static void otherType2String(){
35 int i = 38;
36 String s1 = String.valueOf(i);
37 System.out.println(s1);
38
39 float f = 38.38f;
40 String s2 = String.valueOf(f);
41 System.out.println(s2);
42
43 //...
44 }
四、[很好用] 字符串分割 split
1 public static void main(String[] args) {
2 String src = "hello world,I love you";
3 StringDemo.testStringSplit(src);
4 }
5
6 public static void testStringSplit(String src){
7
8 String[] strArray = src.split("\W");//按照单词来划分,具体的正则表达式可以参考Pattern类,里面有详细介绍
9
10 for(String s : strArray){
11 System.out.println(s);
12 }
13 }
结果
hello
world
I
love
you
原文:http://www.cnblogs.com/chenmo-xpw/p/3947368.html