java中字符串的常见问题

相信接触过编程语言的童鞋对字符串不陌生吧,无论是c、c++还是c#等等,几乎所有的编程语言中都少不了字符串,那么,今天就说说java中的字符串。

在java中,声明一个字符串很容易,用String即可,如:

String s1="123abc";
String s2="abc";

相信上面的定义对大家来说就是小菜一碟,那么,我再定义一个s3:

String s3 ="123abc";
System.out.println(s1==s3);//true
System.out.println(s2==s3);//false

对于上面的输出结果,我想大家都能答对,但是为什么呢?难道只是简单的因为俩个内容相同,俩个不同吗?显然不是的。

在java中,字符串是不变对象,意思是说,字符串内容一旦创建不可改变,若想改变某个字符串内容一定会创建新对象。像上面的s1、s2和s3后面的值都可以叫做“字面量”,他们在编译时被放到常量池中,一旦有内容相同的,机会被认为是同一个值,那么指向他们的引用地址也就相同,所以上面的结果不单单是因为内容上的异同。那么,现在再来声明一个引用:

String s4=new String("123abc");
System.out.println(s4==s3);

这个结果又是什么呢?显然是false。s4是一个指向新new出来的对象,虽然它指向的地址中的值是123abc,但是也仅仅是地址中的值一样,但地址不同,所以,结果为false。

接下来,再看几个:

String s4 = "123"+"abc";
String str1 = "123";
String str2 = "abc";
String s5 = str1+str2;
System.out.println(s4==s3);
System.out.println(s5==s3);

结果是true,false。当一个计算表达式计算符两边都是字面量时,会直接计算结果,然后将结果编译到class文件中,s4在class文件中样子是:

String s4 = "123abc";

在编译时编译器自动优化,将s4转变成123abc,然后寻找常量池中有没有“123abc”,所以s4==s3;而s5则是由俩个地址完全不同的字符串重新拼接成一个新的,那么就会分配一个新的常量池地址给它,所以s5==s3为false。

时间: 2024-10-18 08:39:06

java中字符串的常见问题的相关文章

【转】Java中字符串中子串的查找共有四种方法(indexof())

原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String st

Java中字符串比较时==和equals的区别

==是比较两个字符串引用的地址是否相同,即是否指向同一个对象,而equals方法则比较字符串的内容是否相同. 例如String a = "abc"; String b = "abc"; a == b返回true,a.equals(b)同样返回true,这是为什么呢? 原来程序在运行时有一个字符串池,创建字符串时会先查找池中是否有相应的字符串,如果已经存在的话只需把引用指向它即可,如果没有则新建一个. 上例中创建a时,会在字符串池中首先创建一个"abc&qu

Java中字符串对象

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池. 工作原理 当代码中出现字

java中字符串String 转 int(转)

java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s).intValue(); 这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢? int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=

Java中字符串中子串的查找共有四种方法(indexof())

Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(String str, int startIndex):从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引. 3.int lastIndexOf(String str) :返回在此字符串中最右边出现的指定子字符串的索引. 4.int las

Java中字符串与日期之间的转换

项目过程中,经常遇到需要字符串格式的日期和Date类型的日期之间的相互转换.使用SimpleDateFormat类,可以方便完成想要的转换. SimpleDateFormat能够实现本地化的时间格式化及转换.从选定一个自定义的模式(pattren)开始,模式由已经定义好的 'A' to 'Z' 及 'a' to 'z'字母组成,也可以在模式中引入文本,但要使用’(单括号)括住.下图就是已经定义好的模式字母表: Letter Date or Time Component Presentation

Java中字符串indexof() 的使用方法

Java中字符串中子串的查找共有四种方法(indexof()) indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startindex 是负数,则 startindex 被当作零.如果它比最大的字符位置索引还大,则它被当作最大的可能索引. Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字符串中的索引. 2.int indexOf(Stri

Java中字符串反转

首推方法: public void convertStr(String str){          //将String 对象转换为可改变的StringBuffer类对象          //然后调用StringBuffer类的reverse()方法实现反转          String strReverse=new StringBuffer(str).reverse().toString();          System.out.println(strReverse);       

java中字符串切割的方法总结

StringTokenizer最快 ,基本已经不用了,除非在某些需要效率的场合.Scanner最慢. String和Pattern速度差不多.Pattern稍快些. String和Pattern的split 方法效率相当,常用 public   static   void  main(String [] args){ long  start = System.currentTimeMillis(); for ( int  i= 0 ;i< 100000 ;i++){ test1(); } lon