前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于反编译的搜索

字符串在内存中的情况_.Net编程 - 好工具站长分享平台好工具-站长资讯、经验、工具分享平台首页互联网网站运营站长工具网络编程当前位置: 好工具 >> 网络编程 >> .Net编程字符串在内存中的情况2014/1/21 14:39:21声明:今天偶然在csdn论坛上看到的一篇关于字符串内存中细节分析的帖子里有一条评论,觉得分析理解的比较好。特意copy过来,供自己学习参考,也给大家分享一下。 首先要先了解JVM的内存模型JVM运行时数据区的内存模型由五部分组成:1 方法区2 堆3 JAVA栈4 PC寄存器5 本地方法栈String str = "abc"创建对象的过程1 首先在常量池中查找是否存在内容为"abc"字符串对象2 如果不存在则在常量池中创建"abc",并让str引用该对象3 如果存在则直接让str引用该对象至于"abc"是怎么保存,保存在哪?常量池属于类信息的一部分,而类信息反映到JVM内存模型中是对应存在于JVM内存模型的方法区,也就是说这个类信息中的常量池概念是存在于在方法区中,而方法区是在JVM内存模型中的堆中由JVM来分配的,所以"abc"可以说存在于堆中(而有些资料,为了把方法区的堆区别于JVM的堆,把方法区称为栈)。一般这种情况下,"abc"在编译时就被写入字节码中,所以class被加载时,JVM就为"abc"在常量池中分配内存,所以和静态区差不多。String str = new String("abc")创建实例的过程1 首先在堆中(不是常量池)创建一个指定的对象"abc",并让str引用指向该对象2 在字符串常量池中查看,是否存在内容为"abc"字符串对象3 若存在,则将new出来的字符串对象与字符串常量池中的对象联系起来4 若不存在,则在字符串常量池中创建一个内容为"abc"的字符串对象,并将堆中的对象与之联系起来intern 方法可以返回该字符串在常量池中的对象的引用,可以通过下面代码简单的测试 Java code? 1 2 3 4 5 6 7 class StringTest { public static void main(String[] args) { String str1 = "abc"; String str2 = new String("abc").intern(); System.out.println(str1==str2); } } 所以String str1 = "abc",str1引用的是常量池(方法区)的对象,而String str2 = new String("abc"),str2引用的是堆中的对象,所以内存地址不一样,但是内容一样,所以==为false,而equals是true而String str1 = "abc"; String str2 = "ab" + "c"; str1==str2是ture,是因为String str2 = "ab" + "c"会查找常量池中时候存在内容为"abc"字符串对象,如存在则直接让str2引用该对象,显然String str1 = "abc"的时候,上面说了,会在常量池中创建"abc"对象,所以str1引用该对象,str2也引用该对象,所以str1==str2而String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; str1==str3是false,是因为String str3 = str2 + "c"涉及到变量(不全是常量)的相加,所以会生成新的对象,其内部实现是先new一个StringBuilder,然后append(str2),append("c");然后让str3引用toString()返回的对象。LZ如果想了解更多的细节,可以自己查看反编译的代码,查看反编译代码可以用javap,即javap -c -verbose 要查看的类文件(.class不要)比如上面的代码的示例javac StringTest.java //编译javap -c -verbose StringTest //反编译分享到: QQ空间 新浪微博 腾讯微博 人人网 百度空间 百度搜藏 QQ收藏 百度贴吧上一篇: Template下一篇: Android笔记:Socket.Net编程 一周点击文章【读书笔记之MoreEffectiveC++】程序运ASP.NETMVC3-第02节-添加一个Controller(TomcatServer.xml配置文件正则表达式findmaven.netvsfindjar.com-页面设计是否缺少对Microsoft.CSharp.dll和SystemProAspnetMVC4读书笔记(3)-EssentialLangandroid连接sqlserver数据库实例CAD环境中批量求算DWG面积document.ready和onload的区别——JavaSc.Net编程 一月点击文章HDU2067小兔的棋盘九位名人美到极致的句子。读这样的句子百度,淘宝,腾讯三大巨头HTML页面规范分解Cassandra1.2文档学习(2)——节点间通androidPull-to-refresh动画实现IBATIS动态SQLhduPottedFlower(线段树,求区间的最值)UVa748ExponentiationZTandroid--蓝牙bluetooth(四)OPP文件传输PHP伪造referer突破防盗链.Net编程 最新发布文章(转)Silverlight与JS交互网络抢票黄牛,大部分是骗人的。公布一2013网络优化年终总结try-catch-finally中return的执行情况分析Android笔记:SocketTemplate静态变量、静态函数与普通变量普通函数3D打印:三维智能数字化创造(全彩)MVC4做网站后台:用户管理——WebService的工作原理关于好工具 互联网资讯 Seo .Net编程 网站地图Copyright 2011-2013 HaoGongJu.Net ( 好工具 ) All Rights Reserved