Java中String问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中String问题相关的知识,希望对你有一定的参考价值。

String i=new String();
i="Hello";
String k="Hello";
System.out.println(i==k); //结果为true
为什么? 按说地址应该不是一样的啊
String i=new String("Hello");
String k="Hello";
System.out.println(i==k); //结果为false
为什么这样结果就为false了?

你可以百度下 String 串池的概念,
我只是给你简单说下吧
①String i = new String(); ② i="hello" ;③ String k = "hello" ;

① : 创建了一个对象 new String() ,并将该对象赋值给 i , i 不是对象,而是引用!(必须理解)
②: 从串池中创建一个对象“hello” 并将该对象赋值给 i , 此时 i 指向 “hello” 所在的地址,而不是 new String() 所在的地址
③: 因为串池中已经存在 hello对象, 所以 直接把该对象 赋值给 k , 此时k指向 hello所在的地址
System.out.println(i==k); 除基本类型外, 通过 == 来比较,为比较地址,而根据上述分析,两者地址相同,所以返回true

=================================================================

①String i=new String("Hello"); ②String k="Hello"; System.out.println(i==k); //结果为false

①:创建的两个对象 ,一个是 存在串池中的 Hello 对象 , 一个是存在在堆空间中的 new String("Hello") 对象 , 并将堆空间中的对象赋值给 引用 i
②: 因为串池中已经存在对象Hello , 所以该语句没有创建对象,而是把已经存在的对象Hello赋值给引用 k , 从而 k的地址指向 串池中的对象
同理: == 比较地址, 2者地址很明显不相同, 前者在堆空间存放, 后者在 串池中存放

=====================================================================
推荐简单看下串池的概念,和为什么要引入串池 来处理String
参考技术A 首先说下,java是引用,引用某个对象。
第一次输出:
i引用的是“Hello”这个对象,假如叫做“张三”
k引用的也是这个“Hello”,这个“Hello”就是刚刚那个,所以这个也是“张三”
所以i和k的引用是相同的,所以为true;
第二次输出:
i是new的一个对象,虽然内容也是Hello,就像世界上又有个“张三”,只是同名而已,但不是一个人。
k还是刚刚上面那个“张三”
i引用的是一个人,k引用的是另一个人,只是名字相同,但是引用的对象是不同的,这样的比方恰当吗?希望能帮到你
参考技术B 兄弟,看看堆和栈,你就能知道了

好程序员Java教程分享Java中String类型的10个问题

好程序员Java教程分享Java中String类型的10个问题

  1. 如何比较两个字符串?用“=”还是equals
    简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等。只要你想检测俩字符串是不是相等的,你就必须得用equals()方法。

如果你知道“字符串保留(string intern)”的概念那就更好了。

  1. 为什么安全敏感的字符串信息用char[]会比String对象更好?
    String对象是不可变的就意味着直到垃圾回收器过来清扫之前它们都不会发生变化的。用数组的话,就可以很明确的修改它任何位置的字符元素。这样的话,如密码等安全敏感的信息就不会出现在系统的任何地方。

  2. 字符串对象能否用在switch表达式中?
    从JDK7开始的话,我们就可以在switch条件表达式中使用字符串了,也就是说7之前的版本是不可以的。

1<span class="hljs-comment" style="color: rgb(153, 153, 136);">// java 7 only!</span>
2<span class="hljs-keyword" style="font-weight: bold;">switch</span> (str.toLowerCase()) {
3 <span class="hljs-keyword" style="font-weight: bold;">case</span> <spanclass="hljs-string" style="color: rgb(221, 17, 68);">"a"</span>:
4 <span class="hljs-keyword" style="font-weight: bold;">value</span> = <spanclass="hljs-number" style="color: rgb(0, 128, 128);">1</span>;
5 <span class="hljs-keyword" style="font-weight: bold;">break</span>;
6 <span class="hljs-keyword" style="font-weight: bold;">case</span> <spanclass="hljs-string" style="color: rgb(221, 17, 68);">"b"</span>:
7 <span class="hljs-keyword" style="font-weight: bold;">value</span> = <spanclass="hljs-number" style="color: rgb(0, 128, 128);">2</span>;
8 <span class="hljs-keyword" style="font-weight: bold;">break</span>;
9}

  1. 如何将字符串转换为整型数值?
    1<span class="hljs-keyword" style="font-weight: bold;">int</span> n = Integer.parseInt(<span class="hljs-string" style="color: rgb(221, 17, 68);">"10"</span>);

如此简单,经常使用有偶尔也会被遗忘。

  1. 如何用空格去分隔字符串?
    我们可以很便捷的使用正则表达式来进行分隔。“s”就表示空格,还有如””,” ”,” ”,” ”.

1<span class="hljs-type" style="color: rgb(68, 85, 136); font-weight: bold;">String</span>[] strArray = aString.<span class="hljs-built_in"style="color: rgb(0, 134, 179);">split</span>(<span class="hljs-string"style="color: rgb(221, 17, 68);">"s+"</span>);

  1. substring()方法具体是都干了些啥?
    在JDK6中,这个方法只会在标识现有字符串的字符数组上 给一个窗口来表示结果字符串,但是不会创建一个新的字符串对象。如果需要创建个新字符串对象,可以这样在结果后面+一个空的字符串:

1str.substring(m, n) + <span class="hljs-string" style="color: rgb(221, 17, 68);">""</span>

这么写的话就会创建一个新的字符数组来表示结果字符串。同时,这么写也有一定的几率让你的代码跑的更快,因为垃圾回收器会吧没有在使用的大字符串回收而留下子字符串。

Oracle JDK7中的substring()方法会创建一个新的字符数组,而不用之前存在的。看看这张图就会明白substring()方法在JDK6和JDK7中的区别。

  1. String&StringBuilder&StringBuffer
    String vs StringBuilder:StringBuilder是可变的,这就意味你在创建对象之后还可以去修改它的值。StringBuilder vs StringBuffer:StringBuffer是同步的,意味着它是线程安全的,但是就会比StringBuilder慢些。

  2. 如何快速重复构造一段字符串?
    在Python编程中,只需要用字符串去乘以一个数字就可以 搞定了,那在Java编程中,我们可以使用来自Apache Commons Lang包中的StringUtils类的repeat()方法。

1<span class="hljs-built_in" style="color: rgb(0, 134, 179);">String</span> str = <span class="hljs-string" style="color: rgb(221, 17, 68);">"abcd"</span>;
2<span class="hljs-built_in" style="color: rgb(0, 134, 179);">String</span> repeated = StringUtils.repeat(str,<span class="hljs-number" style="color: rgb(0, 128, 128);">3</span>);
3<span class="hljs-comment" style="color: rgb(153, 153, 136);">//abcdabcdabcd</span>

  1. 如何将时间格式的字符串转换成date对象?
    1<span class="hljs-built_in" style="color: rgb(0, 134, 179);">String</span> str = <span class="hljs-string" style="color: rgb(221, 17, 68);">"Sep 17, 2013"</span>;
    2<span class="hljs-built_in" style="color: rgb(0, 134, 179);">Date</span> date = <span class="hljs-keyword" style="font-weight: bold;">new</span> SimpleDateFormat(<span class="hljs-string" style="color: rgb(221, 17, 68);">"MMMM d, yy"</span>, Locale.ENGLISH).parse(str);
    3System.out.println(date);
    4<span class="hljs-comment" style="color: rgb(153, 153, 136);">//Tue Sep 17 00:00:00 EDT 2013</span>

  2. 如何计数一个字符在某个字符串中出现的次数?
    使用Apache Commons Lang包中的 StringUtils类就可以完成这个工作。

1<span class="hljs-keyword" style="font-weight: bold;">int</span> n = StringUtils.countMatches(<span class="hljs-string" style="color: rgb(221, 17, 68);">"11112222"</span>, <span class="hljs-string" style="color: rgb(221, 17, 68);">"1"</span>);
2System.out.printl<span class="hljs-string" style="color: rgb(221, 17, 68);">`&lt;/span&gt;&lt;span class="hljs-string" style="color: rgb(221, 17, 68);"&gt; n(n);</span>

以上是关于Java中String问题的主要内容,如果未能解决你的问题,请参考以下文章

java里移除string里字母的问题

关于java中String.getBytes()问题

转:Java中String与byte[]的转换

java String 内存地址问题?如何获取 String 内存地址!

Java,如果 List 中修剪的 String 包含 String 则返回

Java中String直接赋字符串和new String的一些问题