vi设计网站排行榜,重庆网站推广效果,钢结构网站建设,个人微网站怎么做为什么会输出上边的结果呢#xff0c;String x Hello 的方式#xff0c;Java 虚拟机会将其分配到常量池中#xff0c;而常量池中没有重复的元素#xff0c;比如当执行“Hello”时#xff0c;java虚拟机会先在常量池中检索是否已经有“Hello”,如果有那么就将…
为什么会输出上边的结果呢String x Hello 的方式Java 虚拟机会将其分配到常量池中而常量池中没有重复的元素比如当执行“Hello”时java虚拟机会先在常量池中检索是否已经有“Hello”,如果有那么就将“代理”的地址赋给变量如果没有就创建一个然后在赋给变量而 String z new String(“Hello”) 则会被分到堆内存中即使内容一样还是会创建新的对象。 上面程序中的“是判断两个对象引用的地址是否相同也就是判断是否为同一个对象a1与a2 返回为truea1与a3返回则是false。说明a1与a2引用的同一个对象的地址a3则与其它两个引用不是同一个对象地址。 Java为了避免产生大量的String对象设计了一个字符串常量池。工作原理是这样的创建一个字符串时JVM首先为检查字符串常量池中是否有值相等的字符串如果有则不再创建直接返回该字符串的引用地址若没有则创建然后放到字符串常量池中并返回新创建的字符串的引用地址。所以上面a1与a2引用地址相同。 那为什么a3与a1、a2引用的不是同一个字符串地址呢 String a3new String(“代理Hello); JVM首先是在字符串常量池中找Hello” 字符串如果没有创建字符串常量然后放到常量池中若已存在则不需要创建当遇到 new 时还会在内存不是字符串常量池中而是在堆里面上创建一个新的String对象存储Hello并将内存上的String对象引用地址返回所以a3与a1、a2引用的不是同一个字符串地址。内存结构图如下