2013-04-09 20 views
5

drukuje ten fałszywyInicjowanie z charakterem vs tablicy char

List vowelsList=Arrays.asList(new char[]{'a','e','i','o','u'}); 
System.out.println(vowelsList.contains('a'));//false 

drukuje ten prawda

List vowelsList=Arrays.asList(new Character[]{'a','e','i','o','u'}); 
System.out.println(vowelsList.contains('a'));//true 

char jest autoboxed do Character którego użył w char array initailizer..Why rano Otrzymuję różne wyniki!

+4

Ponieważ 'char []' jest traktowany jako pojedynczy parametr w 'T ... params', podczas gdy parametr' Character [] 'jest uważany za parametr tablicy dla' T ... params'. –

+3

@LuiggiMendoza: to powinna być odpowiedź. –

Odpowiedz

6

również wydrukować

vowelsList.size();

dla obu, a zobaczysz różnicę;)

Spoiler:

uniwersalnym typem pierwszej metody jest char[], więc otrzymasz listę rozmiarów jeden. Jego typ to List<char[]>. Ogólny typ twojego drugiego kodu to Character, więc twoja lista będzie miała tyle wpisów, ile tablica. Typ to List<Character>.


Aby uniknąć tego rodzaju błędów, nie używaj surowych typów! Poniższy kod nie będzie skompilować:

List<Character> vowelsList = Arrays.asList(new char[]{'a','e','i','o','u'}); 

następujące trzy linie są w porządku:

List<char[]> list1 = Arrays.asList(new char[]{'a','e','i','o','u'}); // size 1 
List<Character> list2 = Arrays.asList(new Character[]{'a','e','i','o','u'}); // size 5 
List<Character> list3 = Arrays.asList('a','e','i','o','u'); // size 5 
+0

ładna wskazówka ... Czuję się głupio! – Anirudha

+0

Teraz wygląda dobrze –

1

Jak @jlordo (+1) powiedział twój błąd jest w zrozumieniu tego, co robi Twoja lista zawierać. W pierwszym przypadku zawiera jeden element typu char[], więc nie zawiera elementu char element a. W drugim przypadku zawiera 5 Character elementów "a", "e", "i", "o", "u", więc wynikiem jest true.