2016-10-18 1 views
4
import java.util.Stack; 

public class StackIntro { 
    public static void main(String[] args){ 
     Stack clapper = new Stack(); 

     for(int i=0; i<11; i++){ 
      clapper.push(i); 
     } 

     while(!clapper.isEmpty()){ 
      System.out.print (clapper.pop());  //FILO 
      System.out.print (','); 
      if(clapper.size()==1){ 
       System.out.print(clapper.pop()); //FILO 
       System.out.println("..."); 
      } 
     } 
     System.out.println("Lift-off."); 
     clapper.removeAllElements(); 
    } 
} 

だから、基本的には、数字がどのようにスタック内に出入りするかを見たいだけでした。 FILOコメントはこれを示しています。私は実際に行8を変更する必要があると言われました。ここで新しいIntegerを使用すると良い点はありますか?

clapper.push(i); //previous 

clapper.push(new Integer(i)); //new 

私はこれが達成すること、またはその2つの違いを理解していません。

+2

「オートボクシング」について聞いたことがありますか? – user2004685

+0

@ user2004685これはなんですか? –

+0

@ChuckBIhekwabaあなたが質問したように、トピックに関する素晴らしい答えがあります:http://stackoverflow.com/questions/27647407/why-do-we-use-autoboxing-and-unboxing-in-java* – user2004685

答えて

5

によるスタックにプッシュされる値1Integerオブジェクトのコード結果の両方のラインをオートボクシングに、2行ははないがexctly同じ効果を持っていますが。

オートボクシングが得Integerインスタンスは、その範囲内の任意の値の同じインスタンスであるように-128から127の値についてJLSによって必要とされる整数キャッシュを使用します。

ただし、intコンストラクタを呼び出すと、呼び出されるたびに新しいIntegerインスタンスが作成されます。

を考えてみましょう:あなたは==(オブジェクトID)を使用した場合の比較値をプッシュし、スタックの代わりequals()へ/ポップとき

Integer a = 1; // autoboxing 
Integer b = 1; // autoboxing 
System.out.println(a == b); // true 
Integer c = new Integer(1); 
Integer d = new Integer(1); 
System.out.println(c == d); // false 

この区別は、あなたのプログラムで異なる動作を引き起こす可能性があります。

+1

あなたは技術的には正しいですが、あなたの答えは問題でもあります。私の答えよりも問題が多い可能性があります。値を比較するときにオブジェクトアイデンティティーを使用すると、彼は値の外の値を使用するとすぐに深刻な問題に遭遇します。キャッシュされた範囲。したがって、正しい答えは、オブジェクトアイデンティティの等価比較を使用する間違いをした場合にのみ気付くわずかな違いがあることです。私は自分の答えを削除することができますし、あなたはあなたの問題を修正することができます、またはあなたのものを削除することができます私は私を修正することができます、私はそれをあなたに任せます。 –

+1

@私の質問は「正しい」または「より良い」ということではありません。それは、「何が違いなのか」に関するものでした。どちらの答えも読者にとって価値があります。 – Bohemian

+0

はい、それは私が言ったように、あなたが技術的に正しいという理由です。私は忘れてしまった違いを特定しました。しかし同時に、あなたはOPを痛みの世界にさらしている可能性があります。 –

4

これは、ほとんど何も達成しないでしょう。

アイデアはclapper.push(T)がオブジェクトを受け入れることですが、iはオブジェクトではありません、それは原始的なので、コンパイラが自動的にclapper.push()に渡す前にIntegerオブジェクトにそれをボックスします。

自動ボクシングは最初からJavaの機能ではなかったので、それに不快な老齢者がまだ残っている可能性があります。しかし、それは完全に自分自身の問題でなければなりません。それ以来、Javaは長い道のりを歩んできました。オートボクシングは当然のことと考えられていますが、私たちはこれ以上考えることさえしません。

iを渡し、コンパイラの自動ボックスを使用している場合は、new Integer(i)を渡すのとまったく同じです。

+1

実際には、この回答は間違っています。特に最後の文です。はい、それはautoboxesですが、** ** ** 2つのラインは**全く同じではありません** - [ここ](http://stackoverflow.com/a/40117000/256196)を参照してください – Bohemian

+0

@ボヘミアンあなたは正しいあなたの答えに私のコメントを見てください。 –

関連する問題