偶然看到了篇关于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
分享到:
相关推荐
这就是为什么在示例代码中`s1`和`s2`的引用在第一次比较时相等,而在第二次比较时不同。 【字符串驻留的深入】当创建一个新的字符串时,CLR会检查字符串驻留池,如果池中已经存在相同内容的字符串,那么新字符串就...
此外,当比较的字符串较长时,可以考虑分块处理,减少一次性转换整个字符串的负担。 总的来说,不区分大小写的字符串比较是编程中常见的需求,不同的编程语言提供了不同的解决途径。理解和掌握这些方法有助于我们在...
- 说明:在使用`Scanner`类读取不同类型的输入(例如先读取整数再读取字符串)时,需要注意每次调用`nextInt()`会消耗掉输入中的空格或换行符,导致下一次调用`nextLine()`无法正确读取数据。解决方法是重新创建`...
strstr函数用于查找一个字符串在另一个字符串中第一次出现的位置。如果找到,则返回第一次出现位置的指针;如果没有找到,则返回NULL指针。该函数的实现较为复杂,需要嵌套循环进行匹配,如果当前字符匹配成功,再...
在这种情况下,每执行一次`tmp += x`都会创建一个新的`String`对象,导致大量的内存分配和垃圾回收开销。而如果使用`StringBuffer`,则可以在原有的对象上进行修改,避免了频繁创建新对象的开销。 综上所述,选择...
此外,为了提高效率和避免不必要的内存操作,可以考虑使用“计数法”,先遍历一次字符串统计要删除字符的数量,然后再创建一个新的字符串,只复制需要保留的字符。这种方法适用于要删除的字符较少且分布较分散的情况...
在这个Kotlin版本的函数中,`run`函数用于提供一个作用域,`replace`函数处理了两次替换操作,最终使用`toInt(16)`将十六进制字符串转换为整数,然后通过`%c`格式化代码将其转换为对应的字符。 需要注意的是,上述...
- `rfind(substr)`:查找子串最后一次出现的位置。 - `compare(str)`:比较两个字符串,返回0表示相等,正数表示当前字符串大于,负数表示小于。 6. **拷贝和复制**: - `substr(pos, length)`:返回从指定位置...
"StringManipulation-9.9.0"可能是一个专门用于处理字符串的库或工具包,其版本号9.9.0表示这是一个经过多次迭代和优化的成熟版本。"idea"标签则暗示这可能与IntelliJ IDEA,一个广泛使用的Java开发集成环境有关。 ...
举一个简单的例子:如果T=AGCATGCTGCAGTCATGCTTAGGCTA,P=GCT,那么P在T中出现了三次。一个简单的匹配算法需要O(mn)时间复杂度,但存在更高效的算法。 哈希表(HashTable)是解决字符串匹配问题的一种方法。它通过...
它提供了一种将字符串转化为可读流(Readable Stream)的方法,允许开发者分块处理字符串,从而避免一次性加载整个字符串到内存中可能导致的性能问题。 **流的概念** 在Node.js和许多现代JavaScript环境中,流是一...
`find()`用于查找子字符串或字符在字符串中第一次出现的位置。`string::npos`是一个特殊的常量,表示字符串中未找到指定字符或子字符串时的返回值。 `swap()`方法用于交换两个字符串对象的内容。文档中使用了`swap...
`String`的不可变性确保了哈希码计算只需执行一次,提高了效率。此外,不可变对象也常用于常量定义,因为它们的值永远不会改变。 7. **安全编码**:在处理敏感信息(如密码)时,不可变性确保了原始数据不会被修改...
- **lastIndexOf()**:查找指定字符或子字符串最后一次出现的位置。 - **contains()**:判断字符串中是否包含指定子字符串。 示例代码: ```java String str = "Hello World"; System.out.println(str.indexOf("o")...
`indexOf(searchValue)`和`lastIndexOf(searchValue)`分别用于查找`searchValue`在字符串中第一次出现和最后一次出现的位置。例如,`myString.indexOf("World")`返回5,`myString.lastIndexOf("World")`也返回5,...
此外,还有`calloc()`用于一次性初始化所有分配的内存为0,以及`realloc()`用于调整已分配内存的大小。 接下来是`stdio.h`库,这是C语言的标准输入输出库。`stdio`库包含了处理文件和标准输入输出流(如键盘和屏幕...
// 输出true,因为字符串字面量在常量池中只创建一次 ``` 总结来说,理解Java中String对象的声明、"=="与equals()的区别以及String与StringBuffer的使用场景,对于提升编程效率和优化代码质量具有重要意义。在实际...
这种方法确保了stringstream的内容被完全清空,为下一次使用做好准备。 在实际编程中,stringstream经常被用来处理字符串到其他数据类型的转换,或者将多个数据类型合并成一个字符串。例如,你可以轻松地将一个整数...
这个算法的时间复杂度为O(n),其中n是两个输入字符串中较长者的长度,因为它只遍历了一次字符串。空间复杂度也为O(n),因为创建了一个新的字符串`res`来存储结果。 总的来说,这个问题涉及到字符串操作、整数表示、...