string的点点滴滴

坚守一辈子的幸福

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的比较结果为:\n\t" + (str1 == str2));
 8         System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
 9        //用equals比较
10        System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
11        System.out.println("str2.equals(str3)的比较结果为:\n\t" +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的比较结果为:\n\t" + (str1 == str2));
 9           System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
10          //用equals比较
11          System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
12          System.out.println("str2.equals(str3)的比较结果为:\n\t" +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的比较结果为:\n\t" + (str1 == str2));
 8         System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
 9        //用equals比较
10        System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
11        System.out.println("str2.equals(str3)的比较结果为:\n\t" +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的比较结果为:\n\t" + (str1 == str2));
 9           System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
10          //用equals比较
11          System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
12          System.out.println("str2.equals(str3)的比较结果为:\n\t" +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

时间: 2024-11-06 01:54:02

string的点点滴滴的相关文章

java——String的那边破事

经典的先看下面一段代码,请问最终创建几个对象,分别在哪里? String s0 = new String("luoliang.me"); String s1 = "luoliang.me"; String s2 = new String("luoliang.me"); 想要回答这个问题,先得搞清楚new String()以及String pool的,下面我慢慢来说下. 在java中所有的字符串都会保存在一个叫String pool字符串池里面,这

String的那点破事

经典的先看下面一段代码,请问最终创建几个对象,分别在哪里? String s0 = new String("luoliang.me"); String s1 = "luoliang.me"; String s2 = new String("luoliang.me"); 想要回答这个问题,先得搞清楚new String()以及String pool的,下面我慢慢来说下. 在java中所有的字符串都会保存在一个叫String pool字符串池里面,这

Android开发点点滴滴——一些基础的但有用的知识(3)

1.long型数据的计算 之前在写到关于一个时间的小软件时,System.currentTimeMillis()返回的是从1970年1月1日到现在的毫秒数,是long型的,需要给这个加上一个数字. 比如: long curTime = System.currentTimeMillis();// 获取当前时间 long deadLineTime = curTime+(30*24*60*60*1000); //long deadLineTime30day = curTime+(long)30*24*

C# 引用类型之特例string

在C#编程的时候经常会使用字符串(string)类型,它也是引用类型,但是处处都不作为引用的用法来使用,实属特例,下来我一一罗列出来,供自己记忆方便: 1)字符串的直接赋值:本身字符串就是引用类型,应该使用  new 对象方法一个实例,但是微软为了方便大家,可以直接定义字符串变量 并且赋值操作,例如: string a = "我的中国心"; ,这样只是简化我们的操作: 2)一个字符串赋值给另一个字符串变量:正常的引用类型会将两个引用变量指向同一个地址,但是一个字符串变量赋值给另一个字符

C++ String 及其与char[]的比较

在学习C++之前  一般都是学过了C语言了 在C语言中   我们对字符串进行保存操作  使用的是char[] 但是在C++中    string比char[]的使用更为频繁  常见    下面稍微讲一下我对于string的认知 1.与其他的标准库类型一样   用户程序需要使用String类型对象  就必须包含相关的头文件   (为了编写方便   需要提供合适的using声明) #include <string> using std::string; 2.string对象的定义与初始化 stri

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException

"The constructor ClassPathXmlApplicationContext(String) refers to the missing type BeansException" "构造函数ClassPathXmlApplicationContext(字符串)是指缺失类型BeansException" 出现错误的原因:jar没有正确引入,即使表面上你能import包. import org.junit.Test; import org.spring

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

JAVA: String详解

String 类用来存储字符串 ,是不可变的. 1. 基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2. 复合数据类型(类) 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.用 str.equals(str2) 方法来比较字符串的值是否相等. 3. len