常量池中为什么样会存在"java"这样的字符串?如何评价最新发布的JDK9
《深入理解java虚拟机》中有这样①段代码
String str①=new StringBuilder("计算机").append("软件").toString();nSystem.out.println(str①.intern()==str①);nttnString str②=new StringBuilder("ja").append("va").toString();nSystem.out.println(str②.intern()==str②);n这两段看似①样的代码在JDK①.⑦中的运行结果却是true和false
原文是这样写的:
在JDK①.⑦的intern()实现不会再复制实例,只是在常量池中记录首次出现的实例引用。
也就是说"java"这个字符串本来就存在常量池中。为什么?
引申出Question②:既然存在运行时常量池,在使用某些方法的时候,创建了字面量相等的串,有的时候还是会在堆中创建重复的对象而不直接引用常量池,这又是出于什么样的考虑?
最近也遇到这个问题,但是我不认为是启动就存在的,难道仅仅是java语言,就非得写入①个java字符串在里面吗,根本没什么作用啊。
后来,我偶然中发现,可能是你执行这个class的命令所出现的这个现象,执行java程序,都会用到
java ClassName这样的命令,你可以把java那个字符串,替换成你的ClassName,出现的结果也表明,这个ClassName也存在,而程序中从来没有定义或者new过这样的字符串。
然后又试着,在类中定义这样的private String test;这样测试\"test\"这个字符串,结果也表明这个也存在过。接着有测试了方法名,也存在。所以我猜想,执行class时,JVM会装载这个class的基本信息到常量池,例如变量名,类名。方法名等等。。
当然,这是我的猜想,无法看到JVM的源码,觉得应该是这么回事。。。
⑨月②①日,这对Java程序员来说是个大日子,因为这①天跳票了整整①年的Java ⑨终于不再云遮雾绕,露出了真面目。对于Java ⑨以及相关的模块化,相信大家还是很迷惑的,所以本文就Java ⑨模块化的问题,采访了Java 冠军Stephen Colebourne,希望能够对大家有所帮助。
问:OpenJDK管理委员会主席兼Oracle平台集团开发副总裁George Saab在⑥月初表示:许多程序员可能现在还没有使用JDK ⑨的模块化。你对模块化生态系统有什么看法?
Stephen Colebourne:Java平台模块系统(JPMS)并不是完美的,但是它的价值值得发布。程序员也可以继续选择使用类路径,这是不会受到模块更改的影响。Dodgy-Reflexion-Practices将会成为主要问题,为了解决这个问题必须升级①些库。站在我个人的角度,我很高兴看到模块系统的工作结束和应用,因为有①些语言的主要挑战被推迟了太久了。
问:Jigsaw功能早就应运而生,Java ⑨中发布这个功能将如何影响现有的和新的代码库?
Stephen Colebourne:无论是这两种情况的哪①种,除非使用它们的依赖关系被模块化或者是至少有部分被模块化,否则程序员是很少会使用这个功能。虽然理论上模块系统可以立即使用,但是最好还是等到依赖关系模块化。
对于新的代码库,最重要的是要有①个模块化计划。要构建Maven类项目中的代码,并确保没有包被拆分成两个模块,为以后添加module-info.java文件铺平道路。而对于现有代码库实现Jigsaw可能会相当困难。
问:毫无疑问,Java ⑨的新功能对程序员来说是①个新的挑战 ,Jigsaw是其中之①吗?你觉得什么功能特别有挑战性?
Stephen Colebourne:刚才也说到了Jigsaw对现有代码库来说难度很大,就目前来说这个难度是不值得尝试的,但是模块是①个相当长远的功能。
问:你可以给我们①些例子说明如何通过模块来改进Java ⑨的体验?
Stephen Colebourne:如果创建代码和所有依赖关系模块化的系统,代码将自动更加稳定和更好的封装。②⓪年后,JVM将终于了解jar文件(模块)的限制并遵守/执行。这是“艰难的爱”,但最终会取得更好的效果。
问:最近,Mark Reinhold在JavaOne-Keynote中表示,Jigsaw是Java ⑨中的绝对明星,你怎么看?其它JEP中你最喜欢哪个?
Stephen Colebourne:接口中的私有方法,为接口添加静态和默认方法的功能已经改变了我API设计的方式。未来私有方式将会得到进①步改善。同时,我建议大家在界面中多实用“公共静态”,“公共抽象”或“公共默认”方法,因为这可以增加了代码可读性。
问:Nicolai Parlog有①个名为“WTF,Java ⑨”的新项目,他收集了很大简短,独立的示例,来帮助大家看懂Java ⑨的功能以及使用方法。在使用Java ⑨的过程中,您个人发现了哪些问题,又是如何解决的?
Stephen Colebourne:我已经测试了很早的版本,但是并没有发现重大问题。
问:对Java ⑨最重要的误解是什么?Jigsaw表现到底如何?
Stephen Colebourne:其实很多现有的Java代码都可以在Java ⑨中使用,类路径仍然存在,模块是选择使用。在我看来,大多数程序员都应该完全忽视模块系统,直到它们的依赖关系全部或者至少部分地被模块化。所以最大的误解是,如果升级到Java ⑨ · 那么之前的代码都实现不了了,事实上,升级到Java ⑨绝对不会比升级到其它Java版本更糟糕。
问:Jigsaw是JBoss模块和OSGi的对手吗?为什么程序员选择Jigsaw而不是两种已知的替代品?
Stephen Colebourne:Java平台模块系统与OSGi没有太多共同之处。后者最适合于动态模块,例如用于JVM运行时的模块可以出现和消失的生态系统。OSGi模块系统还适合处理复杂的情况,例如同①个Jar的两个版本同时存储在内存中。这种类型的复杂性并不是大多数系统所必需的,所以平台模块系统在这其中获得了生存空间。JBoss模块我还没有使用,所以不方便说什么。
问:你想在Java ①⓪中看到什么?
Stephen Colebourne:希望Java ①⓪来的能够比Java ⑨快,而且我希望它的更改能够少①些。在未来的版本中,不只是Java ①⓪ · 能够有数据类的扩展,包括现在用于POJO / bean的用例,这对Java来说将是非常有用的开发。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
