[C#] JavaとC#のintとIntegerの違いは何ですか?


Answers

まあ、Javaではintはプリミティブで、IntegerはObjectです。 意味、あなたが新しいIntegerを作った場合:

Integer i = new Integer(6);

あなたは私の上でいくつかのメソッドを呼び出すことができます:

String s = i.toString();//sets s the string representation of i

intとの間:

int i = 6;

それは単なるプリミティブなので、メソッドを呼び出すことはできません。 そう:

String s = i.toString();//will not work!!!

intはオブジェクトではないため、エラーが発生します。

intは、Javaのいくつかのプリミティブのうちの1つです(charや他のものとともに)。 私は100%確信しているわけではありませんが、Integerオブジェクトにはintプロパティとそのプロパティ(たとえばtoString()メソッドなど)とやりとりするメソッドがたくさんあると考えています。 だから、Integerはintを使って作業するための素晴らしい方法です(ちょうど文字列がchar型のグループを扱う素晴らしい方法です)。

私はJavaがCではないことを知っていますが、Cでプログラミングしたことがないので、これは私が答えに来ることができる最も近いものです。 お役に立てれば!

Integerオブジェクトjavadoc

整数の比較とintの初期比較

Question

Joel SpolskyがJava / C#(Object Oriented Programming Languages)のintInteger型の違いを知っている特定のタイプのプログラマについて何か言ってきたときに私はMore Joel on Softwareを読んでいました

では、違いは何ですか?




これは既にJavaのために答えられています、ここではC#の答えです:

"Integer"はC#では有効な型名ではなく、 "int"はSystem.Int32の単なるエイリアスです。 また、Java(またはC ++)とは異なり、C#には特別なプリミティブ型はなく、C#の型のすべてのインスタンス(intを含む)はオブジェクトです。 いくつかのデモ用コードがあります:

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}



Java:

intdoublelongbytefloatdoubleshortbooleanchar - プリミティブ。 言語でサポートされている基本データ型を保持するために使用されます。 プリミティブ型はオブジェクト階層の一部ではなく、Objectを継承しません。 テットはメソッドを参照することで渡すことができます。

DoubleFloatLongIntegerShortByteCharacter 、およびBooleanは、 java.langにパッケージ化された型ラッパーです。 すべての数値型ラッパーは、指定された値またはその値の文字列表現からオブジェクトを構築できるようにするコンストラクターを定義します。 オブジェクトを使用すると、最も単純な計算にもオーバーヘッドが追加されます。

JDK 5以降、Javaには2つの非常に便利な機能が含まれています:オートボクシングとオートナンバー。 オートボクシング/アンボクシングは、プリミティブ型をオブジェクトに変換しなければならないコードを大幅に簡素化し、合理化します。

コンストラクタの例:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

ボクシング/アンボクシングの例:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

autoboxing / autounboxingの例:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

PS Herbert Schildtの本を参考にしました。




Javaのようなプラットフォームでは、 intはプリミティブですが、 Integerは整数フィールドを保持するオブジェクトです。 重要な違いは、プリミティブは常に値によって渡され、定義によって不変であるということです。

プリミティブ変数を含む操作は、常に新しい値を返します。 一方、オブジェクトは参照によって渡されます。 オブジェクト(AKA参照)へのポイントも値渡しされていると主張できますが、内容はそうではありません。




両方の言語(JavaおよびC#)では、 intは4バイトの符号付き整数です。

Javaとは異なり、C#符号付きと符号なしの両方の整数値を提供します。 JavaやC#はオブジェクト・オブジェクト指向であるため、これらの言語でのいくつかの操作は、実行時に提供される命令に直接マップされないため、ある種のオブジェクトの一部として定義する必要があります。

C#は、ヒープ上の参照型に属するメモリの一部を使用する値型のSystem.Int32を提供します。

javaはint動作する参照型java.lang.Integerを提供しjava.lang.IntegerIntegerのメソッドは、実行時の命令に直接コンパイルすることはできませんIntegerのインスタンスに変換するint値を入力し、いくつかの型のインスタンス( toString()parseInt()valueOf()など)。

C#の変数intは、 System.Int32.Any参照します。メモリ内の4バイトの値は、System.Int32.Soのインスタンスによって操作されるプリミティブintとして解釈できます。intはSystem.Int32.Whenエイリアスです。 int.Parse()int.ToString()などのような関連メソッドですint.Parse()int.ToString()などのそれぞれのメソッドを呼び出すFCL System.Int32構造体にコンパイルされます。




私が以前の答えで見たことがないもう一つのこと:Javaでは、Integer、Double、Float、Boolean ...、Stringのようなプリミティブラッパークラスは不変であるため、これらのクラスのインスタンスを渡すと、メソッドは、他のほとんどのクラスとは別の方法でデータを変更することはできませんでした。内部データはパブリックメソッドによって変更される可能性があります。 その結果、このクラスはコンストラクタのほかに 'getter'メソッドしか持たず、 'setters'もありません。

Javaプログラムでは、文字列リテラルはヒープ・メモリーの別の部分に格納され、リテラルのインスタンスのみが、それらのインスタンスを再利用するメモリーを節約します




他の投稿のいくつかがC#に関して少し不正確であるので、私はここに投稿します。

正しい: intは、 System.Int32エイリアスです。
誤: floatSystem.Floatエイリアスではなく、 System.SingleエイリアスですSystem.Float

基本的に、intはC#プログラミング言語の予約キーワードであり、 System.Int32値型の別名です。

floatとFloatは同じではありませんが、 '' float ''の正しいシステムタイプはSystem.Singleです。 このようないくつかのタイプは、タイプ名と直接一致しないような予約されたキーワードを持っています。

C#では、 '' int ''と '' System.Int32 ''、または他のペアやキーワード/システムタイプの間に違いはありませんが、enumを定義するときを除きます。 列挙型では、使用する記憶領域のサイズを指定することができます。この場合は、システム実行時の型名ではなく、reservedキーワードのみを使用できます。

intの値はスタック、メモリ、または参照されるヒープオブジェクトとして格納され、コンテキストや使用方法によって異なります。

メソッド内のこの宣言:

int i;

最適化に応じて、レジスタまたはスタックに存在するSystem.Int32型の変数iを定義します。 型(構造体またはクラス)内の同じ宣言はメンバフィールドを定義します。 メソッド引数リストの同じ宣言は、ローカル変数と同じ記憶域オプションを持つパラメータを定義します。 (この段落は、イテレータメソッドをミックスに引き込む場合には有効ではないことに注意してください。これらはすべて異なるビーストです)

ヒープオブジェクトを取得するには、ボクシングを使用することができます:

object o = i;

これは、ヒープ上のiの内容のボックス化されたコピーを作成します。 ILでは、ヒープオブジェクトのメソッドに直接アクセスできますが、C#ではintにキャストし直す必要があり、別のコピーが作成されます。 したがって、新しいint値の新しいボックス化されたコピーを作成せずに、ヒープ上のオブジェクトをC#で簡単に変更することはできません。 (ああ、この段落では簡単にすべてを読むことはできません。)




私の知る限りのJavaでは、学習者であれば、intを書くときは; java genericでは、整数a =新しい整数のようなコードをコンパイルします。 したがって、ジェネリックスごとに整数は使用されず、intが使用されます。 そのような違いがあります。




Javaでは、 JVM 2つの基本タイプがあります。 1)プリミティブ型と2)参照型。 intはプリミティブ型で、Integerはクラス型(参照型の一種)です。

プリミティブ値は、他のプリミティブ値と状態を共有しません。 型がプリミティブ型である変数は、常にその型のプリミティブ値を保持します。

int aNumber = 4;
int anotherNum = aNumber;
aNumber += 6;
System.out.println(anotherNum); // Prints 4

オブジェクトは、動的に作成されたクラスインスタンスまたは配列です。 参照値(しばしば単に参照)は、これらのオブジェクトへのポインタであり、オブジェクトを参照しない特別なヌル参照です。 同じオブジェクトに多くの参照があるかもしれません。

Integer aNumber = Integer.valueOf(4);
Integer anotherNumber = aNumber; // anotherNumber references the 
                                 // same object as aNumber

また、Javaではすべてが価値によって渡されます。 オブジェクトの場合、渡される値はオブジェクトへの参照です。 したがって、javaのintとIntegerの別の違いは、それらがメソッド呼び出しでどのように渡されるかです。 たとえば、

public int add(int a, int b) {
    return a + b;
}
final int two = 2;
int sum = add(1, two);

変数2は、基本整数型2として渡されます。

public int add(Integer a, Integer b) {
    return a.intValue() + b.intValue();
}
final Integer two = Integer.valueOf(2);
int sum = add(Integer.valueOf(1), two);

変数2は、整数値2を保持するオブジェクトへの参照として渡されます。

@WolfmanDragon:参照渡しは次のように動作します:

public void increment(int x) {
  x = x + 1;
}
int a = 1;
increment(a);
// a is now 2

インクリメントが呼び出されると、変数aに参照(ポインタ)が渡されます。 インクリメント関数は変数aを直接変更します。

オブジェクト型の場合、次のように動作します。

public void increment(Integer x) {
  x = Integer.valueOf(x.intValue() + 1);
}
Integer a = Integer.valueOf(1);
increment(a);
// a is now 2

違いは今見えますか?




int変数は32ビット符号付き整数値を保持します。 Integer(大文字I)は、(クラス)Integer型のオブジェクトまたはnullへの参照を保持します。

Javaは自動的に2つの間でキャストされます。 Integerオブジェクトがint演算子への引数として出現するか、int変数に代入されるか、整数値がInteger変数に代入されるときはいつでも、Integerからintに変換されます。 このキャスティングはボクシング/アンボクシングと呼ばれます。

nullを参照するInteger変数が明示的または暗黙的にボックス化されていない場合、NullPointerExceptionがスローされます。




intはライブラリ関数c#であらかじめ定義されていますが、javaではIntegerのオブジェクトを作成できます




Links