当前位置: 首页 > news >正文

2017 如何做网站优化安卓手机应用市场

2017 如何做网站优化,安卓手机应用市场,济南网站建设山东酷风,wordpress建站教程凌风目录 一、基本概念1.1 说明1.2 特点 二、存放位置2.1 JDK1.6及以前2.2 JDK1.72.3 JDK1.8及以后 三、工作原理3.1 创建字符串常量3.2 使用new关键字创建字符串 四、intern()方法4.1 作用 五、优点六、字节码分析6.1 示例16.1.1 代码示例6.1.2 字节码6.1.3 解析 6.2 示例26.2.1 代… 目录 一、基本概念1.1 说明1.2 特点 二、存放位置2.1 JDK1.6及以前2.2 JDK1.72.3 JDK1.8及以后 三、工作原理3.1 创建字符串常量3.2 使用new关键字创建字符串 四、intern()方法4.1 作用 五、优点六、字节码分析6.1 示例16.1.1 代码示例6.1.2 字节码6.1.3 解析 6.2 示例26.2.1 代码示例6.2.2 分析jdk8 6.3 示例36.3.1 代码示例6.2.2 分析jdk8 一、基本概念 1.1 说明 1.JVM字符串常量池是Java虚拟机JVM中一个特殊的内存区域。 2.JVM字符串常量池用于存储字符串常量。 3.提高性能和减少内存开销。 4.字符串常量池是JVM用于存储字符串常量的一个内存区域避免了相同字符串的重复创建节省内存空间。 1.2 特点 1.字符串常量池中的字符串对象是不可变的。 2.相同的字符串常量在池中只存储一份通过引用共享。 二、存放位置 2.1 JDK1.6及以前 1.字符串常量池存放在永久代中永久代是非堆内存的一部分用于存储类的元数据、常量、静态变量等。 2.2 JDK1.7 1.字符串常量池从永久代移动到了Java堆中而运行时常量池保留在永久代中。 2.这一变化为了适应永久代内存限制问题并提升性能。 2.3 JDK1.8及以后 1.永久代被移除取而代之的是元空间字符串常量池仍然位于Java堆中。 2.运行时常量池被移动到元空间。 三、工作原理 3.1 创建字符串常量 1.使用双引号创建字符串时(String a “123”; )JVM会首先在字符串常量池中查找是否已存在该字符串。 2.如果存在则直接返回池中该字符串的引用。 3.如果不存在则在常量池中创建该字符串的实例并返回其引用。 3.2 使用new关键字创建字符串 1.使用new关键字创建字符串对象如String str new String(“abc”);时JVM会在堆内存中创建一个新的字符串对象而不管字符串常量池中是否已存在相同的字符串。 2.如果需要可以通过调用intern()方法将新创建的字符串对象放入常量池中。 四、intern()方法 4.1 作用 1.intern()方法是String类的一个本地方法。 2.用于将字符串对象添加到字符串常量池中。 3.如果常量池中已经包含了一个等于此String对象的字符串使用equals(Object)方法确定则返回代表池中这个字符串的String对象的引用。 4.否则将此String对象包含的字符串添加到常量池中并返回此String对象的引用。 五、优点 1.节省内存通过共享相同的字符串常量避免了不必要的重复创建。2.提高性能减少了对象创建和垃圾回收的开销。3.简化字符串比较由于字符串常量池中的字符串是唯一的可以使用操作符来比较字符串的引用从而简化比较操作。 六、字节码分析 6.1 示例1 6.1.1 代码示例 Test public void test(){String str1 new String(hello) new String(world);String str2 helloworld;System.out.println(str1 str2); }6.1.2 字节码 0 new #2 java/lang/StringBuilder3 dup4 invokespecial #3 java/lang/StringBuilder.init : ()V7 new #4 java/lang/String 10 dup 11 ldc #5 hello 13 invokespecial #6 java/lang/String.init : (Ljava/lang/String;)V 16 invokevirtual #7 java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder; 19 new #4 java/lang/String 22 dup 23 ldc #8 world 25 invokespecial #6 java/lang/String.init : (Ljava/lang/String;)V 28 invokevirtual #7 java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder; 31 invokevirtual #9 java/lang/StringBuilder.toString : ()Ljava/lang/String; 34 astore_1 35 ldc #10 helloworld 37 astore_2 38 getstatic #11 java/lang/System.out : Ljava/io/PrintStream; 41 aload_1 42 aload_2 43 if_acmpne 50 (7) 46 iconst_1 47 goto 51 (4) 50 iconst_0 51 invokevirtual #12 java/io/PrintStream.println : (Z)V 54 return6.1.3 解析 1. 0 new #2 java/lang/StringBuilder: 调用StringBuilder的new方法 2. 3 dup复制操作数栈栈顶的一个字通常是对象引用或数据类型值并将这个字重新压入栈顶。 3. 4 invokespecial #3 java/lang/StringBuilder. : ()V执行StringBuilder的初始化方法会消耗操作数栈顶一个字。 4. 7 new #4 java/lang/Stringnew一个String对象对象的引用压入操作数栈。 5. 10 dup复制操作数栈栈顶的一个字通常是对象引用或数据类型值并将这个字重新压入栈顶。 6. 11 ldc #5 加载栈顶的一个字即hello。 7. 13 invokespecial #6 java/lang/String. : (Ljava/lang/String;)V初始化String,消耗一个string对象的引用和复制的字。 8. 16 invokevirtual #7 java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder; : append操作将hello追加进来。 9. 19 new #4 java/lang/String new一个String对象对象的引用压入操作数栈。 10. 22 dup复制操作数栈栈顶的一个字通常是对象引用或数据类型值并将这个字重新压入栈顶。 11. 23 ldc #8 : 加载栈顶的一个字即world。 12. 25 invokespecial #6 java/lang/String. : (Ljava/lang/String;)V初始化String,消耗一个string对象的引用和复制的字。 13. 28 invokevirtual #7 java/lang/StringBuilder.append : (Ljava/lang/String;)Ljava/lang/StringBuilder; append操作将world追加进来。 14. 31 invokevirtual #9 java/lang/StringBuilder.toString : ()Ljava/lang/String; 调用StringBuilder的toString方法 15. StringBuilder的toString方法中是直接new了一个String对象。 16. 而String str2 “helloworld”;是常量池的引用。 17. 因此不是同一个内存地址所以结果是false。 6.2 示例2 6.2.1 代码示例 Testpublic void test(){String str1 new String(hello) new String(world);str1.intern();String str2 helloworld;System.out.println(str1 str2);}6.2.2 分析jdk8 1.str1是直接new了一个对象执行intern()方法后将字符串对象添加到字符串常量池中。 2.String str2 “helloworld”;会先在字符串常量池中找是否有如果有则返回其对象的引用。 3.所以结果是true。 6.3 示例3 6.3.1 代码示例 Testpublic void test(){String str1 new String(helloworld) ;String str2 helloworld;String intern str1.intern();System.out.println(str1 str2);System.out.println(str1 intern);System.out.println(str2 intern);}6.2.2 分析jdk8 1.str1在堆上new了一个string对象。 2.str2是将字面量“helloworld”放入字符串常量池中。 3.str1调用intern方法判断字符串常量池中有没有helloworld,发现有返回了该字符串常量池的引用即str2。 4.此时str1不等于str2。str2和intern是相等的。
http://www.hkea.cn/news/14460877/

相关文章:

  • 网站根目录相对路径怎么做网站 有空间
  • 网站开发的话 dw里面选择啥动漫制作专业有哪些课程
  • 深圳高端保姆公司搜索引擎优化的方法与技巧
  • 网站设计流程电话qq在线登录
  • 广州icp网站测评wordpress 如何汉化
  • 网站icp备案新规建网站方法
  • 玉泉路网站制作cnc是什么意思
  • 上海网站推广珈维电子商务网站规划与管理
  • 老板让做公司网站设计安徽省住房和城乡建设厅官网证件查询
  • 网站关键词重要吗正规手机网站建设平台
  • 全球网站域名后缀江门恒达互联网网站建设
  • 做电商网站外包网业大全
  • 上海高端网站建微信小程序怎么写
  • 平面设计需要什么基础网站关键词优化费用
  • 怎样查询网站空间wordpress页面模版调用分类目录
  • wordpress图像缩放插件门户网站如何做seo
  • 做网站的策划方案wordpress搬家后图片不显示
  • 建站空间网站空间单位
  • 手机网站图片滑动360搜索联盟网站制作
  • 北京php培训网站建设根据域名查询网站名称
  • 网站建设公司利润怎么样店面logo设计制作
  • 新乡移动网站建设网站admin密码
  • 企业网站的结构以及内容.平台公司拿地
  • 做网站文字编辑好不好googleapis wordpress
  • 吴江建设局网站贵阳市 网站建设
  • 公司网站制作的教程郑州网站优化公司排名
  • 中国新闻社海外中心佛山seo优化外包
  • 网站的内链优化策略企业形象设计论文
  • 网站换域名图片这么设置网站在百度搜索不到
  • pyton 网站开发山西太原发现4例阳性