在较高的层次上,我知道我们需要通过使用它们各自的包装类在Java集合中使用它们来“包装”原始数据类型,例如int和char。我想了解Java集合如何在低级询问:“为什么我们需要将原始数据类型包装为对象才能在集合中使用它们?”在此先感谢您的帮助。
在虚拟机级别,这是因为与引用类型(例如java.lang.Object及其派生类型)相比,原始类型在内存中的表示方式非常不同。例如,Java中的原始int在内存中只有4个字节,而一个对象本身至少占用8个字节,另外还要占用4个字节来引用它。这种设计简单地反映了CPU可以更有效地处理原始类型这一事实。
因此,您的问题“为什么需要包装类型”的一个答案是因为它可以提高性能。
但是对于程序员而言,这种区分会增加一些不希望的认知开销(例如,不能在集合中使用int和float。)实际上,通过隐藏这种区分来进行语言设计是很有可能的-
许多脚本语言都这样做了,并且CLR做到了。从1.5开始,Java也这样做。这是通过让编译器在原始表示形式和对象表示形式(通常称为装箱/拆箱)之间静默插入必要的转换来实现的。
因此,您的问题的另一个答案是“不,我们不需要它”,因为编译器会自动为您执行此操作,并且在某种程度上您可以忘记幕后发生的事情。
问题内容: 基本上,我想知道为什么必须创建一个抽象装饰器类来实现(或扩展)某些接口(或抽象类)。为什么所有新的“装饰类”都不能简单地实现(或扩展)基本抽象对象本身(而不是扩展抽象装饰器类)? 为了更具体一点,我将使用设计模式书中涉及咖啡饮料的示例: 有一个称为的抽象组件类 简单的饮料类型,例如简单扩展 为了装饰饮料,创建了一个抽象类,该类扩展并具有 假设我们要添加“牛奶”调味品,将创建一个扩展 我
问题内容: 我知道包装器类是什么,它们将原始类型(例如int,double等)包装到各自类的对象中。 但是,为什么我们首先需要包装器类?为什么不简单地在我们拥有原始类型的地方使用它们呢? 问题答案: 几种可能的原因: 这样就可以有一个空值 包含在集合中 将一般/多态与其他对象一起视为对象
null
问题内容: 我创建了一个类“ String”,并将其放置在“ java”包中[实际上,我想创建 java.lang 以查看classLoader将哪个类加载为 一旦将一个类加载到JVM中,就不会再次加载相同的类(我再说一遍,相同的类) 引用于oreilly]。但是后来那件事,为什么在运行此类时我得到 java.lang.SecurityException:禁止的包名称: java 出于安全原因,j
问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端
来自Gradle的文档: 此任务生成的脚本将提交给您的版本控制系统。该任务还生成一个小的gradle-wrapper.JAR引导程序JAR文件和属性文件,这些文件也应该提交给VCS。脚本委托给这个jar。 来自:什么不应该受到源头控制?