JAVA基础:字符串常量池
我记得我在大三的一次web网页课程设计中,自己使用了JSP技术进行web页面设计和搭建,在开发过程中遇到过一个关于JAVA中String的一个小问题,就类似与下图的一个问题。
当时遇到的问题就是对两个String变量的值进行比较的时候,使用双等号比较时,str1与str2会出现false的判断结果,后来在csdn上找到了其他大佬的解析,算是一知半解吧,今天在重温JAVA基础的时候,才真正理解了这个问题的关键所在。
解答这个问题,就要涉及到JAVA中的一个知识点—字符串常量池,如下图。
解读一下这张图片:
首先,当我们使用String str1=“hello"这样的方式进行变量声明的时候,其实做的是这么一个动作:先去查看常量池中是否有一个名为“hello”的常量,如果有,那么就把这个常量赋给str1,如果没有,就先创建一个“hello”,然后再给str1使用。那如果使用String str2=new String(“hello”)这样的方式进行变量声明,那做的动作其实是这样:首先现在栈里面放入str2的声明,然后在堆里找是否存在一个名为"hello"的实例,如果有,那么直接使用,如果没有,那么先去常量池中找,如果常量池中有,那么就放入堆中供str2使用,如果没有,就照上面说的那样,现在常量池中创建一个"hello”,然后再拿到堆里面使用。其实到这答案就很明显了。对于第一张图的str1和str2而言,两个指向的"hello"其实处于不同的地方,一个在常量池,一个在堆里面,所以就false。其实使用"==“进行判断的时候,其实判断的是地址,而不是值,所以这里就爆false,第一张图的str2和str3则是两个不同的实例,所以地址就肯定不同,那么就是false咯。当然,equals就是比较的值啦,都是"hello”,那么就是true。
本科学JAVA的时候,一直拿着C++的一些思想去理解JAVA,所以当时JAVA基础就学的特别烂,现在回头看看这些知识其实不难,但是就是需要自己花时间补,趁着研究生还没开学,还没被导师提前叫过去,恶补一下JAVA基础吧。都是泪。。