Re: Porovnání řetězců
Dne 3.3.2011 17:34, Tomas Pitner napsal(a): Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). Jen pro upřesnění, ukazatele v Javě jsou, jsou to všechny objektové proměnné. To co v Javě není je ukazatelová aritmetika. Tj. v Céčku jde udělat struct bla *p; struct bla a[10]; p = a[3]; //p ukazuje na a[3] p = p + 1; //p ukazuje na a[4] p++; //p ukazuje na a[5] kdežto v Javě lze do ukazatele jedině přiřadit jiný ukazatel nebo null. Při předávání parametrů do metod se předávají všechny parametry hodnotou, primitivní i objektové, takže při použití Bla bla = new Bla(1); nejakaMetoda(bla); System.out.println(bla); ... public void nejakaMetoda(Bla par) { par = new Bla(2); return; } se vytiskne obsah instance inicializované s Bla(1), jelikož se sice do parametru par předala kopie ukazatele na Bla(1) a pak byla v těle metody přepsána hodnotou ukazatele na Bla(2), ale na původní proměnnou bla to nemá vliv. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 -- smime.p7s Description: S/MIME Cryptographic Signature
Re: Porovnání řetězců
Jen bych doplil, pokud by string nebyl immutable a mel funkci clear, append, pak by se vse promitlo i v system.out.print();, ale protoze je immutable, predana reference je zahozena kazdou upravou a nahrazena novou.tj obsah starsi reference se nezmeni, ale dochazi ke zkopirovani puvodni a jeji uprave. PP On 03/04/2011 11:09 AM, Martin Kuba wrote: Dne 3.3.2011 17:34, Tomas Pitner napsal(a): Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). Jen pro upřesnění, ukazatele v Javě jsou, jsou to všechny objektové proměnné. To co v Javě není je ukazatelová aritmetika. Tj. v Céčku jde udělat struct bla *p; struct bla a[10]; p = a[3]; //p ukazuje na a[3] p = p + 1; //p ukazuje na a[4] p++; //p ukazuje na a[5] kdežto v Javě lze do ukazatele jedině přiřadit jiný ukazatel nebo null. Při předávání parametrů do metod se předávají všechny parametry hodnotou, primitivní i objektové, takže při použití Bla bla = new Bla(1); nejakaMetoda(bla); System.out.println(bla); ... public void nejakaMetoda(Bla par) { par = new Bla(2); return; } se vytiskne obsah instance inicializované s Bla(1), jelikož se sice do parametru par předala kopie ukazatele na Bla(1) a pak byla v těle metody přepsána hodnotou ukazatele na Bla(2), ale na původní proměnnou bla to nemá vliv. Makub -- Petr Prikryl --- petrprik...@centrum.cz prik...@admin24.cz www.admin24.cz
Re: Porovnání řetězců
Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost.
Re: Porovnání řetězců
Dne 4.3.2011 13:56, michal.niko...@elanor.cz napsal(a): Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost. To není ukazatelová aritmetika. To jenom ukazuje, že pomocí nativních metod se dá přistupovat k paměti přímo, ale to je tím, že ty nativní metody jsou napsané v Céčku. Definice té metody Unsafe.putChar() totiž vypadá takto: public native void putChar(long address, char x); Stejně tak můžu pomocí nativní metody přistupovat k nějaké speciální vlastnosti nějakého operačního systému, třeba sdílené paměti mezi procesy nebo k nastavování práv na unixovém filesystému, ale tím se to nestává součástí Javy jakožto jazyka. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 -- smime.p7s Description: S/MIME Cryptographic Signature
Re: Porovnání řetězců
Nerad bych tady vyvolal nějakou flame war, ale ukazatelová aritmetika to podle mého názoru je. Např. v metodě writeToMem je p ukazatel (obsahuje adresu) a k tomuto ukazateli se přičítá 2, tj. sečte se ukazatel a int a výsledkem je ukazatel: static void writeToMem(Unsafe u, long p, byte[] values) { for (byte b : values) { u.putChar(p, (char) b); p += 2; } } Jinak celý článek byl napsán spíš jako vtip, než že by chtěl popisovat nějakou neznámou vlastnost Javy. Z. -- Zdenek Tronicek FIT CTU in Prague Martin Kuba napsal(a): Dne 4.3.2011 13:56, michal.niko...@elanor.cz napsal(a): Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost. To není ukazatelová aritmetika. To jenom ukazuje, že pomocí nativních metod se dá přistupovat k paměti přímo, ale to je tím, že ty nativní metody jsou napsané v Céčku. Definice té metody Unsafe.putChar() totiž vypadá takto: public native void putChar(long address, char x); Stejně tak můžu pomocí nativní metody přistupovat k nějaké speciální vlastnosti nějakého operačního systému, třeba sdílené paměti mezi procesy nebo k nastavování práv na unixovém filesystému, ale tím se to nestává součástí Javy jakožto jazyka. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 --
Re: Porovnání řetězců
Samozrejme ze to neni ukazatelova aritmetika. Z pohledu jazyka je to aritmetika celociselna. A index v poli IMHO neni ukazatel. Semanticky totez by se dalo jednoduse naprogramovat nad polem, vzdyt ArrayList je de facto totez. A jeste jedna perlicka na zaver: predstavte si JVM naimplementovane nad turingovym strojem a nebo, coz bude jasnejsi, pomoci konecneho automatu. Nebo cehokoli jineho, co neni naimplementovano dle von Neumanna. A udelat to samozrejme lze. Proto je take Unsafe v sun.misc . Dne 4. března 2011 19:01 Zdeněk Troníček troni...@fit.cvut.cz napsal(a): Nerad bych tady vyvolal nějakou flame war, ale ukazatelová aritmetika to podle mého názoru je. Např. v metodě writeToMem je p ukazatel (obsahuje adresu) a k tomuto ukazateli se přičítá 2, tj. sečte se ukazatel a int a výsledkem je ukazatel: static void writeToMem(Unsafe u, long p, byte[] values) { for (byte b : values) { u.putChar(p, (char) b); p += 2; } } Jinak celý článek byl napsán spíš jako vtip, než že by chtěl popisovat nějakou neznámou vlastnost Javy. Z. -- Zdenek Tronicek FIT CTU in Prague Martin Kuba napsal(a): Dne 4.3.2011 13:56, michal.niko...@elanor.cz napsal(a): Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost. To není ukazatelová aritmetika. To jenom ukazuje, že pomocí nativních metod se dá přistupovat k paměti přímo, ale to je tím, že ty nativní metody jsou napsané v Céčku. Definice té metody Unsafe.putChar() totiž vypadá takto: public native void putChar(long address, char x); Stejně tak můžu pomocí nativní metody přistupovat k nějaké speciální vlastnosti nějakého operačního systému, třeba sdílené paměti mezi procesy nebo k nastavování práv na unixovém filesystému, ale tím se to nestává součástí Javy jakožto jazyka. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 -- -- Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com
Re: Porovnání řetězců
Je a neni to pointerova aritmetika. Pravda je asi obou stranach (i jak psal Makub). Jde o to jak se na to clovek diva. Pokud napisu WebService proxy co ma stejny interface jako Unsafe a proxy na vzdalenem serveru bude v C provadet stejne operace v pameti (jako Unsafe). Tak to sice bude pointerova aritmetika, ale jen z pohledu serveru. Z pohledu klienta nic zvlastniho nedelam. Pres JNI jde delat cokoliv. Doufam ze tohle nejde spustit treba z Appletu, jinak je to asi pekny security hole. Petr __ Od: Zdeněk Troníček troni...@fit.cvut.cz Komu: Java konference@java.cz Datum: 04.03.2011 19:02 Předmět: Re: Porovnání řetězců Nerad bych tady vyvolal nějakou flame war, ale ukazatelová aritmetika to podle mého názoru je. Např. v metodě writeToMem je p ukazatel (obsahuje adresu) a k tomuto ukazateli se přičítá 2, tj. sečte se ukazatel a int a výsledkem je ukazatel: static void writeToMem(Unsafe u, long p, byte[] values) { for (byte b : values) { u.putChar(p, (char) b); p += 2; } } Jinak celý článek byl napsán spíš jako vtip, než že by chtěl popisovat nějakou neznámou vlastnost Javy. Z. -- Zdenek Tronicek FIT CTU in Prague Martin Kuba napsal(a): Dne 4.3.2011 13:56, michal.niko...@elanor.cz napsal(a): Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost. To není ukazatelová aritmetika. To jenom ukazuje, že pomocí nativních metod se dá přistupovat k paměti přímo, ale to je tím, že ty nativní metody jsou napsané v Céčku. Definice té metody Unsafe.putChar() totiž vypadá takto: public native void putChar(long address, char x); Stejně tak můžu pomocí nativní metody přistupovat k nějaké speciální vlastnosti nějakého operačního systému, třeba sdílené paměti mezi procesy nebo k nastavování práv na unixovém filesystému, ale tím se to nestává součástí Javy jakožto jazyka. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 --
Re: Porovnání řetězců
První parametr metody putChar je adresa, ne index do pole: public native void putChar(long address, char x); Z. -- Zdenek Tronicek FIT CTU in Prague Oto Buchta napsal(a): Samozrejme ze to neni ukazatelova aritmetika. Z pohledu jazyka je to aritmetika celociselna. A index v poli IMHO neni ukazatel. Semanticky totez by se dalo jednoduse naprogramovat nad polem, vzdyt ArrayList je de facto totez. A jeste jedna perlicka na zaver: predstavte si JVM naimplementovane nad turingovym strojem a nebo, coz bude jasnejsi, pomoci konecneho automatu. Nebo cehokoli jineho, co neni naimplementovano dle von Neumanna. A udelat to samozrejme lze. Proto je take Unsafe v sun.misc . Dne 4. března 2011 19:01 Zdeněk Troníček troni...@fit.cvut.cz napsal(a): Nerad bych tady vyvolal nějakou flame war, ale ukazatelová aritmetika to podle mého názoru je. Např. v metodě writeToMem je p ukazatel (obsahuje adresu) a k tomuto ukazateli se přičítá 2, tj. sečte se ukazatel a int a výsledkem je ukazatel: static void writeToMem(Unsafe u, long p, byte[] values) { for (byte b : values) { u.putChar(p, (char) b); p += 2; } } Jinak celý článek byl napsán spíš jako vtip, než že by chtěl popisovat nějakou neznámou vlastnost Javy. Z. -- Zdenek Tronicek FIT CTU in Prague Martin Kuba napsal(a): Dne 4.3.2011 13:56, michal.niko...@elanor.cz napsal(a): Jen bych doplnil, takovou libustku, ktera ukazuje, ze i Java ma ukazatelovou aritmetiku. http://www.java.cz/article/ukazatelovaaritmetika Ale je to opravdu jen takova zajimavost. To není ukazatelová aritmetika. To jenom ukazuje, že pomocí nativních metod se dá přistupovat k paměti přímo, ale to je tím, že ty nativní metody jsou napsané v Céčku. Definice té metody Unsafe.putChar() totiž vypadá takto: public native void putChar(long address, char x); Stejně tak můžu pomocí nativní metody přistupovat k nějaké speciální vlastnosti nějakého operačního systému, třeba sdílené paměti mezi procesy nebo k nastavování práv na unixovém filesystému, ale tím se to nestává součástí Javy jakožto jazyka. Makub -- ~~ Supercomputing Center Brno Martin Kuba Institute of Computer Scienceemail: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 -- -- Oto 'tapik' Buchta, ta...@buchtovi.cz, http://tapikuv.blogspot.com
Porovnání řetězců
Dobrý den! Dneska jsem se zarazil nad jedním problém ke kterému neumím nalést vysvětlení. Proto bych se chtěl tímto zeptat zkušenějších. Mám tento program: public class SchedulerLauncher { public static void main(String[] args) { if (args[0].equals(-h)) { // a) vyhodnoceno na true //if (args[0] == -h) { // b) vyhodnoceno na false-proč? System.out.println(...sem prijde napoveda...); } } } Ten spustím jako $ java SchedulerLauncher -h. Čekal bych, že obě podmínky a) i b) jsou rovnocené, ale jen ta a) s využitím String.equals() je se vyhodnotí jako pravda. Proč ne ta druhá? Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). args[0] je vlastně reference na objekt String v paměti. A -h čili new String(-h) je též reference, ale na jiný objekt, byť textový obsah je stejný. Operátor == porovnává adresy (referrence), nikoli vlastnosti objektu. Vysvětluji si to správně? Díky. Libor
Re: Porovnání řetězců
Ano, odpovedel jste si spravne. -- Tomas Pitner 2011/3/3 Libor Jelinek ljeli...@virtage.com: Dobrý den! Dneska jsem se zarazil nad jedním problém ke kterému neumím nalést vysvětlení. Proto bych se chtěl tímto zeptat zkušenějších. Mám tento program: public class SchedulerLauncher { public static void main(String[] args) { if (args[0].equals(-h)) { // a) vyhodnoceno na true //if (args[0] == -h) { // b) vyhodnoceno na false-proč? System.out.println(...sem prijde napoveda...); } } } Ten spustím jako $ java SchedulerLauncher -h. Čekal bych, že obě podmínky a) i b) jsou rovnocené, ale jen ta a) s využitím String.equals() je se vyhodnotí jako pravda. Proč ne ta druhá? Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). args[0] je vlastně reference na objekt String v paměti. A -h čili new String(-h) je též reference, ale na jiný objekt, byť textový obsah je stejný. Operátor == porovnává adresy (referrence), nikoli vlastnosti objektu. Vysvětluji si to správně? Díky. Libor
Re: Porovnání řetězců
Zkuste před porovnáním zavolat na obou String objektech intern() a vyjde druhý if jako true. Ale to jen abych vás navedl na vyjasnění si principu fungování stringu v Javě. Správně by se mělo porovnávat přes equals - s tím se nespalite. H. Dne 3.3.2011 17:34 Tomas Pitner t...@fi.muni.cz napsal(a): Ano, odpovedel jste si spravne. -- Tomas Pitner 2011/3/3 Libor Jelinek ljeli...@virtage.com: Dobrý den! Dneska jsem se zarazil nad jedním problém ke kterému neumím nalést vysvětlení. Proto bych se chtěl tímto zeptat zkušenějších. Mám tento program: public class SchedulerLauncher { public static void main(String[] args) { if (args[0].equals(-h)) { // a) vyhodnoceno na true //if (args[0] == -h) { // b) vyhodnoceno na false-proč? System.out.println(...sem prijde napoveda...); } } } Ten spustím jako $ java SchedulerLauncher -h. Čekal bych, že obě podmínky a) i b) jsou rovnocené, ale jen ta a) s využitím String.equals() je se vyhodnotí jako pravda. Proč ne ta druhá? Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). args[0] je vlastně reference na objekt String v paměti. A -h čili new String(-h) je též reference, ale na jiný objekt, byť textový obsah je stejný. Operátor == porovnává adresy (referrence), nikoli vlastnosti objektu. Vysvětluji si to správně? Díky. Libor
Re: Porovnání řetězců
Jeste drobnost: casto lepsi psat abc.equals(s) nez s.equals(abc). Druha varianta vyhodi vyjimku pro s == null. S pozdravem Ondřej Nekola 2011/3/3 Libor Jelinek ljeli...@virtage.com: Dobrý den! Dneska jsem se zarazil nad jedním problém ke kterému neumím nalést vysvětlení. Proto bych se chtěl tímto zeptat zkušenějších. Mám tento program: public class SchedulerLauncher { public static void main(String[] args) { if (args[0].equals(-h)) { // a) vyhodnoceno na true //if (args[0] == -h) { // b) vyhodnoceno na false-proč? System.out.println(...sem prijde napoveda...); } } } Ten spustím jako $ java SchedulerLauncher -h. Čekal bych, že obě podmínky a) i b) jsou rovnocené, ale jen ta a) s využitím String.equals() je se vyhodnotí jako pravda. Proč ne ta druhá? Tuším, že to bude jistě něco s ukazateli (promiňte mi ten výraz, vím v Javě nejsou). args[0] je vlastně reference na objekt String v paměti. A -h čili new String(-h) je též reference, ale na jiný objekt, byť textový obsah je stejný. Operátor == porovnává adresy (referrence), nikoli vlastnosti objektu. Vysvětluji si to správně? Díky. Libor