Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...

probleme cu ochelarii
 Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National

Sub mobila de bucatarie si sub fr...
 Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...

Lucruri inaintea vremurilor lor
 Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...

Renault Android
 

Verificare ultimul caracter dintr-un String

- - - - -
  • Please log in to reply
28 replies to this topic

#19
tavitu

tavitu

    Minune: HE a început să emită facturile!

  • Grup: Senior Members
  • Posts: 5,598
  • Înscris: 16.02.2009
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
IllusiveMan

IllusiveMan

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017

View Postlightpoint, 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.
Nu e fals. Daca nu esti sigur ca ai string in carnatul parcurs, poti sa verifici chiar tu asta cu un simplu if si eviti throwul

View Postlightpoint, 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
Fals in ambele cazuri. E drept ca metoda endsWith e mai costisitoare, dar nu face nicicum ce zici tu, ci atribuie arrayurilor ta[] si pa[] locatia de memorie catre care indica arrayurile value aferente fiecarui String.

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
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 785
  • Înscris: 16.02.2017

View PostIllusiveMan, 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
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

Quote

Metoda public String(char[] value) este apelata
Nu este metoda ci este constructor:
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[].
care este signatura constructorului pe care l-am expus mai sus.
Mai sa fie acum ai descoperit si tu apa calda.

#22
IllusiveMan

IllusiveMan

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017

View Postlightpoint, 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

Fals total! Ti-am zis, se poate verfica in debugger cu step into. Absolut niciun constructor nu e apelat atunci.

View Postlightpoint, 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).
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.

View Postlightpoint, on 17 iulie 2017 - 14:33, said:

Nu este metoda ci este constructor:
https://docs.oracle....nstructors.html
Da, scuze. Atat ca = "sdsd" nu se pupa cu absolut nicio semnatura.

#23
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 785
  • Înscris: 16.02.2017

View Posttavitu, on 17 iulie 2017 - 13:47, said:

Nici nu știu de unde să încep.
Incepe de unde vrei, mi-e indiferent

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?
Mie nu-mi de asta.Ce mi-a atras atentia a fost faptul ca faci stocare de date fara a face prelucrare folosind liste.
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ță.
Nu se pun in bucle functii care arunca exceptii, ci se implementeaza un mecanism de iesire gracefully din bucla dupa care (dupa ce ai iesit din bucla)  arunci eroarea.
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?
In Java nu exista transfer prin referinta ci doar prin valoare. In rest JVM-ul instantiaza stringurile prin constructorul cu signatura String(char[]).

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?
Nu exista in java referinte ci doar obiecte si valori.

View PostIllusiveMan, 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.
Pot sa te asigur ca JVM-ul respecta principiile OOP-ului, ca doar de asta a fost proiectat si va executa codul dupa  standardul OOP.
In rest ura si la gara.  :)

#24
IllusiveMan

IllusiveMan

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017
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

http://docs.oracle.c...4.html#jvms-4.4
[...]

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
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 785
  • Înscris: 16.02.2017
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 Posted Image

Edited by lightpoint, 31 July 2017 - 15:49.


#26
IllusiveMan

IllusiveMan

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017

View Postlightpoint, 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.
Nu i se spune in "oop" caci nu e un concept nici caracteristic oop, nici exclusiv oop.

View Postlightpoint, on 31 iulie 2017 - 15:40, said:

Beleaua este pt a face String interning in Java, trebuie sa aplici metoda .intern() a  obiectului.
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";)

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
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 785
  • Înscris: 16.02.2017

View PostIllusiveMan, on 01 august 2017 - 15:20, said:

Nu i se spune in "oop" caci nu e un concept nici caracteristic oop, nici exclusiv oop.
Bai i se spune, oop deoarece Java este 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"Posted Image
Fals total.Pool-ul este un  pool de obiecte String care sunt instantiate (asa cum spune si docum prin metoda .intern() );
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.
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, asa cum spune si sursa citata de tine :Dzone)

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.
Pai orice obiect String se instantiaza prin acel constructor doar daca mama JVM-ului mai fata alt constructor intre timp
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.
Amice esti total strain de oop.Insuti propria ta sursa de documentatie iti vorbeste de un pool de obiecte String.

Quote

Iti lipsesc cunostinte extrem de elementare de progamare java, dar esti pus pe tot felul de contre penibile...
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 pool ( adica o stiva amarata) de obiecte.DOOH !

Edited by lightpoint, 01 August 2017 - 15:52.


#28
IllusiveMan

IllusiveMan

    Member

  • Grup: Members
  • Posts: 750
  • Înscris: 02.07.2017

View Postlightpoint, 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 !
Aberatii fara niciun fel de argumentare sau dovezi. Tot ce spui tu este demonstrabil fals, si experimental, si conform documentatiei.

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
lightpoint

lightpoint

    Member

  • Grup: Members
  • Posts: 785
  • Înscris: 16.02.2017

View PostIllusiveMan, 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"
Nici eu.Bye !

Anunturi

Chirurgia cranio-cerebrală minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate