Re: Porovnání řetězců

2011-03-04 Tema obsahu Martin Kuba

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ů

2011-03-04 Tema obsahu Petr Prikryl
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ů

2011-03-04 Tema obsahu Michal . Nikodim
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ů

2011-03-04 Tema obsahu Martin Kuba

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ů

2011-03-04 Tema obsahu Zdeněk Troníček
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ů

2011-03-04 Tema obsahu Oto Buchta
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ů

2011-03-04 Tema obsahu Petr Synek

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ů

2011-03-04 Tema obsahu Zdeněk Troníček
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ů

2011-03-03 Tema obsahu Libor Jelinek
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ů

2011-03-03 Tema obsahu Tomas Pitner
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ů

2011-03-03 Tema obsahu Ing . Jan Novotný
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ů

2011-03-03 Tema obsahu Ondrej Nekola
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