今天有朋友问java中String[] str = s.split(",")的内存分析,于是开始查资料并测试。首先,发现在java的内存管理中“常量池”是个很奇怪的东西,很多人不清楚(当然我也不清楚),经查资料总结如下:
栈(Stack) :存放基本类型的变量数据和对象的引用。
堆(heap):
存放所有new出来的对象。
常量池(constant pool):在堆中分配出来的一块存储区域,存放储显式的String常量。另外,可以存储不经常改变的东西
(public static final)。常量池中的数据可以共享。
然后再来分析下,String[] str = s.split(",");split会产生几个对象,存储在哪?
测试代码如下:
String s = "aa,aa";
String[] str = s.split(",");
if (str[0] == str[1]) {
System.out.println("str[0]==str[1]");
} else {
System.out.println("str[0]!=str[1]");
}
String[] str = s.split(",");
if (str[0] == str[1]) {
System.out.println("str[0]==str[1]");
} else {
System.out.println("str[0]!=str[1]");
}
输出结果:
str[0]!=str[1]
可见,s.split(",");执行的是new String();方法,所以一个split片段会创建两个对象(如果常量池中没有的话):常量池中1个,堆中1个。
本文详细解析了Java中String类的split()方法在执行时的内存使用情况,包括对象创建过程及存储位置,揭示了split操作如何影响内存中的常量池和堆区。
1383

被折叠的 条评论
为什么被折叠?



