Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Verificare ultimul caracter dintr-un String
#19
Posted 17 July 2017 - 13:47
Nici nu știu de unde să încep.
1. Tu te-ai plâns de faptul că soluția simplă cu set-uri dată de mine ar fi incorectă, că ar schimba sexul lui "Carmen", ești lămurit că din punct de vedere al corectitudinii, ce am zis eu nu schimbă sex-ul lui "Carmen"? 2. Știi care sunt proprietățiile unui set? Mă refer în special la inserare, căutare? 3. De ce ai impresia că un set este neapărat implementat ca o listă? 4. Știi care sunt diferențele între un array și un set la căutare? 5. Știi care sunt diferențele între un array și o listă la căutare, inserare? 6. OK, charAt(), poate arunca o excepție. În cazul de față, unde charAt() este apelat nume.charAt(nume.length()-1), excepția va fi aruncată doar atunci când nume are lungimea 0, adică nume este stringul gol, "". Din punctul meu de vedere, dacă nume este un string "" este o eroare de logică care ar trebui tratată în momentul în care este instanțiat string-ul respectiv, deci nu ar trebui luat în vedere acest caz în situația de față. 7. Ești conștient că char[] ta = value; respectiv char[] pa = prefix.value, sunt copieri de REFERINȚE, adică NU se alocă un array nou de char[], NU se apelează System.arraycopy() și nici NU se apelează constructorul clasei String? 8. Ești conștient că, dacă ai String tavitu = "nu sunt chiar asa de prost", în Java, acel string literal va fi salvat în String Pool, și că referința tavitu doar indică poziția acelui string literal în String Pool? 9. Ești sigur că nu faci confuzie între C++ și Java sau alt limbaj? |
#20
Posted 17 July 2017 - 14:13
lightpoint, on 17 iulie 2017 - 12:31, said:
Fals. Uite aici codul sursa al metodei charAt(...) Inn java, sa folosesti o metoda care arunca posibile exceptii intr-o bucla la fel de rau ca regexp-patternurile folosite intr-o bucla. lightpoint, on 17 iulie 2017 - 12:31, said:
Culmea este ca metoda propusa de tine invoca aceaisi metoda propusa de mine =)) codul sursa al metodei startsWith din clasa String: public boolean startsWith(String prefix, int toffset) { char ta[] = value; // <-atentie la linia asta int to = toffset; char pa[] = prefix.value; // <- si la linia asta [...] }Constructorul clasei String pe care il apeleaza JVM(vezi la sfarsitul postului de ce si cum ) : public String(char[] value) { this.value = Arrays.copyOf(value, value.length); } public static char[] copyOf(char[] original, int newLength) { char[] copy = new char[newLength]; System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength)); // ia uite pe cine avem noi aici return copy; }Ai inteles ceva ? Presupunand ca nu , atunci mai este nevoie sa-ti zic ca daca in java scriu String tavitu = "habar n-are", JVM-ul vine si face asa: char[] a = { 'h','a', 'b', 'a', 'r',' ',' n',' -',' a', 'r', 'e'} si apoi apelaza clasa String cu constructorul avand signatura String(char[]) care, conform codului de mai sus, apeleaza System.arraycopy Atunci cand JVM intalneste String str = "xyz" pur si simplu atribuie array-ul {'x', 'y', 'z'} direct catre private final char value[];fara sa apeleze nimic Metoda public String(char[] value) este apelata doar daca faci o chestie de genul String s = new String(new char[]{'a', 'b'});sau ii pasezi o variabila char[]. Toate chestiile se pot verifica cu un debugger si step into. |
#21
Posted 17 July 2017 - 14:33
IllusiveMan, on 17 iulie 2017 - 14:13, said: Atunci cand JVM intalneste String str = "xyz" pur si simplu atribuie array-ul {'x', 'y', 'z'} direct catre private final char value[];fara sa apeleze nimic value ala este private, adica nu se poate accesa decat printr-un constructor (daca exista unul facut care sa-l acceseze).In rest campurile private se poat accesa doar de catre metodele clasei https://docs.oracle..../variables.html Quote
Metoda public String(char[] value) este apelata https://docs.oracle....nstructors.html Quote
doar daca faci o chestie de genul String s = new String(new char[]{'a', 'b'});sau ii pasezi o variabila char[]. Mai sa fie acum ai descoperit si tu apa calda. |
#22
Posted 17 July 2017 - 14:44
lightpoint, on 17 iulie 2017 - 14:33, said:
Atunci cand JVM instalneste String str = "xyz" apeleaza constructorul cu signatura String(char[]); value ala este private, adica nu se poate accesa decat printr-un constructor (daca exista unul facut care sa-l acceseze).In rest campurile private se poat accesa doar de catre metodele clasei https://docs.oracle..../variables.html lightpoint, on 17 iulie 2017 - 14:33, said:
value ala este private, adica nu se poate accesa decat printr-un constructor (daca exista unul facut care sa-l acceseze). lightpoint, on 17 iulie 2017 - 14:33, said:
Da, scuze. Atat ca = "sdsd" nu se pupa cu absolut nicio semnatura.
|
#23
Posted 17 July 2017 - 14:51
tavitu, on 17 iulie 2017 - 13:47, said:
Nici nu știu de unde să încep. Quote
1. Tu te-ai plâns de faptul că soluția simplă cu set-uri dată de mine ar fi incorectă, că ar schimba sexul lui "Carmen", ești lămurit că din punct de vedere al corectitudinii, ce am zis eu nu schimbă sex-ul lui "Carmen"? 2. Știi care sunt proprietățiile unui set? Mă refer în special la inserare, căutare? 3. De ce ai impresia că un set este neapărat implementat ca o listă? 4. Știi care sunt diferențele între un array și un set la căutare? 5. Știi care sunt diferențele între un array și o listă la căutare, inserare? Pentru stocare avem array-uri , pentru stocare in vederea prelucrari avem liste; ce faci tu este un antipattern. Quote
6. OK, charAt(), poate arunca o excepție. În cazul de față, unde charAt() este apelat nume.charAt(nume.length()-1), excepția va fi aruncată doar atunci când nume are lungimea 0 , adică nume este stringul gol, "". Din punctul meu de vedere, dacă nume este un string "" este o eroare de logică care ar trebui tratată în momentul în care este instanțiat string-ul respectiv, deci nu ar trebui luat în vedere acest caz în situația de față. Ceea ce faci tu este iarasi un antipattern, indiferent de justificare. Quote
7. Ești conștient că char[] ta = value; respectiv char[] pa = prefix.value, sunt copieri de REFERINȚE, adică NU se alocă un array nou de char[], NU se apelează System.arraycopy() și nici NU se apelează constructorul clasei String? Quote
8. Ești conștient că, dacă ai String tavitu = "nu sunt chiar asa de prost", în Java, acel string literal va fi salvat în String Pool, și că referința tavitu doar indică poziția acelui string literal în String Pool? IllusiveMan, on 17 iulie 2017 - 14:44, said:
Fals total! Ti-am zis, se poate verfica in debugger cu step into. Absolut niciun constructor nu e apelat atunci. JVM poate face absolut orice. Inclusiv sa schimbe implementarea scrisa in codul sursa cu alta mai eficienta, sa apeleze la diverse mecanisme si instrumente interne cu care nu are treaba programatorul cand scrie codul. Da, scuze. Atat ca = "sdsd" nu se pupa cu absolut nicio semnatura. In rest ura si la gara. |
#24
Posted 17 July 2017 - 15:13
Uite aici explicatii la obiect:
Java Code: Quote
String one = "abc"; String two = "abc"; Class constant pool Each class has its own constant pool - a list of constant values that can be reused if they occur several times in the source code. It includes common strings, numbers, method names, etc. Here are the contents of the constant pool in our example above: const #2 = String #38; // abc //... const #38 = Asciz abc; Byte Code ldc #2; //String abc astore_1 //one ldc #2; //String abc astore_2 //two Literal and new String() Java code Now the example we all waited for - one string literal and one new String using the same literal. How will this work? String one = "abc"; String two = new String("abc"); Byte code ldc #2; //String abc astore_1 //one new #3; //class java/lang/String dup ldc #2; //String abc invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)V astore_2 //two Look carefully! The first object is created the same way as above, no surprise. It just takes a constant reference to already created String (#2) from the constant pool. However the second object is created via normal constructor call. https://dzone.com/ar...emory-internals Constant pool-ul e toata smercheria... ceva lamuriri din JVM Spec: Quote
4.4. The Constant Pool Java Virtual Machine instructions do not rely on the run-time layout of classes, interfaces, class instances, or arrays. Instead, instructions refer to symbolic information in the constant_pool table. All constant_pool table entries have the following general format: cp_info { u1 tag; u1 info[]; } Each item in the constant_pool table must begin with a 1-byte tag indicating the kind of cp_info entry. The contents of the info array vary with the value of tag. The valid tags and their values are listed in Table 4.3. Each tag byte must be followed by two or more bytes giving information about the specific constant. The format of the additional information varies with the tag value. Table 4.3. Constant pool tags Constant Type Value CONSTANT_Class 7 CONSTANT_Fieldref 9 CONSTANT_Methodref 10 CONSTANT_InterfaceMethodref 11 CONSTANT_String 8 CONSTANT_Integer 3 CONSTANT_Float 4 CONSTANT_Long 5 CONSTANT_Double 6 CONSTANT_NameAndType 12 CONSTANT_Utf8 1 CONSTANT_MethodHandle 15 CONSTANT_MethodType 16 CONSTANT_InvokeDynamic 18 [...] Quote To derive a string literal, the Java Virtual Machine examines the sequence of code points given by the CONSTANT_String_info structure. If the method String.intern has previously been called on an instance of class String containing a sequence of Unicode code points identical to that given by the CONSTANT_String_info structure, then the result of string literal derivation is a reference to that same instance of class String. Otherwise, a new instance of class String is created containing the sequence of Unicode code points given by the CONSTANT_String_info structure; a reference to that class instance is the result of string literal derivation. Finally, the intern method of the new String instance is invoked. http://docs.oracle.c...5.html#jvms-5.1 |
#25
Posted 31 July 2017 - 15:40
Ceea ce spui tu mai sus i se spune in OOP : object interning.Ca sunt stringuri sau alte tipuri de date este alta problema.
Acum in cazul nostru avand Stringuri , avem de a face cu string interning. https://en.wikipedia...tring_interning Beleaua este pt a face String interning in Java, trebuie sa aplici metoda .intern() a obiectului. Cum as putea aplica o metoda asupra unui obiect care nu exista ? .N-ai cum. ? Cum sa exista metoda obiectului inaintea obiectului ? N-ai cum. Cei de la Dzone,, pe care i-ai citit vin si zic: https://dzone.com/ar...ng-what-why-and Ii citez: "In Java, String class has a public method intern() that returns a canonical representation for the string object. Java’s String class privately maintains a pool of strings, where String literals are automatically interned." But wait, there is more: "When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned" Deci avem de-a face cu un pool care deja contine obiecte de tip String si care sunt servite fiecarui instante ale clasei String(care la randul lor sunt tot obiecte de tip String). Cineva poate sa zica ca poolul are constante de tip String, insa in OOP , o constanta este un obiect imutabil dereferentiat de catre un pointer, iar daca l-am mai facut si "final" atunci si pointerul devine imutabil. Bye. PS: sorry pt reply-ul intarziat, dar am fost prins in sprint-uri succesive JIRA succesive si n-am putut intra mai devreme Edited by lightpoint, 31 July 2017 - 15:49. |
#26
Posted 01 August 2017 - 15:20
lightpoint, on 31 iulie 2017 - 15:40, said:
Ceea ce spui tu mai sus i se spune in OOP : object interning.Ca sunt stringuri sau alte tipuri de date este alta problema. lightpoint, on 31 iulie 2017 - 15:40, said:
Beleaua este pt a face String interning in Java, trebuie sa aplici metoda .intern() a obiectului. Metoda intern se foloseste exclusiv pentru stringurile create cu new. Insa nu despre asta era contrarea noastra. Ci despre falsa idee(a ta), cum ca String str = "abc" ar apela constructorul String(char[]) si poate verifica oricine cu juma de neuron functional acest aspect cu un debugger. Cine nu-l are nici pe ala, o tine pe contrari lipsite de argumente valide. Iti lipsesc cunostinte extrem de elementare de progamare java, dar esti pus pe tot felul de contre penibile... |
#27
Posted 01 August 2017 - 15:28
IllusiveMan, on 01 august 2017 - 15:20, said:
Nu i se spune in "oop" caci nu e un concept nici caracteristic oop, nici exclusiv oop. Quote
Fals total. Interning se face complet automat, fara apelarea niciunei metode, ori de cate ori se atribuie un string literal unei variabile string (aka String str = "abc" Sunte in OOP deci un string literal (asa cum cei de la Dzone ti-au demonstrat) ascunde de fapt un obiect de tip String , instantiat de un constructor al clasei String si ca acel "pool" magic este de fapt un obiect de tip Colectie avand ca elemente obiecte de tip String. Quote
Metoda intern se foloseste exclusiv pentru stringurile create cu new. Quote
Insa nu despre asta era contrarea noastra. Ci despre falsa idee(a ta), cum ca String str = "abc" ar apela constructorul String(char[]) si poate verifica oricine cu juma de neuron functional acest aspect cu un debugger. In spatele metodei intern() se afla un linked hashset de Stringuri. Daca nu-l gaseste in LinkedHashSet-ul de Stringuri il adauga ca sa-ti intoarca obiectul de tip String. Daca exista deja , ti-l serveste din LinkedHashSet. De aceeea developerii de la Java iti garanteaza ca Stringul va fi returnat din "pool". Din cauza lui LinkedHashSet.Este stiut in lumea inginerilor software ca obiecte ca LinkedHashSet garanteaza unicitatea si existenta datelor. Quote
Cine nu-l are nici pe ala, o tine pe contrari lipsite de argumente valide. Quote
Iti lipsesc cunostinte extrem de elementare de progamare java, dar esti pus pe tot felul de contre penibile... Edited by lightpoint, 01 August 2017 - 15:52. |
#28
Posted 01 August 2017 - 15:36
lightpoint, on 01 august 2017 - 15:28, said:
Fals total.Pool-ul este un pool de obiect String care sunt instantiate (asa cum spune si docum prin metoda .intern() ); Metoda intern se foloseste pt orice obiect de tip String nu numai cele create cu new dar si cele din pool ( ca si alea sunt obiecte de tip String) Pai orice obiect String se instantiaza prin acel constructor doar daca mama JVM-ului mai fata alt constructor intre timp Amice esti total strain de oop.Insuti propria ta sursa de documentatie iti vorbeste de un pool de obiecte String. Ti-ai facut o frumoasa caraterizare insa ai gresit autorul. Tu nu intelegi concept de "obiect".La tine totul se intampla "magic". N-ai cum sa n-ai obiecte intr-un poll ( adica o stiva amarata) de obiecte.DOOH ! Ca sa vezi la ce nivel de penibilitate ai ajuns... fix din articolul citat de tine: Why and When to Intern ? Though Java automatically interns all Strings by default, remember that we only need to intern strings when they are not constants, and we want to be able to quickly compare them to other interned strings. The intern() method should be used on strings constructed with new String() in order to compare them by == operator. Nu are rost sa-mi mai pierd vremea cu tine... Edited by IllusiveMan, 01 August 2017 - 15:41. |
|
#29
Posted 01 August 2017 - 16:10
IllusiveMan, on 01 august 2017 - 15:36, said:
Why and When to Intern ? The intern() method should be used on strings constructed with new String() in order to compare them by == operator. Nu are rost sa-mi mai pierd vremea cu tine... Quote
"When the intern() method is invoked on a String object it looks the string contained by this String object in the pool, if the string is found there then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned" |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users