String内存地址划分:重要
-
物理的内存是线性结构,并不存在拥有不同功能的不同区域;
-
-
Java中,内存可以分为栈,堆,静态域和常量池等;
-
-
不同内存区域的功能和特点:
-
栈:
-
存放局部变量(变量名,对象的引用等);
-
特点:内存随着函数的调用而开辟,随着函数调用结束而释放;
-
-
堆:
-
存放对象(也就是new出来的东西);
-
特点:可以跨函数使用,每个对象有自己对应的存储空间;
-
-
静态域:
-
存放在对象中用static定义的静态成员;
-
-
常量池:
-
存放常量;
-
常量池:指的是在编译期被确定,并被保持在已编译的.class文件中的一些数据;
-
-
-
定义String方法:
String str1="hello";
String str2=new String("hello");
/**
第一种方式:
引用str1被存放在栈区,字符串常量"hello"被存放在常量池;
引用str1指向了常量池种的"hello";
str1中存放了常量池中"hello"的地址;
第二种方式:
引用str2被存放在栈区,同时在堆区开辟一块内存用于存放一个新的String类型对象;
str2指向了堆区新开辟的String类型的对象;
*/
-
这两种方式的区别:
/**
第一种:
常量池的字符串常量不能重复出现,也就是说在定义多个常量时,编译器先去常量池查找该常量是否已经存在;
如果不存在,则在常量池创建一个新的字符串类型;
如果存在,那么新创建的String类型引用指向常量池中已经存在的值相同的字符串常量;
(也就是说,不会在常量池新开辟内存)
String str1="hello";//str1存放的是"hello"的内存地址(所以内存地址都是一样的)
String str2="hello";//str2存放的是"hello"的内存地址(所以内存地址都是一样的)
第二种:
在堆中创建新的内存空间,不考虑String类型对象的值是否已经存在;也就是说,不管它的值是多少;
第二种方法的操作已经会产生新的结果:
在堆中开辟一块新的内存,用来存放新定义的String类型的对象;
String str1=new String("hello");
String str2=new String("hello");
*/
-
测试代码:必会
public class Person {
public static void main(String[] args) {
String str1="hello";
String str2="hello";
System.out.println(str1==str2);//true
System.out.println(str1.equals(str2));//true
String str3=new String("hello");
String str4=new String("hello");
System.out.println(str3==str4);//false
//String对象重写了equals方法,比较的是value值
System.out.println(str3.equals(str4));//true
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)