İnt [] dizisi ile int dizisi [] arasındaki fark


234

Son zamanlarda bir dizi tanımlamanın iki yolu arasındaki fark hakkında düşünüyordum:

  1. int[] array
  2. int array[]

Bir fark var mı?

Yanıtlar:


282

Anlamsal olarak aynıdırlar. int array[]Sözdizimi sadece java alışması yardım C programcıları eklendi.

int[] array çok tercih edilir ve daha az kafa karıştırıcıdır.


55
[], NAME öğesinin değil, TYPE öğesinin bir parçasıdır. Benim için en büyük fark bu.
André Chalella

4
@Andre - ve C de, [] deklarasyon tanımlayıcısı değil, deklaratör kısmı, dolayısıyla int array[]sözdizimi. Ayrıca mantıklı ... bir şekilde bükülmüş. :)
Kos

1
C bu küçük oyunu oynar :) Ve büyüleyici buluyorum :) Hatta gibi ... işaretçilerle. İşaretçiler için 'doğru' c sözdizimi int * imAPointer şeklindedir. Aptalca ve temiz.
ScarletAmaranth

4
int array[]bana daha mantıklı geliyor. Bu bildiri hakkında ne düşünüyorsun? int[] x, y? Mı ybir dizi veya olmasın? Belki öyle, belki değil. Sadece Java'nın guruları güvenle cevap verebilir ....
user1508893

24
Durumunda int[] x, y, y(nedeniyle bir dizi []türüne ait olan), ve söz konusu olduğunda int x[], y, ybir dizi (değildir []değişkene ait).
Triang3l

172

Aynı beyanda birden fazla değişken bildirirseniz, küçük bir fark vardır:

int[] a, b;  // Both a and b are arrays of type int
int c[], d;  // WARNING: c is an array, but d is just a regular int

Derleyici kullanmaya çalıştığınız anda neredeyse kesinlikle hatalarınızı yakalayacaktır, ancak bunun kötü kodlama stili olduğunu unutmayın d.


52

Fark yok.

Ben type[] namebiçiminde değişken bir dizi (daha az ne olduğunu bulmak için etrafa) açıktır tercih ederim .

DÜZENLE:

Oh bekleyin bir fark var (çünkü bir kerede birden fazla değişken asla beyan etmediğim için unuttum):

int[] foo, bar; // both are arrays
int foo[], bar; // foo is an array, bar is an int.

27

Hayır, bunlar aynı. ancak

byte[] rowvector, colvector, matrix[];

şuna eşittir:

byte rowvector[], colvector[], matrix[][];

Java Spesifikasyonundan Alınmıştır . Bu şu demek oluyor

int a[],b;
int[] a,b;

farklıdır. Ben bu birden fazla bildirimlerin hiçbirini tavsiye etmem. Okunması en kolay (muhtemelen) şöyle olacaktır:

int[] a;
int[] b;

3
Bununla birlikte, bir satırda birden fazla tanımlayıcı bildirmek yerine her tanımlayıcı için bir bildirim kullanmak iyi bir uygulamadır.
rsp

@rsp - Tamamen katılıyorum, en iyi uygulamayı düzenledi. Yine de, iyi uygulamanın ne olduğunu düşündürüyor.
Ishtar

25

Gönderen Java Dil Şartname bölüm 10.2 :

[], Bildirimin başlangıcında türün bir parçası olarak veya bu örnekte olduğu gibi belirli bir değişken için ya da her ikisinin de bildirgesinin bir parçası olarak görünebilir:

 byte[] rowvector, colvector, matrix[];

Bu beyan şuna eşdeğerdir:

byte rowvector[], colvector[], matrix[][];

Şahsen gördüğüm hemen hemen tüm Java kodları, ilk form kullanır, bu da değişkenle ilgili tüm tür bilgileri tek bir yerde tutarak daha mantıklıdır. Keşke ikinci forma izin verilmedi, dürüst olmak gerekirse ... ama hayat böyle ...

Neyse ki şimdiye kadar bu (geçerli) kodu gördüğümü sanmıyorum :

String[] rectangular[] = new String[10][10];

Teşekkürler, bunun üzerine başımı kaşıyordum. Garip bir şekilde, sorunun başlığını googling yaparken hiçbir şey bulamadım ...
Yoav

3
+1 İkinci forma izin vermeme konusunda hemfikirim. +1 de 'n' maçı gibi karıştırabileceğinizin farkında değildim int[] a[];- bu asla net olmayacak ;-)
Bohemian


13

Fark yok.

Güneş'ten Alıntı :

Bu [], bildirimin başlangıcında türün bir parçası olarak veya bu örnekte olduğu gibi belirli bir değişkenin veya her ikisinin de bildirgesinin bir parçası olarak görünebilir:byte[] rowvector, colvector, matrix[];

Bu beyan şuna eşdeğerdir: byte rowvector[], colvector[], matrix[][];


11

İkisi arasında fark yoktur; her ikisi de bir dizi ints bildirir. Bununla birlikte, birincisi, tip bilgisini tek bir yerde tuttuğu için tercih edilir. İkincisi sadece Java'ya taşınan C / C ++ programcılarının yararına desteklenir.


11

Gerçek bir fark yok; ancak,

double[] items = new double[10];

türün bir dizi olduğunu açıkça belirttiği için tercih edilir.


1
çift ​​öğeler [] C programcıları için gerçekten orada
Steve Kuo

@Steve, bu yüzden böyle yapmaya devam etmeliyim. :-)
Paul Tomblin

Çift öğelerin [] türünü açıkça belirttiği ve daha sonra öğelerin bir dizi haline geldiği bir karşı düzen yapılabilir - hepsi neye razı olduğunuza bağlıdır.
MetroidFan2002

7

Her ikisi de eşit derecede geçerlidir. int puzzle[]Bir şekilde, ancak önerilmez int[] puzzlegöre tercih edilen kodlama sözleşmeler . Ayrıca resmi Java dizileri eğiticisine de bakın :

Benzer şekilde, diğer türlerdeki dizileri de bildirebilirsiniz:

byte[] anArrayOfBytes;
short[] anArrayOfShorts;
long[] anArrayOfLongs;
float[] anArrayOfFloats;
double[] anArrayOfDoubles;
boolean[] anArrayOfBooleans;
char[] anArrayOfChars;
String[] anArrayOfStrings;

Köşeli parantezleri dizinin adından sonra da yerleştirebilirsiniz:

float anArrayOfFloats[]; // this form is discouraged

Ancak, sözleşme bu formu caydırır; köşeli ayraçlar dizi türünü tanımlar ve tür tanımıyla birlikte görünmelidir.

Son paragrafı not edin.

Bazı üçüncü taraflardan ziyade resmi Sun / Oracle derslerini okumanızı tavsiye ederim. Aksi takdirde kötü uygulamaları öğrenme riskiniz olacaktır.


6

Java'nın ödünç alındığı alternatif bir formdur C.

Bir merak olarak, java'da geçerli bir yöntem tanımlamanın üç yolu vardır main:

  • public static void main(String[] args)
  • public static void main(String args[])
  • public static void main(String... args)

1
Saygılarımızla, ama bu soruya cevap veriyor !!!!! Belirtilen üçüncü form, orijinal gönderide sorulan şeyle gerçekten bir şey yapmak zorunda mıdır. İlk iki argüman ana yöntemin dizileridir, ancak üçüncü varlık değişken bir argümandır (bir dizi ile aynı değildir). Ana yöntemi tanımlamak soru ise, o zaman ana yöntemi tanımlamak için başka bir form da eklenebilir, örneğin public static void main ( String \u005B \u005D args )bu da başka bir varyanttır.
Güzel

2
Bir örneğin, bir parametre, varargs @nIcEcOw String... param, olduğu bir dizi
Bohemyalı

Her ikisi de, diziler örneğin String [] ve dize ... ise sadece basit bir şüphe ortaya , then why it is not possible to call a method like say `bir tanımlama ise birYöntem (1, 2) someMethodolarak someMethod ( int[] numbers ). Diziler, bağımsız değişkenin bitişik bellek konumundan olması gerektiğini, ancak varargsönce verilen bağımsız değişkenlerden bir dizi oluşturmasını ister. Dahası, a varargsbir yöntemin yalnızca son argümanı olabilir, ancak aynı şey bir dizi için geçerli değildir.
NIcE COw

2
@nIcEcOw ama bir dizi ile bir varargs çağırabilirsiniz, yani meth(int... a)ya meth(1, 2)ya olarak adlandırılabilir meth(new int[] {1, 2}). Varargs, ilk versiyonu ikinci versiyona dönüştüren sözdizimsel şekerdir. Parametrenin gerçek (bayt kodu) türü bir dizi türüdür. Sonuncu olmak gerekirse, bunu düşünürseniz, başka aklı başında seçim yok.
Bohemian

5

Hiçbir fark yoktur, ancak Sun burada açıklandığı gibi tipin yanına koymanızı önerir.


3

En çok tercih edilen seçenek int[] a- çünkü int[]tür vea addır. (2. seçeneğiniz yanlış yerleştirilmiş alanla aynıdır)

İşlevsel olarak aralarında hiçbir fark yoktur.


3

Java Dil Özellikleri diyor ki:

The [] may appear as part of the type at the beginning of the declaration,
or as part of the declarator for a particular variable, or both, as in this
example:

byte[] rowvector, colvector, matrix[];

This declaration is equivalent to:

byte rowvector[], colvector[], matrix[][];

Böylece tam olarak aynı bayt koduyla sonuçlanırlar.


2

Java'da, bunlar aynı şeyi söylemenin farklı sözdizimsel yöntemleridir.


2

Onlar aynı. Biri diğerinden daha okunabilir (bazıları için).


2

Tamamen eşdeğerdirler. int [] arraytercih edilen stildir. int array[]sadece eşdeğer, C uyumlu bir stil olarak sağlanır.


2

Her ikisi de aynı anlama sahiptir. Bununla birlikte, bu varyantların varlığı da buna izin verir:

int[] a, b[];

ki aynı:

int[] a;
int[][] b;

Ancak, bu korkunç bir kodlama tarzıdır ve asla yapılmamalıdır.


demek istediniz, int [] a, b []; b çok boyutlu bir dizi haline gelir
sadananda salam

2

Her iki bildirim stili arasında işlevsellik açısından fark yoktur. Her ikisi de int.

Ancak int[] a tür bilgilerini bir arada tutar ve daha ayrıntılıdır, bu yüzden tercih ederim.


2

Aynılar, ancak bu ifadeler arasında önemli bir fark var:

// 1.
int regular, array[];
// 2.
int[] regular, array;

1. normalde, hem normal hem de dizi int dizileri olduğu 2. yerine, sadece bir int.

Bu nedenle, sahip olduğunuz ikinci ifade daha açık olduğu için tercih edilir. İlk form, Oracle hakkındaki bu eğiticiye göre de önerilmez .


Teşekkürler! İkincisiyle gidip ona bağlı kalacağım.
Espen

2

Daha önce de belirtildiği gibi, çok fazla fark yoktur (satır başına sadece bir değişken bildirirseniz).

O Not SonarQube küçük olarak ikinci durumda davranır kod kokusu:

Dizi belirteçleri "[]" değişken üzerinde değil tipte olmalıdır (kalamar: S1197)

Daha iyi kod okunabilirliği için dizi belirleyicileri her zaman türün üzerine yerleştirilmelidir. Aksi takdirde, geliştiricilerin bir değişkenin dizi olup olmadığını öğrenmek için hem türe hem de değişken adına bakması gerekir.

Uyumsuz Kod Örneği

int matrix[][];   // Noncompliant
int[] matrix[];   // Noncompliant

Uyumlu Çözüm

int[][] matrix;   // Compliant

1

Evet, tamamen aynı. Şahsen ben tercih ederim

int[] integers; 

çünkü kodunuzu okuyan herkesin tamsayıların bir dizi int olduğunu açıkça gösterir.

int integers[];

özellikle de bir satırda birden fazla bildirim varsa, bu kadar açık değildir. Ama yine, eşdeğerler, bu yüzden kişisel tercih geliyor.

Daha ayrıntılı örnekler için Java'daki dizilerdeki bu sayfaya göz atın .


1

tek bir dizi başvurusu bildirilirken, aralarında çok fazla fark yoktur. aşağıdaki iki beyan aynıdır.

int a[];  // comfortable to programmers who migrated from C/C++
int[] a;  // standard java notation 

birden fazla dizi referansı bildirirken, aralarında fark bulabiliriz. Aşağıdaki iki ifade aynı anlama gelir. aslında takip eden programcıya kalmıştır. ancak standart java notasyonu önerilir.

int a[],b[],c[]; // three array references
int[] a,b,c;  // three array references

0

İkisi de iyi. Bir tane seçip ona bağlı kalmanızı öneririm. (Ben ikincisini yaparım)


0

int integers[]Çözüm C dilinde köken alırken (ve dolayısıyla "normal" yaklaşım int[] integersolarak kabul edilebilir ), birçok kişi bir bildiride (aksine bir tür) farklı türlerde (yani int ve dizi) değişkenler oluşturmaya izin vermediği için daha mantıklıdır. C-tarzı bildirimi).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.