Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有理由总是使用对象而不是基本体?_Java_Memory Management_Wrapper_Primitive - Fatal编程技术网

Java 是否有理由总是使用对象而不是基本体?

Java 是否有理由总是使用对象而不是基本体?,java,memory-management,wrapper,primitive,Java,Memory Management,Wrapper,Primitive,所以我刚刚开始了我的第二节Java编程课,这是教授给我们的演示循环和数组的例子 public class ArraysLoopsModulus { public static void main(String [ ] commandlineArguments){ //Declare & Instatiate an Array of 10 integers Integer[ ] arrayOf10

所以我刚刚开始了我的第二节Java编程课,这是教授给我们的演示循环和数组的例子

public class ArraysLoopsModulus {                       
public static void main(String [ ] commandlineArguments){                   
  //Declare  & Instatiate an Array of 10 integers
  Integer[ ] arrayOf10Integers = new Integer[10];

  //initialize the array to the powers of 2
  Integer powersOf2 = new Integer(1);   
  for(int i=0;i<arrayOf10Integers.length;i++){
    arrayOf10Integers[i] = powersOf2;
    //multiply again by 2
    powersOf2 = powersOf2 * 2;
  }

  //display the powers of 2     
  System.out.println("The first 10 powers of 2 are: ");
  for(int i=0;i<arrayOf10Integers.length;i++){
    System.out.print(arrayOf10Integers[i] + ", ");
  }  
}
}
公共类ArraysLoopsModulus{
公共静态void main(字符串[]commandlineArguments){
//声明并恢复一个包含10个整数的数组
整数[]arrayOf10Integers=新整数[10];
//将数组初始化为2的幂
整数2=新整数(1);

对于(int i=0;i,例如原语不能存储在
Collectins


Ok autoboxing有帮助,但它只是由编译器而不是您自己包装它们。

不,您不应该在任何地方使用基本类型的对象包装器:

1) 对象等价物比基元类型使用更多内存

2) 这可能是两个
Integer
对象比较无效的原因-您应该使用
equals
方法比较它们-这不方便

使用对象包装器的唯一合理原因是
泛型
,其中必须使用一些
。例如
列表
映射等集合

另一个原因是,如果必须存储变量的
null
值,而不是任何数字


提供的代码块有很多冗余部分。

原语更节省空间,因为对象包装器创建一个新对象只是为了保存您通常使用的原语。Java最近进行了很多优化,使您的教授的代码不会完全变慢/中断,但这肯定是一个糟糕的做法

通常,您应该在任何需要的地方使用原语,除非您发现需要对象支持,特别是@MrSmith42建议,如果您想将原语存储在Java集合中,如ArrayList中

很少有什么好的理由去创建包装器对象数组。原始数组非常节省空间,对象数组失去了所有的效率

始终使用对象的可能原因是什么

没有理由,这段代码很难看。作为对象的原语在使用集合时有优势,但在您的示例中没有使用它们

特别是在这个简单的情况下,当原语的使用似乎 更合身

绝对正确,这种情况下的对象更糟糕,它们需要更多内存,在您的示例中没有优势

总是这样做是一种坏习惯吗

是的,您应该仅在需要时使用对象(装箱原语)。除了在集合中使用外,此类对象还可以是
null
,这是一个优势,可以用作“值(尚未)存在”等

我是否应该一直使用这些物品只是为了让他开心,但我知道 在现实生活中,尽可能使用原始数据类型

不,告诉他这毫无意义。但是请记住,你的教授从来都不想上编程课。他可能是“被迫”这样做的

我给出的这个例子会被认为是糟糕的编程吗


是的。最大坏!

来自Joshua Bloch的
有效Java

第49项:首选基本类型而不是盒装基本类型。 基本体类型和装箱基本体之间有三个主要区别:

  • 基本体只有其值,而装箱的基本体具有与其值不同的标识

  • 基元类型不能为null,但装箱基元可以为null

  • 基元类型比装箱基元更节省空间和时间

必须注意将==运算符与装箱基元一起使用,因为与任何其他引用类型一样,它会比较标识,您几乎肯定希望比较值。如果将装箱基元与使用==运算符的基元进行比较,则会装箱基元类型并比较标识,因此在这里也必须注意

装箱和拆箱过程,尤其是在循环中,会严重影响性能

基本上,应该避免使用Box原语,除非不能使用原语类型,例如在集合中或作为参数化类型

我希望这能帮助你理解其中的区别

powersOf2 = powersOf2 * 2;
移动字节怎么样

//转换为基元,而不是类似于:

powersOf2  = powersOf2 << 2; 

powerso2=powerso2大多数人都认为应该尽可能使用原语。要扮演魔鬼代言人的角色,我想到了一个好处:它们失败得更快

此代码将引发空指针异常,因为您忘记初始化
myInteger

private Integer myInteger;

public void run () {
    int myNewInt = myInteger + 5;
}
如果您使用的是
int
,则会继续进行,并且更难注意到您所犯的错误



这是我刚刚遇到的另一个类似的优势:它可以表示缺少数据。我有一个返回配置选项的方法。它有一个返回
布尔值的签名。
。结果是配置选项在系统中不存在。但它没有告诉我,而是默认为false(它必须挑选一些东西)。因此,我原以为该值设置为false,但结果它丢失了。如果该方法返回一个
布尔值
,则错误会更加明显。根据教程中的Java文档,它只指定了三个您可能希望使用数字对象而不是原语的原因。我假设r以下未列出的原因将被视为编程错误

  • 作为期望对象的方法的参数(通常在处理数字集合时使用)
  • 使用类定义的常量,例如提供数据类型上限和下限的最小值和最大值
  • 使用类方法将值与其他基元类型进行转换,将值与字符串进行转换,并在数字系统之间进行转换