Tag Archives: Java

Compararea obiectelor de tip String in Java sau “equals()” vs “==” in Java in privinta string-urilor.

Obiectele de tip String pot fi create in Java folosind 2 metode:
  1. prin atribuire directa:
    String aString1 = "sometext";
  2. cu ajutorul operatorului new:
    String aString2 = new String("sometext");
In primul caz obiectul este alocat in String Pool, acesta fiind parte componenta a memoriei heap. De fiecare data cand un string este creat prin atribuire JVM cauta intai sa vada daca acea valoare nu este deja in String Pool, daca da noua variabila va referi acea valoare din String Pool, daca nu, va fi creata una noua.
In al doilea caz, de fiecare data in memoria JVM va fi creata un nou obiect de tip String, deci, de fiecare data va fi referita alta zona de memorie.
La comparare, ceea ce e in String Pool comparat cu ce e in String Pool va da intotdeauna true, fie daca se foloseste equals() sau ==.
Ex.:
String a = "text";
String b = "text";
System.out.println(a == b); 		// se compara referinta
System.out.println(a.equals(b));	// se compara valoarea(la String-uri)
true
true
La comparare intre doua obiecte din memoria JVM avem false, pentru ==, deoarece se compara referinta, iar pentru equals() rezultatul este true, deoarece pentru string-uri se compara valoarea.
Ex.:
String a = new String("text");
String b = new String("text");
System.out.println(a == b);		// se compara doua referinte diferite
System.out.println(a.equals(b));	// se compara aceeasi valoare
...
false
true
La comparare intre obiecte string din JVM si din String Pool avem
Ex.:
String a = new String("text");
String b = "text";
System.out.println(a == b);	// se compara o referinta la memoria JVM si o referinta la String Pool
System.out.println(a.equals(b)); 	// se compara aceeasi valoare
...
false
true
Pentru Object equals() compara referinta. Operatorul == foloseste comportamentul implicit(specific Object) al metodei equals(). Pentru string-uri insa aceasta metoda este suprascrisa, implicit fiind comparata valoarea.

Python

Python este un limbaj de programare se pare ca din ce in ce mai folosit de catre programatori. M-am decis sa arunc si eu o privire peste cateva documente legate de el. In continuare va voi spune cateva concluzii.

E un limbaj interpretat.

Spre deosebire de Java unde avem pachete sau C++ unde avem librarii, aici totul este bazat pe module. Orice apel de functii din module se face cu ajutorul operatorului “.”.

>>> math.cos(angle+math.pi/2)

Pentru indentare se foloseste “:”.

Stringurile pot fi cuprinse intre ” ” si ‘ ‘.

__main__ este numele functiei cele mai topmost.

Operatori: and, or, not, //(pt impartire integer), /, *, +, -, **(ridicare la putere).

pass – cuv cheie ce marcheaza un bloc care nu face nimic.

Pentru input de la tastatura: functiile raw_input() si input.

O functie returneaza intotdeauna ceva sau None.

Pentru afisare se foloseste functia print.

In Python putem avea expresii de genul: x+=1, x-=2… Nu sunt corecte formulari: i++ sau i–

Nu avem tipul Char.


Clasa HashMap

Implementarea ei este bazata pe interfata Map, astfel incat permite valori de null si chei nule. Clasa HashMap este foarte asemanatoare cu HashTable, numai ca este nesinconizata si permite valori nule.

Aceasta implementare ofera performanta constanta in timp pentru operatiile de baza(get si put), presusupunand ca functia hash disperseaza elementele corespunzator. Iteratia prin colectie cere timp proportional cu capacitatea instantei HashMap, de aceea este foarte importanta setarea capacitatii initiale(nu trebuie sa fie prea mare).

O instanta a clasei HashMap are doi parametri care afecteaza performanta: capacitatea initiala si factorul de incarcare. Capacitatea este numarul de buckets, iar capacitatea initiala este capacitatea de la creare. Coeficientul de incarcare este masura in care este permis unui obiect de tip HashTable sa se incarce, inainte de extinderea capacitatii acestuia. Atunci cand numarul de intrari in Hashtable depaseste produsul dintre coeficientul de incarcare si capacitatea curenta, capacitatea este dublata, prin apelarea metodei rehash.

Ca o regula generala, factorul implicit de incarcare (0.75) este o buna imbinare intre timp si costurile ce tin de spatiu.

De notat este faptul ca implementarea lui HashMap nu este sincronizata astfel ca daca dorim prevenirea accesului accidental nesincronizat la obiect va trebui sa apelam:

Map m = Collections.synchronizedMap(new HashMap(…));



Colectii in Java

Clasele colectii sunt cele mai puternice instrumente pentru programare. In Java incepand cu versiunea 1.2 colectiile au beneficiat de imbunatatiri considerabile.Acestea sunt un instrument mult mai util care sa te ajute sa manevrezi obiectele in Java. Astfel beneficiezi de liste inlantuite, cozi, cozi duble…

Cei care au proiectat noile librarii de clase colectii au vrut sa creeze un echilibru intre functionalitatile asteptate de la noile colectii si usurinta in a le invata si utiliza(lucru care lipseste la STL in C++). Rezultatul a parut ciudat pe alocuri, insa aceste ciudatenii nu erau accidente. S-ar putea sa dureze un timp pana la acomodarea cu unele aspecte ale librariei. Noile librarii de colectii rezolva problema depozitarii obiectelor si o imparte in doua concepte distincte:

  • Collection – un grup de elemente individuale, care deseori au o regula aplicata lor. O lista(List) trebuie sa tina elementele intr-o secventa anume iar o multime(Set) nu poate avea nici un element de doua ori.
  • Map – un grup de obiecte de forma perechi cheie – valoare. La prima vedere, aceasta ar trebui sa fie o colectie de perechi, dar atunci cand incerci sa o implementezi, designul devine ingrozitor, de aceea e mai clar sa o faci ca un concept diferit. Pe de alta parte, este mai convenabil sa te uiti la portiuni dintr-un Map prin crearea unui obiect de tip Collection care sa reprezinte acea portiune. De aceea un obiect de tip Map poate returna un Set format din cheile sale, un obiect de tip List cu valorile lui, sau un obiect de tip List cu perechile din componenta. Obiectele de tip Map, la fel ca si Array-urile pot fi extinse in obiecte cu dimensiuni multiple, fara adaugarea unor noi concepte: pur si simplu creezi un obiect de tip Map ale caror vaori sunt de tip Map(ale caror valori la randul lor pot fi tot obiecte de tip Map).

Interfetele Collection si Map pot fi implementate in multe moduri diferite, conform nevoilor.

Diagrama colectii Java

Diagrama de mai sus poate fi putin prea mult la inceput, dar cu timpul va veti da seama ca exista doar 3 componente colectie: Map, List, si Set, si doar doua sau trei implementari pentru fiecare. Dreptunghiurile cu linii intrerupte sunt interfete, cele cu linii punctate sunt clase abstracte, iar cele cu linii intregi sunt clase concrete. Sagetile cu linii intrerupte indica faptul ca o anumita clasa implementeaza o interfata(sau in cazul unei clase abstracte ca, implementeaza partial interfata). Sagetile cu linii duble indica ca o clasa poate produce obiecte ale clasei spre care sageata indica. De exemplu, orice obiect de tip Collection poate crea un altul de tip Iterator, in timp ce un obiect de tip List poate produce un ListIterator(dar si un Iterator obisnuit, de vreme ce List este derivata din Collection).

Interfetele care se ocupa cu depozitarea obiectelor sunt Collection, List, Set, si Map. De obicei o mare parte din codul scris comunica cu aceste interfete, si singurul loc unde tu vei specifica precis tipul pe care il utilizezi va fi la momentul creatiei. Asadar poti crea un obiect de tip List:

List x = new LinkedList();

Daca decizi sa schimbi implementarea, tot ceea ce trebuie sa faci este:

List x = new ArrayList();

Restul codului putand ramane neschimbat. In ierarhia claselor poti vedea un numar de clase al caror nume incepe cu “Abstract”. Acestea sunt simple instrumente care partial implementeaza o anumita interfata. daca vrei sa iti faci propria interfata Set de exemplu, nu vei porni de la interfata Set si apoi vei implementa toate metodele, in schimb, vei deriva clasa AbstractSet si vei face cat mai putin pentru a realiza ceea ce vrei in cat mai rapid. De aceea din acea diagrama cele mai utilizate lucruri vor fi interfetele din varf si clasele concrete care sunt incercuite de dreptunghiuri cu linii continue.


Aplicatiile web

Sar direct la modulele web. In arhitectura Java EE, componentele web si fisierele care reprezinta continut static(imagini…) sunt numite resurse web. Un modul web este una din cele mai mici resurse web unitare care pot fi utilizate si rulate. Un modul web corespunde la o aplicatie web asa cum este ea definita in specificatiile servleturilor Java.

Un modul web poate contine alte fisiere precum:

- clase care tin de partea legata de server(beanuri ale bazelor de date, cosuri de cumparaturi…), deseori acestea fiind conform arhitecturii componentelor JavaBean.

- clase care tin de partea legata de client(appleturi si alte utilitare).

Un modul web are o anumita structura. radacina ducumentului contine un sub-folder care se numeste WEB-INF cxare contine:

-web.xml-descriptorul de rulare al aplicatiei

-clase(acestea se vor executa la nivelul serverului)

-tags-un folder care contine fisiere tag care sunt implementari ale librariei de taguri)

-lib-un alt folder care contine JAR-urile librariilor apelate de catre clasele executate la nivel de server.

Daca modulul web nu contine resurse non-statice precum servleturi, componente filtru, samd atunci nu e nevoie ca fisierul web.xml sa fie prezent.

Un modul web poate fi rulat ca o structura de fisiere nearhivata, sau poate fi impachetat intr-un fisier JAR cunoscut mai mult ca WAR. Fisierele WAR folosesc o extensie .war. Modulul descris este portabil putand fi rulat pe orice container web conform specificatiilor.

sun-web.xml este descriptorul de rulare de care e nevoie la rularea aplicatiei la nivelul unui server, acest fisier fiind localizat in folderul WEB-INF de mai sus.

DE retinut e faptul ca nivelul radacinii modulului nostru avem folderul web-inf(web.xml, sun-web.xml,arhive ale librariilor, fisiere .class care ruleaza la nivel de server, fisiere. tag pentru acest modul) si pagini JSP, HTML, clase ale unor appleturi etc.


Java…

Am cautat mai multe tutoriale din care sa invat, si am ajuns pana la urma la concluzia ca cel de la sun e cel mai potrivit pentru a ma introduce in lumea Java EE deoarece cu Java SE sunt in oarecare masura destul de lamurit…bineinteles intr-o anumita masura… Ei bine, din acest tutorial voi mai publica unele idei, notite…


Follow

Get every new post delivered to your Inbox.