Turiu tokį kodą:
String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");
Šie du priedai nesukompiliuojami. Kaip tai veiktų teisingai?
Masyvo dydžio negalima keisti. Jei norite didesnio masyvo, turite sukurti naują masyvą.
Geresnis sprendimas būtų naudoti ArrayList
, kuris gali didėti pagal poreikį. Metodas ArrayList.toArray( T[] a )
grąžina jums jūsų masyvą, jei jums reikia tokio pavidalo.
List<String> where = new ArrayList<String>();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );
Jei reikia jį paversti paprastu masyvu...
String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );
Tačiau daugumą dalykų, kuriuos darote su masyvu, galite daryti ir su šiuo ArrayList:
// iterate over the array
for( String oneItem : where ) {
...
}
// get specific items
where.get( 1 );
Naudokite Sąrašas<String>
, pavyzdžiui, MasyvasSąrašas<String>
. Skirtingai nuo masyvų, jį galima dinamiškai didinti (žr.: Effective Java 2nd Edition, Item 25: Prefer lists to arrays).
import java.util.*;
//....
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"
Jei primygtinai reikalaujate naudoti masyvus, galite naudoti java.util.Arrays.copyOf
, kad paskirstytumėte didesnį masyvą papildomam elementui sutalpinti. Tačiau tai tikrai nėra geriausias sprendimas.
static <T> T[] append(T[] arr, T element) {
final int N = arr.length;
arr = Arrays.copyOf(arr, N + 1);
arr[N] = element;
return arr;
}
String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"
Tai yra O(N)
vienam append
. Kita vertus, ArrayList
turi O(1)
amortizuotų sąnaudų vienai operacijai.
Kaip sakė tangens, masyvo dydis yra fiksuotas. Tačiau pirmiausia turite jį instancuoti, kitaip jis bus tik nulinė nuoroda.
String[] where = new String[10];
Šiame masyve gali būti tik 10 elementų. Taigi reikšmę galite pridėti tik 10 kartų. Savo kode kreipiatės į nulinę nuorodą. Todėl tai neveikia. Norint turėti turėti dinamiškai didėjančią kolekciją, naudokite ArrayList.