`
ynp
  • 浏览: 439353 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

再一次理解String

阅读更多
偶然看到了篇关于String的文章,发现以前学的都忘了 ,所以写篇文章加深印象,可能有不对的地方,敬请指正.
public class StringTest {   
	public static void main(String[] args){    
		String s1 = "hello";   
		String s2 = new String("hello");   
		String s3 = new String("hello");   
		testString(s1,s2,s3); 
		//此时内存 情况见图一
		s2 = s2.intern();   
		//此时内存 情况见图二
		System.out.println("after s2.intern");   
		testString(s1,s2,s3);    
		  
	}   
	private static void testString(String s1,String s2,String s3){   
		System.out.println("s1 = s2 is "+(s1==s2));   
		System.out.println("s2 = s3 is "+(s2==s3));   
		System.out.println("s1.equals(s2) is "+s1.equals(s2));   
		System.out.println("s2.equals(s3) is "+s2.equals(s3));   
	}   
} 

输出结果为 
s1 = s2 is false 
s2 = s3 is false 
s1.equals(s2) is true 
s2.equals(s3) is true 
after s2.intern 
s1 = s2 is true 
s2 = s3 is false 
s1.equals(s2) is true 
s2.equals(s3) is true 


知识点一 String对象创建过程:
       语句一:String s1 = "hello";  
       语句二:String s2 = new String("hello");
       语句三:String s3 = new String("hello");
       语句一是创建前首先在Spring pool中查找hello对象,有则引用,没有现在String pool中创建,再引用此对象;
       语句二是在堆中创建hello对象,所以System.out.println("s2 = s3 is "+(s2==s3))//结果为false;
    此时内存见图一;
知识点二 intern()方法的作用:
        语句三:s2 = s2.intern();
       当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;
    此时内存见图二;
  • 大小: 31.6 KB
分享到:
评论

相关推荐

    .NET再谈String

    这就是为什么在示例代码中`s1`和`s2`的引用在第一次比较时相等,而在第二次比较时不同。 【字符串驻留的深入】当创建一个新的字符串时,CLR会检查字符串驻留池,如果池中已经存在相同内容的字符串,那么新字符串就...

    比较两个string(不区分大小写)

    此外,当比较的字符串较长时,可以考虑分块处理,减少一次性转换整个字符串的负担。 总的来说,不区分大小写的字符串比较是编程中常见的需求,不同的编程语言提供了不同的解决途径。理解和掌握这些方法有助于我们在...

    java的String用法类型总结

    - 说明:在使用`Scanner`类读取不同类型的输入(例如先读取整数再读取字符串)时,需要注意每次调用`nextInt()`会消耗掉输入中的空格或换行符,导致下一次调用`nextLine()`无法正确读取数据。解决方法是重新创建`...

    string源代码.pdf

    strstr函数用于查找一个字符串在另一个字符串中第一次出现的位置。如果找到,则返回第一次出现位置的指针;如果没有找到,则返回NULL指针。该函数的实现较为复杂,需要嵌套循环进行匹配,如果当前字符匹配成功,再...

    String和StringBuffer 的区别 .txt

    在这种情况下,每执行一次`tmp += x`都会创建一个新的`String`对象,导致大量的内存分配和垃圾回收开销。而如果使用`StringBuffer`,则可以在原有的对象上进行修改,避免了频繁创建新对象的开销。 综上所述,选择...

    Delete-String.rar_c string_删除字符

    此外,为了提高效率和避免不必要的内存操作,可以考虑使用“计数法”,先遍历一次字符串统计要删除字符的数量,然后再创建一个新的字符串,只复制需要保留的字符。这种方法适用于要删除的字符较少且分布较分散的情况...

    xe5 android Escape UnicodeString to String

    在这个Kotlin版本的函数中,`run`函数用于提供一个作用域,`replace`函数处理了两次替换操作,最终使用`toInt(16)`将十六进制字符串转换为整数,然后通过`%c`格式化代码将其转换为对应的字符。 需要注意的是,上述...

    C++string类的应用

    - `rfind(substr)`:查找子串最后一次出现的位置。 - `compare(str)`:比较两个字符串,返回0表示相等,正数表示当前字符串大于,负数表示小于。 6. **拷贝和复制**: - `substr(pos, length)`:返回从指定位置...

    StringManipulation-9.9.0

    "StringManipulation-9.9.0"可能是一个专门用于处理字符串的库或工具包,其版本号9.9.0表示这是一个经过多次迭代和优化的成熟版本。"idea"标签则暗示这可能与IntelliJ IDEA,一个广泛使用的Java开发集成环境有关。 ...

    String Algorithm

    举一个简单的例子:如果T=AGCATGCTGCAGTCATGCTTAGGCTA,P=GCT,那么P在T中出现了三次。一个简单的匹配算法需要O(mn)时间复杂度,但存在更高效的算法。 哈希表(HashTable)是解决字符串匹配问题的一种方法。它通过...

    前端开源库-streamify-string

    它提供了一种将字符串转化为可读流(Readable Stream)的方法,允许开发者分块处理字符串,从而避免一次性加载整个字符串到内存中可能导致的性能问题。 **流的概念** 在Node.js和许多现代JavaScript环境中,流是一...

    double转换成string型.pdf

    `find()`用于查找子字符串或字符在字符串中第一次出现的位置。`string::npos`是一个特殊的常量,表示字符串中未找到指定字符或子字符串时的返回值。 `swap()`方法用于交换两个字符串对象的内容。文档中使用了`swap...

    Java中的String为什么是不可变的共7页.pdf.z

    `String`的不可变性确保了哈希码计算只需执行一次,提高了效率。此外,不可变对象也常用于常量定义,因为它们的值永远不会改变。 7. **安全编码**:在处理敏感信息(如密码)时,不可变性确保了原始数据不会被修改...

    有关Java String常用方法的总结.docx

    - **lastIndexOf()**:查找指定字符或子字符串最后一次出现的位置。 - **contains()**:判断字符串中是否包含指定子字符串。 示例代码: ```java String str = "Hello World"; System.out.println(str.indexOf("o")...

    JavaScript程序设计课件:String对象.pptx

    `indexOf(searchValue)`和`lastIndexOf(searchValue)`分别用于查找`searchValue`在字符串中第一次出现和最后一次出现的位置。例如,`myString.indexOf("World")`返回5,`myString.lastIndexOf("World")`也返回5,...

    C语言库文件(mallc、string等)

    此外,还有`calloc()`用于一次性初始化所有分配的内存为0,以及`realloc()`用于调整已分配内存的大小。 接下来是`stdio.h`库,这是C语言的标准输入输出库。`stdio`库包含了处理文件和标准输入输出流(如键盘和屏幕...

    Java初学者都必须理解的问题.doc

    // 输出true,因为字符串字面量在常量池中只创建一次 ``` 总结来说,理解Java中String对象的声明、"=="与equals()的区别以及String与StringBuffer的使用场景,对于提升编程效率和优化代码质量具有重要意义。在实际...

    浅谈stringstream 的.str()正确用法和清空操作

    这种方法确保了stringstream的内容被完全清空,为下一次使用做好准备。 在实际编程中,stringstream经常被用来处理字符串到其他数据类型的转换,或者将多个数据类型合并成一个字符串。例如,你可以轻松地将一个整数...

    超长正整数相加(string逆序逐位相加再反转)1

    这个算法的时间复杂度为O(n),其中n是两个输入字符串中较长者的长度,因为它只遍历了一次字符串。空间复杂度也为O(n),因为创建了一个新的字符串`res`来存储结果。 总的来说,这个问题涉及到字符串操作、整数表示、...

Global site tag (gtag.js) - Google Analytics