webForumDet fria alternativet

Kopiera vektor

10 svar · 540 visningar · startad av kristoffer

kristofferMedlem sedan juni 20001 266 inlägg
#1

Kommer elementen i b innehålla samma värde som elementen i a i det översta exemplet nedan?

int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
int[] b = new int[3];
b = a;
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
int[] b = new int[3];
for (int i=0; i<a.length; i++)
   b[i] = a[i];

Sånt här måste man ju tänka på i C++ men hur är det i Java?

ViktorMedlem sedan aug. 20021 710 inlägg
#2

I det övre exemplet pekar båda arrayerna på samma object. Det finns altså INTE två 1'or, två 2'or, två 3'or, i det undre exemplet är det 2 olika arrayer med egna värden.

/Viktor

kristofferMedlem sedan juni 20001 266 inlägg
#3

Dvs som i C++? Är du 100% säker på det?

ViktorMedlem sedan aug. 20021 710 inlägg
#4

Mitt test program,

public class Uppgift4
{
	public static void main(String[] args)
	{
/*
		int[] a = new int[3];
		a[0] = 1;
		a[1] = 2;
		a[2] = 3;
		int[] b = new int[3];
		b = a;
		a[0]=10;
		for(int i=0;i<a.length;i++)
			System.out.println("a: "+a[i]+", B: "+b[i]);
*/
int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;
int[] b = new int[3];
for (int i=0; i<a.length; i++)
   b[i] = a[i];

		a[0]=10;
		for(int i=0;i<a.length;i++)
			System.out.println("a: "+a[i]+", B: "+b[i]);

	}
}

Visar exakt vad som händer :)
Var lite osäker när jag skrev svaret så jag testade först.

/Viktor

ViktorMedlem sedan aug. 20021 710 inlägg
#5

En sak till, om det hade varit objekt som du hade en array av (int är en primitiv datatyp) hade det varit samma resultat i exempel 2 som i 1, eftersom du då bara hade kopierat adressen av objektet i "b*=a*". Då kör du i ställer med "b*=a*.clone()". Detta är inte testat men testa gärna med String tex :)

Sammanfattning :)

= kopierar adressen om den anväds på objekt (int[] är ett objekt, int är inte ett objekt)
= kopierar värdet om det används på primitiva datatyper (int, long, char, boolean)

/Viktor****

PeWMedlem sedan juni 20006 839 inlägg
#6

I java heter det inte "peka" då det inte existerar några pekare på java-kod nivå. Däremot så skapar man referenser till objekten.

*Jaja... är man petig så är man, men det är skillnad ;)

aasahMedlem sedan mars 20033 451 inlägg
#7

Med all respekt, PEW, det är inte riktigt. Det finns pekare i Java, det är bara det att de många gånger hanteras på samma sätt som du skulle hantera en referens i C++. Detta beror dock på en av de grundläggande skillnaderna mellan språken. Men om vi t.ex. gör en tilldelning av objekt, så är det *pekare* som kopieras, inte objekten. (I annat fall har du en underlig definition, i mitt tycke, av pekare.) En helt annan sak är att man aldrig får samma problem med pekarhantering i Java som man får hur lätt som helst i C++, eftersom Javas pekare i stor utsträckning är "dolda" så till vida att de kan behandlas som vilket objekt som helst.

PeWMedlem sedan juni 20006 839 inlägg
#8

Det finns pekare i Java

Fortfarande... benämningen är inte pekare utan referens. Hur den används och att den har en funktion som en "halv pekare" (går inte att utföra aritmetik på den) håller jag med om, men att den skulle kallas för "pekare" i Java håller jag som sagt inte med om, den heter "referens" och inget annat.

Det var mao endast språkligt jag korrigerade Viktor ;)

ViktorMedlem sedan aug. 20021 710 inlägg
#9

Jag försökte bara vara tydlig eftersom han vill gämföra med C++, då kan det vara lättare om man använder namn som finns i C++ :)

/Viktor

aasahMedlem sedan mars 20033 451 inlägg
#10

PeW skrev:

Det finns pekare i Java

Fortfarande... benämningen är inte pekare utan referens...

Vi kanske har olika definitioner för begreppen? Men jag känner referens som varande något som ej ändras. En referens som tilldelas ett visst värde har det värdet, punkt slut. Så fungerar inte Javas pekare!

Att man sedan inte alls har samma funktionalitet i Javas pekare som man har i C:s/C++:s är en annan sak. Ett pris man får betala för att det är många, många gånger säkrare att hantera pekare i Java än i C++.

Å andra sidan ska vi knappast käbbla på om detta. "Agree to differ?"

PeWMedlem sedan juni 20006 839 inlägg
#11

Å andra sidan ska vi knappast käbbla på om detta. "Agree to differ?"

Who is käbbling? :e
Jag håller med det du skriver, förutom detta med att döpa en referens i Java till "pekare", då det i flera andra språk (C,C++, asm m.m) är mer entydigt i betydelse. Men visst, det tjänar nog inget till att fortsätta denna diskussion. So I agree :)

Genererad på 380 ms · cache AV · v20260730165559-full.f96bc7eb