2013-01-11 44 views
2

所以我刚刚开始了我的第二个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] + ", "); 
    } 
} 
} 

不必通过各种即将到来的例子看,似乎我的教授从不使用原始数据类型,他总是使用等价的对象类(在这种情况下Integer,而不是intInteger[]代替int[])。另外我明白一些情况需要使用对象。我的问题是:

什么可能的原因是总是使用该对象?特别是在这种简单的情况下,当原始图形的使用看起来更合适时

总是这样做是不好的习惯?我应该总是使用这些对象只是为了让他开心,但在现实生活中知道尽可能使用原始数据类型

这个例子我认为是不好的编程吗?

感谢

编辑: 感谢所有伟大的答案,我(初学者)只需要确认我一直在寻找在这里不是代码的最佳方式。

+3

看来你的教授并不知道自动装箱。因为这个'Integer powersOf2 = new Integer(1);'是多余的。 – Andremoniy

+2

我喜欢并同意这里的答案:http://stackoverflow.com/a/2509478/1201423 – cklab

+3

我认为你的教授不使用自动装箱,直到他教导了有关自动装箱的想法。 – MrSmith42

回答

8

什么可能的原因是总是使用该对象?

没有理由,这段代码很丑。作为对象的基元在使用集合时具有优势,但在您的示例中不会使用它们。

尤其是在这个简单的例子,当使用原始似乎 更适合

Absolutley正确的,在这种情况下,对象是更糟的是,他们需要更多的内存,并在您的例子有没有优势。

总是这样做不好吗?

是的,你应该只使用对象(盒装原语),如果他们需要。除了在收藏使用,这种对象也可以是null,这是一个优势,它可以被用作“值(还)没有现有的”等

我就应该总是使用对象只是为了让他高兴,但在 知道现实生活中尽可能使用原始数据类型

不,告诉他这没有任何意义。但请记住,你的教授从来不想提供改进课程。他可能被迫“这样做”。

这个例子我认为是不好的编程吗?

是的。最大不好!

+1

能够告诉空/“无数据”除了0有时是有一些价值:) – Affe

+0

是的正确,我会补充说! – AlexWien

+0

@Affe考虑到您的评论,已更新。 – AlexWien

1

E.g.基元不能存储在Collectins中。

确定自动装箱有帮助,但帽子只是由编译器而不是自己包装。

1

不,你不应该原始类型的任何地方使用对象包装:

1)对象当量使用更多的内存,则基本类型。

2)它可能是无效比较两个Integer对象 - 你应该比较它们,使用equals方法 - 它不方便。

使用对象包装的唯一明智理由是generics,您必须使用一些Class。例如List<Integer>Map<Integer, Double>等集合。

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

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

1

基元更节省空间,因为对象包装器创建一个新对象只是为了容纳通常使用的相同基元。 Java有很多优化,这些日子让你的教授的代码不是完全缓慢/破碎,但它确实是一个不好的做法。除非你发现你需要对象支持,特别是像@ MrSmith42所暗示的那样,如果你想将基元存储在一个Java集合中,比如一个ArrayList,你应该在任何你需要的地方使用基元。

创建包装对象数组很少有任何理由。基元数组非常节省空间,对象数组失去了所有这些效率。

7

Effective Java由约书亚布洛赫,

项目49:不想原始类型到盒装元。 有原始类型和原语盒装之间的三个主要区别:

  • 原语只它们的值,而基元盒装有身份不同形式它们的值。

  • 原始类型不能为空,但盒装原语可以。

  • 原始类型比装箱原语具有更多的空间和时间效率。

护理必须使用==操作符与盒装元的,与其他任何引用类型采取,它比较认同,你几乎可以肯定想成为比较值。如果使用==运算符将盒装基元与基元进行比较,则会对基元类型进行装箱并将身份进行比较,因此必须小心。

拳击和拆箱的过程,特别是在循环中会严重阻碍性能。

基本上,除非原始类型不能使用,例如在集合中或作为参数化类型,否则应避免使用boxes基元。

我希望这可以帮助您了解差异。

0
powersOf2 = powersOf2 * 2; 

如何移动字节?!

//转换为原始比成才,如:

powersOf2 = powersOf2 << 2; 
3

大多数人都同意时,你可以,你应该使用原语。为了扮演魔鬼的拥护者,我想到了一个优势:他们失败的更快

此代码将抛出一个空指针异常,因为你忘了初始化myInteger

private Integer myInteger; 

public void run() { 
    int myNewInt = myInteger + 5; 
} 

如果您使用的int,它会继续和它会是很难注意到你所犯的错误。


这里的另一个类似的优点我只是跑成:它让你表示没有数据。我有一个方法返回一个配置选项。它有一个返回boolean的签名。原来配置选项在系统中不存在。但不是告诉我,它只是默认为假(它必须选择)。结果,我认为这个值被设置为false,但是结果证明它已经丢失。如果该方法返回Boolean,该错误会更加明显。

0

根据关于The Number Classes教程的Java文档,它指定了您可能希望使用Number对象而不是基元的三个原因。我会假设没有列出的任何其他原因将被认为是不好的编程。

  1. 作为一个期望的对象的方法的自变量(操作数的集合时经常使用)。
  2. 使用由类定义的常量,例如MIN_VALUE和MAX_VALUE,它们提供数据类型的上限和下限。
  3. 使用类方法将值转换为其他基本类型以及从其他基本类型转换值,转换为字符串和从字符串转换以及在数字系统(十进制,八进制,十六进制,二进制)之间进行转换。
相关问题