• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak głęboko skopiować tablice stringów Javie

Object Storage Arubacloud
0 głosów
168 wizyt
pytanie zadane 26 lipca 2015 w Java przez mateusz.poreba Początkujący (300 p.)
przywrócone 26 lipca 2015 przez mateusz.poreba

Jak głęboko skopiować tablice stringów Javie? Próbuje w ten sposób ale coś jest nie tak:

String [] tab = {"a", "b"};
String [] tab2;

for(int i = 0; i < tab.length -1; i++)
{
  tab2[i] = tab[i];
}

 

3 odpowiedzi

+2 głosów
odpowiedź 26 lipca 2015 przez nowyfolder Mądrala (7,250 p.)

Oczywiście że tak nie da się skopiować tablicy.

[dygresja]

Problemem Javy jest to, że każdy twierdzi, iż nie ma tam wskaźników, podczas gdy tak naprawdę, to prawie wszystko to wskaźnik, tylko że ukryty. I tak właśnie trzeba traktować każdy "obiekt", który tak na prawdę jest wskaźnikiem na właściwy obiekt.

[/dygresja]

Biorąc to pod uwagę, można bez problemu zrozumieć, co się dzieje gdy piszemy tab2 = tab1. Jedyne co wtedy kopiujemy, to adres tab2 do tab1, co skutkuje tylko tym, że oba obiekty(czyli wskaźniki) wskazują na ten sam obiekt tablicy(tak, w Javie tablica to też obiekt).

Aby skopiować tablicę, można użyć metody System.arraycopy():
https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#arraycopy-java.lang.Object-int-java.lang.Object-int-int-

lub jednej z metod copy() klasy Arrays:

https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html


To jest pierwszy krok. Skopiowaliśmy tablicę. Ale zaraz, co jest w środku tablicy? Otóż obiekty klasy String, czyli wskaźniki na właściwe obiekty. Skopiowalismy tylko wskaźniki.

W tym przypadku jednak to wystarczy, ponieważ String jest obiektem stałym, nie da się go zmienić. W ogólnym przypadku, trzebaby jednak ręcznie skopiować obiekty, na przykład jakimś rodzajem konstruktora kopiującego.
 

0 głosów
odpowiedź 26 lipca 2015 przez mateusz.poreba Początkujący (300 p.)

Muszę zainicjalizować najpierw zmienną tab2

String [] tab2 = new String[tab.length];

 

0 głosów
odpowiedź 26 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 26 lipca 2015 przez Dorion300

Trzeba stworzyć jeszcze tab2 za pomocą "new"

Więc powinno być:

String [] tab2 = new String[2];
//albo
String[] tab2 = new String[tab.length];

 

Podobne pytania

0 głosów
2 odpowiedzi 122 wizyt
pytanie zadane 29 lutego 2016 w Java przez Wilier Bywalec (2,570 p.)
0 głosów
1 odpowiedź 2,624 wizyt
pytanie zadane 29 grudnia 2018 w Java przez msukiennik Początkujący (380 p.)
0 głosów
1 odpowiedź 301 wizyt
pytanie zadane 30 grudnia 2016 w Java przez 0xf Dyskutant (8,180 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...