» »

[Java] Tezave s stringom

[Java] Tezave s stringom

alum ::

Pocasi izgubljam zivce, pa nevem kaj je narobe...

Je med dvema stringoma (prvim podanim direktno, torej String pin = "0000", in drugim prebranim iz TextFielda z metodo getText()), kaksna razlika?

String pin sluzi kot argument v metodi najdiBancniRacun( pin) ... metoda vrne zeljen rezultat, ce je string vnesen direktno, in nezeljen, ce je vnesen preko TextFielda...

zakaj prihaja do razlike? oba stringa sta vnesena identicno, razen ce TextField doda "kaj svojega", prostemu ocesu nevidnega (izpis obeh ni pokazal razlike, prav tako funkcija contentEquals vrne vrednost true...

izcrpal sem svoje ideje in vec nevem, kaj naj poskusim...

CCfly ::

Rečem lahko le, pokaži kodo.
"My goodness, we forgot generics!" -- Danny Kalev

alum ::

koda, povezana s tem...malo prirejena za testiranje

private TextField tfVpisGesla = new TextField ( "" );

btnPotrdi.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e){
String tmp = tfVpisGesla.getText();
System.out.println( banka.najdiBancniRacun( tmp ) );
}
});

v tem primeru mi izpise, da banka.najdiBancniRacun(tmp) kaze na null...

private TextField tfVpisGesla = new TextField ( "" );

btnPotrdi.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e){
String tmp = "0000";
System.out.println( banka.najdiBancniRacun( tmp ) );
}
});

v tem primeru mi izpise pravo referenco, tako da neverjamem, da je kaj narobe z metodo najdiBancniRacun...ampak ziher je ziher no...


public BancniRacun najdiBancniRacun(String pin){

for(int i=0; i < stevec; i++){
if(tabela[i].getPin() == pin)
return tabela[i] ;


}

return null ;


}

eto...

JerKoJ ::

Hmm mal sumljivo vse skupi
ocitno se na pointerje ne zastops prevec
Stringov nikoli (nikoli) ne gres primerjat z ==
mas ostale operatorje recimo string.equals mi pade na pamet

verjetno si tudi tabelo nafilu podobno kot String tmp="konstantno"
in zato oba kazeta na isti pointer (kompiler zoptimizira da je oba
kazeta na isto lokacijo), ce pa vrednost preberes iz getText
pol pa pointerja nista enaka ceprav vsebina je

torej stringov nikoli (nikoli) ne primerjaj z ==

Nerdor ::

String-e se primerja s metodo equals(). Recimo: ZeljeniString.equals(IskaniString);
Če primerjaš stringe s "==" operatorjem, primerjaš njihove reference v samem Heapu od Java VM. Ta pa je seveda zmeraj različen, saj imata dva Stringa različna naslova.

Če bi pa napravil recimo:
String NekiString = "Neko besedilo!";
String DrugiString = null; //ne kaze nikamor

NekiString = DrugiString; //imata isti naslov v Heap-u od Java VM

if (NekiString == DrugiString) {
// tukaj se bi uzvedel blok, ker je bi "==" vrnil "true"
// pač oba stringa kažeta na isto lokacijo v spominu
// in ISTO vsebino.
}

Za tvoj primer bi pa napravil recimo:
String NekiString = "Neko besedilo!";
String DrugiString = "Neko besedilo!";

if (NekiString.equals(DrugiString)) {
// tukaj se bi uzvedel blok, ker imata oba Stringa ENAKO vsebino
// in različne naslove v Heap-u
}

Vir informacije.
... for lifetime!

Zgodovina sprememb…

  • spremenil: Nerdor ()

Nerdor ::

Tukaj se sama ponuja primerjava z jezikom C#. Namreč, ker jezik C# ponuja overloadanje operatorjev, je možno pri "string" objektih jih primerjati s "==". Ker ima ta .Net platforma za delo z "string" podatkovnim tipom že po defaultu overloadan "==" operator s "Equals()" in "CompareTo()" metodami. Lahko pa pravtako, kot v javi primerjaš stringe z omenjenimi metodami. Java, pač (še) ne podpira overloadanje operatorjev, zato je treba za vsebinsko preverjanje dveh stringov uporabiti "eguals()" ali "compareTo()" metode. :)
... for lifetime!

Zgodovina sprememb…

  • spremenil: Nerdor ()

Gadjit ::

Java ne podpira in ne dovoljuje "pointerjev".
Argumenti se v metode prenašajo na dva načina:
1. call-by-value
2. call-by-reference

V tvojem primeru gre za dva različna Stringa, ker "0000" (dolžina 4 znaki) NI enako "" (dolžina 0 znakov).
Primerjave med stringi delaš pa kot že omenjeno z equals ali indexof.
Maja love U forever!

Sergio ::

Gadjit: aha, call-by-reference pa ni pointer? Hehe :)


V Javi so VSE pointerji, razen primitivnih tipov.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

JerKoJ ::

@Nerdor :

> Za tvoj primer bi pa napravil recimo:
>String NekiString = "Neko besedilo!";
>String DrugiString = "Neko besedilo!";

>if (NekiString.equals(DrugiString)) {
>// tukaj se bi uzvedel blok, ker imata oba Stringa ENAKO vsebino
>// in različne naslove v Heap-u
>}

ta primer je lih dvomljiv, ker v kodi podas konstanti, ki sta enaki ("Neko besedilo!") in kompiler to zoptimizira tako
da NekiString in DrugiString kazeta na isti naslov in bi tudi primerjava z == vrnila true, to se je verjetno zgodilo
tudi wakumu, ker je nekje v kodi naredil tabela[i].setPin("0000") in kasneje String tmp="0000", tako mu je potem
celo uspelo z == narediti true.

No sam tok da vso stvar se mal zakompliciramo :D

alum ::

popravljeno. hvala

Gadjit ::

Sergio: Nimam rad besede kazalec.. V Javi reference (po tvoje kazalzi oz. pointerji) niso isto kot kazalci v c++!

HeHe: "V Javi so VSE pointerji, razen primitivnih tipov." Preber kako knjigo hm o Javi.
Maja love U forever!

Sergio ::

Ja, prebral sm ze kaksno knjigo o Javi. In ne vem, ce se ocitno ne strinjas z mano, poskusi potem narest en ArrayList, notri vrzi tri Stringe, podaj ArrayList po VREDNOSTI v funkcijo (with a magic wand, no shallow/deep clones permitted), dodaj v ArrayList se en string, pa se vrni iz funkcije.

Zataknilo se ti bo pri podajanju arraylista po vrednosti. Zato ker si ti v funkcijo vrgel pointer (ne, ne bom rekel referenca ;-)), in znotraj funkcije operiras nad isto instanco.

Zdej mi pa povej, zakaj menis, da v Javi niso vse pointerji (razen primitivnih objektov). Spet zanalasc nisem uporabil besede referenca.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Gadjit ::

Eh c++ se mi je mal zameru, ker nikol nisn točn vedu ka mam al pom. naslov al vrednost al kazalec kazalca..
No sej nisn glih velik programeru c++.
No OK nej ti bo kompromis referenca - pointer = soft pointer sam veš zakaj.
Maja love U forever!

Sergio ::

Spostljivo se priklonim in sprejmem kompromis. ;-)

Sori za off-topic, though.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Bluetooth aplikacija

Oddelek: Programiranje
51019 (882) marjan_h
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142090 (1214) urosz
»

Mala pomoč pri javi

Oddelek: Programiranje
81061 (892) Serial
»

izpis integerja v appletu

Oddelek: Programiranje
6823 (754) zoune
»

novi java problemi

Oddelek: Programiranje
51145 (1005) StratOS

Več podobnih tem