总览

一个常见的问题是一段代码创建多少个对象或多少个字符串。 答案通常不是您的想法,也不是您真正需要知道的。 了解何时创建对象是很有用的,但是有很多其他因素通常要考虑的重要得多,这可能意味着应用程序总数不是您所想的。

字符串不是一个单一的对象

字符串包装char []。 这意味着当您看到新的String时,可能还会涉及到新的char []。 如果您对String做+,则可以使用StringBuilder(来自Java 5.0),它也可以包装char []。 这意味着通常在Java中创建的char []比String对象更多。 有时char []是JVM中最常见的对象类型。

字符串文字仍然是字符串

一个常见的误解是String文字不计算在内。 在至少运行一次代码之后,它们不会添加到总数中,但是大多数情况下,问题是关于一次运行的代码。 即字符串文字仍然计数。

另一个常见的误解是字符串文字被加载时。 在Java 6及更早版本中,它们是在加载Class时加载的,但是现在(Java 7+)在首次使用时已加载。 这意味着首次出现String文字的一段代码将创建新的String对象。

JVM使用字符串,其中很多。

JVM使用Java代码,并且使用字符串。 用于加载您的类的ClassLoader使用字符串。 您要加载的类的名称是一个String,所有系统属性和创建的所有环境变量都是如此,以便您可以运行您的程序,它们都是String,包括值和键名。

让我们考虑一个Hello World程序,并查看创建了多少个String,以便此程序可以运行。 是0、1还是2个字符串,看看是否可以猜测实际创建了多少个字符串。

public class HowManyStrings {public static void main(String[] args) throws IOException {System.out.println("Hello world");System.in.read();}
}

该程序在System.in.read()上停止; 让我把堆放了。 假设没有GC,实用程序jmap可以给出当前堆上对象数量的直方图计数,这将是创建的数量。

如您所见,字符串的数目为2490。如果我还有更多的环境变量或Java的其他更新,则数字将有所不同。

简而言之,如果您在代码中争论2到5个String,则可以看到,当代码运行一次时,您可能会丢失大多数String。

但是,如果我多次调用代码怎么办?

如果您正在谈论数百万次,这很可能很重要,但这就是问题。 JVM将优化多次调用的代码,并且它可以做两件事。

消除死代码

JIT检测到的代码不会做任何有用的事情,可以将其删除。 JIT非常擅长此操作,很可能您正在查看的示例也没有做任何有用的事情。 但是,在现实世界的代码中,希望它可以做一些有用的事情,这是下一个优化有用的地方。

转义分析

JIT可以查看一个方法(或内联调用的所有方法后该方法的外观),并查看对象是否转义了该方法。 如果它不能逃脱该方法,则可以将其放在堆栈上,或者有效地将其字段解包到堆栈上。 这意味着不会在堆上创建任何对象,并且实际上甚至不必创建对象标头,它是所有字段,可能不需要创建任何字段。 简而言之,仅仅因为您在代码中看到了新的String并不意味着JIT必须实际创建一个对象,只要它对结果没有影响(除非您在计算创建的对象的数量)

结论

即使是很小的应用程序创建的字符串数量也可能远远超过您想像的用途,但是调用了足够的次数,您可能会发现方法根本不再创建任何对象。

2015-10-07

彼得·劳瑞

翻译自: https://www.javacodegeeks.com/2015/10/common-misconception-how-many-objects-does-this-create.html

常见的误解:这会创建多少个对象?相关推荐

  1. 对人工智能常见的误解有哪些_关于AI的道德和偏见的4种误解

    对人工智能常见的误解有哪些 在8月的PyBay 2019上,我将继续我在PyBay 2018上开始的关于道德在我们正在发展的人工智能(AI)中的重要性的对话,尤其是随着道德在我们的日常生活中越来越受到 ...

  2. 《Effective Java》学习笔记 第二章 创建和销毁对象

    第二章 创建和销毁对象 何时以及如何创建对象,何时以及如何避免创建对象,如何确保他们能够适时地销毁,以及如何管理对象销毁之前必须进行的各种清理动作. 1 考虑用静态工厂方法代替构造器 一般在某处获取一 ...

  3. Qt之Q_GLOBAL_STATIC创建全局静态对象

    概述 所谓的全局静态对象,大多是在单例类中所见,之前写过一篇文章介绍如何实现一个单例类,在这里,这是最常见的方式来进行创建,需要自定义 static 类对象, 并进行手动初始化.而今天要说的是更简单的 ...

  4. 《Effective Java》 第一讲:创建和销毁对象

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.用静态工厂方法代替构造器 用静态工厂的优点 : 1. 方法有名字,更好理解. 2.不必每次调用的 ...

  5. 如何销毁一个实例化对象_JAVA中如何创建和销毁对象

    第1条 考虑用静态方法代替构造器 类可以通过静态工厂方法来提供它的客户端,而不是通过构造器.提供静态工厂方法而不是公有构造器,这样做具有几大优势. 1.静态工厂方法与构造器不同的第一大优势在于,它们有 ...

  6. new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...

    Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...

  7. [Effective Java]第二章 创建和销毁对象

    第一章      前言 略... 第二章      创建和销毁对象 1.            考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法.下面是一个Bool ...

  8. 以下创建了几个对象_面试题系列第2篇:new String()创建几个对象?

    Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...

  9. Effective Java读书笔记---二、创建和销毁对象

    二.创建和销毁对象 何时以及如何创建对象, 何时以及如何避免创建对象, 如何确保它们能够适时地销毁, 如何管理对象销毁之前必须进行的各种清理动作 1.用静态工厂方法代替构造器 优势: 它们有名称 不必 ...

最新文章

  1. 【js】版本号对比处理方案
  2. CCF计算机职业资格认证2016-12-1
  3. .net 使用RabbitMQ demo
  4. ASP.NET Core:使用IdentityServer构建可靠的身份验证和授权系统
  5. 中国双面柔性印刷电路板(FPC)市场趋势报告、技术动态创新及市场预测
  6. 深入学习golang—channel
  7. 毕业设计——房屋租赁管理系统
  8. msfconsole使用手册
  9. 七牛云 转码_七牛云4:上传后自动添加水印、视频转码
  10. TCP/IP路由技术第一卷静态路由知识回顾
  11. Mininet--topo类型-py创建自定义拓扑网络
  12. Mysql分表:Merge
  13. 计算机专业对于未来的规划,对所学专业的认识及对未来的规划.doc
  14. chrome 油猴 电脑或者手机click()失效,解决
  15. 乐吾乐2D可视化为智慧水务可视化赋能(二)
  16. linux su -含义,linux su命令详解步骤
  17. 真丶深入理解 JavaScript 原型和原型链(二):原型和原型链
  18. 鱼池显示服务器错误502,502+bad+gateway怎么解决
  19. android wms 窗口,Android6.0 WMS(十一) WMS窗口动画生成及播放
  20. Unity学习记录:制作双屏垃圾分类小游戏

热门文章

  1. Office基础和计算机操作基础的知识点(一)
  2. React中antd的按需引入+自定主题
  3. linux将光驱挂载到目录下,Linux操作系统下关于光驱的挂载
  4. 《线性代数及其应用》
  5. java泛型程序设计——注意擦除后的冲突
  6. 贪婪算法+小应用(调度问题)
  7. java中抽象类继承抽象类_用Java中的抽象类扩展抽象类
  8. 随机数发生器怎么用_用随机数发生器射击自己的脚
  9. es 调整gc_实际中进行GC调整
  10. spring 多租户_使用Spring Security的多租户应用程序的无状态会话