0% au considerat acest document util (0 voturi)
11 vizualizări92 pagini

Elemente de Baza Java

Încărcat de

L.M
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
11 vizualizări92 pagini

Elemente de Baza Java

Încărcat de

L.M
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 92

INGINERIE SOFTWARE

Curs 1
Elemente de baza Java
1
CE ESTE INGINERIA SOFTWARE?

 Studiul și aplicarea
principiilor de inginerie în
proiectarea, dezvoltarea și
întreținerea aplicațiilor
software.
 Dezvoltarea de procese și
metode ce conduc la un act
de implementare și rulare a
unui cod mai sigur și
reutilizabil
 Dezvoltare de sisteme
software complexe
(https://www.techopedia.com/definition/
13296/software-engineering)
2
INGINERIE SOFTWARE

 Dezvoltarea aplicatiilor software – obiective si principii


 Metodologii de dezvoltare software

 Managementul proiectelor software: metode de


management (Waterfall, Agile, Scrum, etc.)
 Sabloane de proiectare (design pattern-uri): Singleton,
Decorator, Strategy, Adapter, Command, Data Access,
MVC)
 UML () - limbaj care se foloseşte la modelarea
activităților în general, a celor de business, a
specificaţiilor software - utilizat în ingineria software.

3
CUPRINS
 Platforma Java
 Caracteristici limbaj Java

 Considerente evolutive

 Structura aplicatiilor Java

 Utilitare Java

 Compilare si rulare

 Cuvinte cheie

 Tipuri de date

 Siruri de variabile

 Clase pentru siruri de caractere

4
De ce Java?

5
 platformăsoftware ideală
pentru dezvoltarea de aplicaţii
securizate distribuite sau
stand-alone, capabile să
ruleze pe o mare varietate de
platforme hardware
(computere, telefoane mobile,
smart-phone-uri, PDA-uri, etc.)
şi sisteme de operare
(Windows, LINUX, Solaris,
MacOS, etc.)

6
 1996, ca alternativă la C/C++ (+, -)
 sintaxă identică C++ (+ câteva diferențe)
 consumul minim de resurse din partea maşinii gazdă
 extinderea dinamică a facilităţilor intrinseci pe care le oferă
codului pe orice platformă hardware sau software
 rularea
(independent de platformă)
- platformă = un mediu hardware şi/sau software care
permite rularea unei anumite aplicaţii

7
PLATFORMA JAVA

 platforma Java – software, peste SO al mașinii


gazdă

 Maşina virtuală Java (Java Virtual Machine, JVM)


 Interfaţa de programare a aplicaţiilor (Application
Programming Interface, API)

 Mediulde rulare Java (Java Runtime Environment,


JRE) - tehnologia de bază care face legatura între8
programul Java și sistemul de operare
PLATFORMA JAVA

9
LIMBAJUL JAVA

 limbaj de tip compilator şi interpretor


 limbaj neutru din punct de vedere arhitectural
 limbaj pur obiectual
 limbaj robust şi sigur
 grad înalt de performanță
 multithreading nativ

10
Produse Java:
 Java SE (Java Standard Edition)- platforma de bază
 Java ME (Micro Edition) – platforma pentru dezvoltarea
aplicațiilor pentru dispozitive mobile și sisteme embedded. Oferă
un subset de funcționalități din Java SE, dar introduce și biblioteci
specifice dispozitivelor mobile (Android Studio 3.x - Hedgehog)
 Java EE (Enterprise Edition) – pentru aplicații mai complexe,
distribuite, multi-tier, componente modulare ce rulează pe un
server de aplicații ( acum platforma Jakarta EE )
 JavaFX - tehnologie nouă pentru crearea aplicaţiilor desktop şi
web avansate vizual. Face parte din platforma Java 7; asigură un
model de program consistent pentru construirea aplicaţiilor şi
realizează o diferenţă clară între interfaţa utilizator (UI) şi logica
business. (acum JavaFX 21)
- începând cu Java SE11 e implementat într-un modul 11

separat, care se include ca plugin.


TIPURI DE APLICAȚII JAVA
 de bază => obiecte, şiruri, fire de execuţie, lucrul cu numere,
operaţii de intrare/ieşire, structuri de date, informaţii sistem, data şi
timpul, prelucrări de imagini, prelucrări de semnal, etc.
 applet-uri, JSP, JSF => pagini web
 reţea => URL-uri, TCP, UDP, IP, etc.
 internaţionalizare

 securitate => semnătura electronică, gestiune de


chei publice şi private, controlul accesului şi certificare.
 componente software

 serializare de obiecte => permite persistenţa obiectelor şi


comunicaţia folosind tehnologia RMI (Remote Method Invocation).
 acces la baze de date => JDBC (Java Database
Connectivity) asigură accesul la o gamă foarte largă de baze de
date relaţionale. 12
JDK – JAVA DEVELOPERS’S KIT
 Conține toate instrumentele necesare pentru crearea,
depanarea și execuția programelor
https://www.oracle.com/java/technologies/downloads/#jdk21-
windows

JDK 1.0 – 1.1.7, J2SE (JDK 1.2 – 1.4), generice in


 Evoluția:
J2SE 5, Java SE6, Java SE7, Java SE8 (LTS), Java SE9,
Java SE10, Java SE11 (LTS), Java SE12-16, Java SE17
(LTS), Java SE19, Java SE20 (21 mar. 2023), Java SE21
LTS (sept 2023)

 Fișierele sursa: *.java


 Fișierele bytecode: *.class

13
Considerente evolutive

14
CONSIDERENTE EVOLUTIVE
 JavaOne conferința anuală despre Tehnologiile Java –
toamna fiecărui an → din 2018 Java Code One
 JDK 1.0-1.1 : 1996 -1997
 J2SE 1.2-1.4 : 1998 -> 2002
 J2SE 5.0 : 2004 ->suport pana in 2015
 JSE 6 (2006) ,
 JSE7 (2011) – dupa preluarea Sun Microsystems de catre
Oracle
 JSE 8 (2014) – LTS (Long-Term-Support)
 JSE 9 and 10 (versiuni non-LTS)
 JSE 11 - LTS din septembrie 2018 pana in 2021-2023
 JSE 12-16, 2019-2024 (acum JSE 15)
 JSE 17 (LTS) din 2021 (toamna) – suport pana in 2026
 JSE 19 (sept 2022), JSE 20 (21 mar 2023)
 Java SE21 (LTS) (sept 2023)
15
OPENJDK ORACLE - SUPORT INCEPAND CU JDK 11
 OpenJDK – implementarea oficiala a Java SE incepand cu versiunea 7.

16
JDK – Java Developers Kit

17
JDK 11/21 - STRUCTURA DE SUBDIRECTOARE

18
JAVA DEVELOPER’S KIT
 bin=> director de stocare a utilitarelor şi executabilelor
Java. Aici rezidă fişierele appletviewer.exe, jar.exe,
java.exe, javac.exe, javadoc.exe, javah.exe, javap.exe,
jdb.exe, serialver.exe, servertool.exe, etc.

 conf => director ce stochează fișiere care conțin opțiuni


configurabile de utilizator
- modificarea permisiunilor de acces ale JDK
- configurarea algoritmilor de securitate
- setarea fișierelor Java Cryptography Extension
Policy

19
JAVA DEVELOPER’S KIT

 include => director de stocare a unor fişiere de tip


header C/C++, *.h;
 jmods => stochează module compilate, utilizate de jlink
pentru a crea cod runtime personalizat.
 legal => director de păstrare a fișierelor de licență și
drepturi de autor pentru fiecare modul
- include notificările terților ca fișiere .md (marcaj).
 lib => director de stocare a bibliotecilor Java (fişiere *.jar,
*.sym, *.lib, *.idl).

20
JAVA API INDEX – HELP
https://docs.oracle.com/en/java/javase/21/docs/api/index.html

21
Structura aplicațiilor Java
Compilarea și rularea
STRUCTURA APLICAȚIILOR JAVA

 declararea apartenenţei la un pachet definit de utilizator


 un antet specific includerii bibliotecilor necesare
funcţionării aplicaţiei (pachete întregi sau doar membri
ai acestora)
 declaraţii de interfeţe

 implementări de clase

 comentarii (pot apărea oriunde în program)

23
COMENTARII JAVA
// comentariu

/* comentariu
extins
*/

/** comentariu care ajunge in


documentatie
*/

24
STRUCTURA APLICAȚIILOR JAVA

25
RULAREA APLICAȚIILOR JAVA

Fisier
Compilator Bytecode Java
sursa
Java Test.class
Test.java

Java VM
(Interpretor
Java)

26
UTILITARE JAVA
 javac.exe = compilator

javac [ opţiuni ] [ fişiere_sursa ]

Exemplu: fișierul sursă Test.java (vezi slide 20)

Variante de compilare:
javac Test.java
javac –nowarn Test.java invalidează mesajele de warning
javac *.java compilează toate fișierele cu extensia .
java din director

https://docs.oracle.com/en/java/javase/21/docs/specs/man/index.html
27
UTILITARE JAVA
Clasa ce conține
 java.exe = interpretor metoda main()

java [ opţiuni ] nume_clasa [lista_de_argumente]

java [ opţiuni ] -jar nume_arh.jar [lista_de_argumente]

Exemplu: pentru exemplul din slide-ul 25


după compilare → Test.class
rulare: java Test

28
COMPILARE ȘI RULARE APLICAȚIE JAVA

Compilare Interpretor
(utilitar (utilitar
javac) java)

Rulare
Test.java Test.class aplicatia Test

29
UTILITARE JAVA - CONTINUARE
 Rulare appleturi: appletviewer nume_fisier.html
(nu mai e disponibil in Java SE11)

 Generare documentație /**...*/ javadoc nume_fisier.java


 Dezasamblare fișiere bytecode (.class): javap nume_fisier.class
 Depanator java: jdb nume_de_ clasa
 Crearea de fişiere javah nume_de_clasă
antet în limbajul C şi fişiere
sursă din clasele Java
A fost eliminat
in Java17
(javac –h)

30
ALTE UTILITARE JAVA
appletviewer (nu mai exista de la java11), jar, jarsigner, java,
javac, javadoc, javap, jcmd, jconsole, jdb, jdeprscan, jdeps, jfr,
jhsdb, jinfo, jlink, jmap, jmod, jpackage, jps, jrunscript, jshell,
jstack, jstat, jstatd, keytool, rmid, rmiregistry, serialver,
jabswitch, jaccessinspector, jaccesswalker, javaw, kinit, klist,
ktab

31
JAVA IDE
IDE = Integrated Development Environment
 BlueJ, DrJava, Kawa – destinate pentru invatare, usor de
utilizat
 Eclipse https://eclipse.org/

 Apache NetBeans https://netbeans.apache.org/download/

 IntelliJ IDEA https://www.jetbrains.com/idea/

 Vom folosi Eclipse, există mai multe versiuni: Luna/ Mars/


Neon/ Oxygen/ Photon cu suport pentru Java
SE8/9/10/11/12/13.
 versiunea Eclipse 2023-12 (4.30), disponibilă pe site-ul
Eclipse, cu suport pentru Java 21.
 O descriere a IDE Eclipse:
32

www.eclipse.org/eclipse/presentation/eclipse-slides.ppt
Elemente de baza ale
limbajului java

33
CUVINTE CHEIE IN JAVA

Pentru boolean, byte, char, int, long, short,


declararea
datelor double, float
Pentru
controlul break, continue, do, for, while
buclelor

Condiţionale if, else, switch, case

Pentru
excepţii try, catch, finally, throw, throws

34
CUVINTE CHEIE IN JAVA

Pentru abstract, class, enum, default, extends,


structuri implements, instanceof, interface

Pentru final, native, new, private, protected,


modificare public, static, synchronized, transient,
si acces volatile, void

Alte cuvinte true, false, import, null, package, return,


cheie super, this

35
Tipuri de date și conversii

36
TIPURI DE DATE ELEMENTARE JAVA

De tip byte, short, int şi long.


intreg
De tip
float şi double.
real
De tip char - reprezintă toate simbolurile dintr-un
set de caractere, incluzând cifrele şi
caracter literele (codare Unicode, pe 16 biti)
De tip boolean - poate reprezenta doar valorile
boolean true sau false (1 bit)
37
REPREZENTAREA NUMERELOR ÎNTREGI
 Cod complement față de 2 (C2)

Tip Marime (biti) Val. minima Val. maxima Val. implicita

byte 8 -128 127 0

short 16 -32,768 32,767 0

int 32 -231 231-1 0

long 64 -263 263-1 0L

38
REPREZENTAREA NUMERELOR REALE

Codare in virgulă mobilă, simplă precizie (float), respectiv


dublă precizie (double)

Tip Marime (biti) Val. minima Val. maxima Val.


implicita

float 32 1.4e-045 3.4e+038 0.0f

double 64 4.9e-324 1.7e+308 0.0d

39
CLASE ÎNCAPSULATOARE JAVA (WRAPPER CLASSES)
 Clasa Void - asociată tipului elementar void
 Clasa Byte - asociată tipului elementar byte.
 Clasa Short - asociată tipului elementar short.
 Clasa Integer - asociată tipului elementar int.
 Clasa Long - asociată tipului elementar long.
 Clasa Float - asociată tipului elementar float.
 Clasa Double - asociată tipului elementar double.
 Clasa Boolean - asociată tipului elementar boolean.

O instanță a unei clase încapsulatoare este un obiect nemodificabil și


stochează o singură valoare primitivă echivalentă.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/
lang/***.html
40
nume
clasa
CONVERSII DE TIP
Conversii implicite de tip

Nu este necesar operatorul cast ()


Nu generează excepții in sensul indicat in imagine
widening (int -> long)

Nu orice conversie implicită este permisă


int dd= 7.65f // Type mismatch: cannot convert from
// float to int
→ trebuie făcută conversie explicită 41
CONVERSII DE TIP
 Conversii explicite de tip → casting ()

 narrowing (int -> byte, long->int)


long l1 = 356;
int i1;
i1 =(int) l1; // i1=356
byte b=(byte)i1; // b= 100

 truncation (float -> int, double -> int)


float f=123.456f;
int d=(int)f; // d=123;
42
CONVERSII DE TIP
autoboxing : tip primitiv → obiect din clasa încapsulatoare
corespunzătoare, prin asignare directă
Integer iObj=10;
sau clasic: Integer iObj=new Integer(10); // deprecated
auto-unboxing: obiect din clasa încapsulatoare → tipul primitiv
corespunzător, prin asignare simplă
int i = iObj;
sau clasic int i= iObj.intValue();

Alte metode utile pentru conversii de tip:


String -> int int i = Integer.parseInt(args[0]);
int -> String String os = String.valueOf(5);
43
Integer ->String String str = iObj.toString();
Operatori Java

44
 Operatori unari

++ -- + - ! ~ () [ ]

 Operatori aritmetici binari

/ % + - *

Și intre numere
reale !!!

45
 Operatori logici pe biți

& (si) ^ (sau exclusiv) | (sau) ~ (complement


față de 1)

<< shiftare stânga


>> shiftare dreapta cu păstrarea semnului
>>> shiftare la dreapta fără semn (apare un bit de 0
pe MSB la fiecare deplasare)

46
EXEMPLU OPERATORI LOGICI PE BITI

public class OpLogiciBiti {


public static void main(String args[]) {
int a= 27; // 0x001B;
int masca= 15; // 0x000f;
System.out.println(" ~a= "+ Integer.toBinaryString(~a)+"=
0x"+Integer.toHexString(~a));
System.out.println(a+" & "+masca +"= "+ (a&masca)+" =
"+Integer.toBinaryString(a&masca));
System.out.println(a+" | "+masca +"= "+ (a|masca)+" =
"+Integer.toBinaryString(a|masca));
System.out.println(a+" ^ "+masca +"= "+ (a^masca)+" =
"+Integer.toBinaryString(a^masca));
47
}
}
EXEMPLU SHIFTARI

public class ShiftTest {


public static void main(String args[]) {
int a= 27; // 0x001B;
int b=-9; // 0xfffffff7
System.out.println(a+" << 1 = "+(a<<1)+"=
"+Integer.toBinaryString(a<<1));
System.out.println(b+" >> 1 = "+(b>>1)+" =
"+Integer.toBinaryString(b>>1));
System.out.println(b+" >>> 1 = "+(b>>>1)+" =
"+Integer.toBinaryString(b>>>1));
} 48

}
 Operatori de comparație

< <= >= > == !=


instanceof - verifică dacă obiectul este instanță a tipului
specificat (clasă sau interfață)

 Operatori logici pe operand


&& ||

 Operator condițional
?: (if – then – else)

49
 Operatori de asignare și compuși

= += -= *= /= %= &= ^= |= <<=
>>=

>>>=

50
Variabile și tablouri de variabile în
Java

51
Variabile în Java
 variabile elementare: sunt variabilele care au ca tip un
tip de date elementar
 variabile instanţă: declarate în interiorul clasei

 variabile de clasă: declarate în clasă cu cuvântul cheie


static
 variabile locale: declarate în interiorul unei metode

 variabile de tip parametru: sunt variabilele care sunt


trimise ca parametri către metode

Constante în Java
declarate cu specificatorul final
52
VARIABILE ÎN JAVA – CONVENȚII

 Numele de variabile nu pot fi cuvinte cheie predefinite


sau nume de entităţi
 Numele de variabile sunt case-sensitive.

 Numele de variabile sunt formate dintr-un singur cuvânt

 Numele de variabile (și orice identificatori in general) pot


începe cu orice literă, cu caracterul $ sau cu caracterul _.

53
ȘIRURI DE VARIABILE (TABLOURI UNIDIMENSIONALE)
Declarare:
tip [ ] nume_sir; sau tip nume_sir[];
unde tip tip primitiv (tablou de tip primitiv)
clasă (tablou de obiecte)
Creare:
nume_sir = new tip [dimensiune];
// dimensiune – intreg pozitiv
Inițializare: declarare și creare
tip nume_sir[ ] = new tip[dimensiune];
Asignare (atribuire):
nume_sir[index]=valoare; - pt un anumit element
sau prin copiere cu metoda arraycopy() din clasa System (ex slide 57)54
ȘIRURI DE VARIABILE
Exemplu:
int[ ] sir; sau int sir[ ]; // declararea unui sir
// (tablou) de intregi
sir = new int[10]; // crearea sirului
for(int i=0; i<sir.length; i++)
sir[i] = 1; // asignare

// initializarea unui sir de intregi


int[ ] sir = {100, 101, 102, 103, 104, 105, 106, 107};
int lungime=sir.length;
Obs! Un tablou are asociată o variabilă length, care
reprezintă numărul de elemente
55
// initializare tablou de obiecte din clasa String
String[ ] names = {"Joe", "Jane", "Juan"};

// initializare tablou de obiecte din clasa Point


Point[ ] points = { new Point(0, 0), new Point(1, 2), new Point(3, 4) };

Obs!
1. Elementele tablourilor care nu au primit valori, vor avea implicit
valoarea 0 dacă sunt de tip numeric, respectiv null dacă sunt
obiecte.
2. Tablourile de obiecte sunt distruse automat când nu mai sunt
utilizate, sau explicit prin apelul metodei gc() din clasele System
sau Runtime folosind pachetul implicit java.lang :
System.gc();
Runtime.getRuntime().gc(); 56
ȘIRURI DE VARIABILE
Copierea șirurilor de variabile - metoda arraycopy din
clasa System:

public static void arraycopy(Object src, int srcPos, Object


dest, int destPos, int length)

char[ ] sursa = { 'a', 'b', 'c', 'd', 'e', 'f', 'g’, ‘h' );
char[ ] destinatie = new char[3];
System.arraycopy(sursa, 2, destinatie, 0, 3);
System.out.println(destinatie); // “cde”

57
ȘIRURI DE VARIABILE
Clasa java.util.Arrays => căutări, sortări, copieri, umpleri pe
șiruri de variabile
(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Arrays.
html)

- metode statice
static byte[ ] copyOf(byte[ ] original, int newLength);
static Boolean equals(int[ ] a, int[ ] a2);
static void fill(Object[ ] a, int fromIndex, int toIndex, Object val);
static void sort(double[ ] a);
static int binarySearch(char[ ] a, char key);
Obs: aceste metode au variante pentru toate tipurile (sunt
supraîncărcate), aici am specificat doar o variantă, ca exemplu 58

-> vedeți documentația


ȘIRURI DE VARIABILE
import java.util.Arrays;

class Arrays_01 {
public static void main(String[ ] args) {
int sir[ ] = {7, 12, -1, 99};
Arrays.sort(sir); // in ordine crescatoare
for (int it: sir)
System.out.printf(" %d ", it);// -1 7 12 99
}
}

Pentru sortare descrescătoare, se poate folosi aceeași metodă, cu un


parametru suplimentar:
Arrays.sort(arr, Collections.reverseOrder());

!!! Incercați și sortarea unui subșir, folosind o variantă adecvată a 59


metodei sort()
import java.util.Arrays;
public class JavaArraysExample {
public static void main(String[ ] args) {
int[] intArray = new int[10];
System.out.printf("Tabloul (implicit): %s\n", Arrays.toString(intArray));
Arrays.fill(intArray, 0, intArray.length, 3); //tab, indexInitial, indexFinal, val
System.out.println("intArray (after): "+ Arrays.toString(intArray));

String[ ] namesArray = new String[10];


System.out.println("names Array (implicit): "+
Arrays.toString(namesArray));
// O valoare specifica pentru toate elementele tabloului
Arrays.fill(namesArray, 0, namesArray.length, "John");
System.out.println("namesArray (after): "+
Arrays.toString(namesArray));
}
60
}
Tablouri multidimensionale

Declarare tablou: int twoD[ ][ ];


Creare tablou bidimensional (matrice):
int twoD[ ][ ]=new int[4][5];

Obs: Putem crea tablouri multidimensionale la care fiecare


linie poate avea număr diferit de elemente

Sau int twoD[ ][ ]=new int[4][ ];


twoD[0]=new int[5];
twoD[1]= new int[7];
………………
61
 Exemplu tablouri bidimensionale
int matrice[ ][ ]=new int[3][3];
for(int i=0;i<matrice.length; i++) // nr linii
for(int j=0; j<matrice[i].length; j++) // nr coloane pe linia i
matrice[i][j]=0;

int mat[ ][ ]=new int[2][ ];


// numar diferit de elemente pe fiecare linie
mat[0]=new int[5];
mat[1]=new int[2];
// elemente prima linie
mat[0][0]=1; mat[0][1]=2; mat[0][2]=3; mat[0][3]=4; mat[0][4]=5;
// elemente a 2-a linie
mat[1][0]=16; mat[1][1]=17;
62
Obs!!!
 Tablourile pot fi transferate ca parametri către funcții (prin
adresa)
public static void sum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++)
sum+=arr[i];
System.out.println("sum of array values : "
+ sum);
}

O funcție poate returna un tablou !!!


public int[] getArray() {
int tab[]= {1,2,3,4};
return tab;
} 63
Clase pentru șiruri de caractere

64
1) Clasa String – clasa care modelează șiruri constante de
caractere
(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html)

!!!. String este o clasă in Java, definită în pachetul java.lang, nu


este un tip primitiv ca int, long, float, etc
 Un obiect din clasa String poate fi creat cu ajutorul operatorului
new sau prin inițializare directă cu un șir de caractere:
Ex: String str = new String("abc");
String str1 = "abc";
 Iniţializarea prin constructor:

 Cu șir vid de caractere


 Cu un şir de caractere primit ca parametru
 Cu un şir de bytes primit ca parametru
 Cu alt obiect de tip String primit ca parametru 65

 Cu alt obiect de tip StringBuffer primit ca parametru


Observații:
 Când creăm un String folosind ghilimele, JVM va căuta în
zona de String-uri create deja (String Pool) dacă există un
String cu acea valoare. Dacă există, va returna referința la
acel obiect, altfel va crea acel obiect cu valoarea
specificată și îl va stoca în bazinul cu obiecte String.
 Cu operatorul == se compară adresele

Exemplu:
public class Test{
public static void main(String[ ] args) {
String s1 = "abc";
String s2 = "abc"; // !!! s1 si s2 au aceeasi adresa
System.out.println("s1 == s2 is:" +(s1== s2)); // true
}
} 66
 Când folosim operatorul new pentru a crea un obiect
String, JVM creează obiectul, dar nu îl stochează în
String Pool.

Exemplu:
public class Test{
public static void main(String[ ] args) {
String s1 = new String("abc");
String s2 = "abc";
// s1 si s2 sunt in locuri diferite → au adrese diferite
System.out.println("s1 == s2 is: " + (s1== s2)); // false
}
} 67
 Metode din clasa String:

 examinarea individuală a fiecărui caracter din secvenţa stocată


 compararea a două obiecte de tip String (conținutul lor)
equals() sau compareTo(), !!! NU CU OPERATORUL ==
equals() are valoarea de retur de tip boolean
compareTo() are valoarea de retur de tip intreg
 contains() - căutarea unei anumite porţiuni dintr-un String
 substring() - extragerea unei anumite porţiuni dintr-un String
 concat() - concatenarea a 2 String-uri
 determinarea lungimii şirului de caractere conţinut de un obiect de
tip String – metoda length()
 etc.

68
 Unobiect din clasa String poate fi transformat într-un șir de
caractere in reprezentare Unicode, folosind metoda
toCharArray(), fără caracterul '\0’ la sfârșit (deosebire față
de C/C++)

 Operatorul + este supraîncărcat pentru clasa String și


utilizat pentru concatenarea a două obiecte String.
Prioritatea concatenării este mai mare decât a operatorilor
relaționali și de asignare.

Exemplu:
String s1 = new String("abc"); //”abc”
String s2 = s1 + "def"; //sirul ”def” este convertit automat in String
String s3 = s1 + 5; //se concateneaza sirul initial cu sirul de caractere ”5”
System.out.println(s1 + s2 + 100.23f); // abcabcdef100.23
//etc.
69
Exemplu: Compararea șirurilor – adrese și conținut

public class Test{


public static void main(String[] args) {
String s1 = new String("abc");

70
String s2 = "abc";
System.out.println("s1 == s2 ca adrese: " + (s1== s2));
//s1 si s2 comparate ca valoare
System.out.println("s1 == s2 ca valoare: " + (s1.equals(s2)));
}//main
}//Test

s1 == s2 ca adrese: false
s1 == s2 ca valoare: true
2) Clasa StringBuffer – modelează string-uri ce pot fi
modificate
(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/StringBuffer.h
tml)
 Inițializare:
 şir vid de caractere
 şir de o lungime inițială specificată, fără caractere
 alt obiect de tip String primit ca parametru

Operațiile sunt “thread-safe” și sincronizate → siguranță într-un


mediu multi-threaded

3) Clasa StringBuilder – operații similare cu cele din clasa


StringBuffer, exceptând “thread safety” și sincronizarea →
performanță într-un mediu single-threaded
(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/StringBuilder.
html) 71
 Metode ale clasei StringBuffer:
 examinarea individuală a fiecărui caracter
 comparare
equals() sau compareTo(), !!! NU CU OPERATORUL ==
 căutarea unei anumite porţiuni
 extragerea unei anumite porţiuni
 crearea unei copii
 Modificare !!!
 determinarea lungimii
 etc.

72
EXEMPLU:
public class Test{
public static void main(String[ ] args) {
StringBuffer sb=new StringBuffer(0);
//capacitate initiala 0
System.out.println(sb.insert(0,"inceput"));
int len=sb.length();
System.out.println(sb.insert(len,"sfarsit"));
System.out.println(sb.insert(7,String.valueOf(777)));
System.out.println(sb.append(888));
}
}

73
4) Clasa StringTokenizer
(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTok
enizer.html)

 Permite împărțirea unui String în mai multe obiecte (token-


uri, String-uri), în funcție de un delimitator (tot de tip String,
implicit spații albe).

 Metode utile:
boolean hasMoreTokens()
String nextToken()
int countTokens()

74
EXEMPLU:
import java.util.StringTokenizer;

public class Ex_StringTok{


public static void main(String[] args) {
//declararea si initializarea unei var. de tip StringTokenizer
StringTokenizer st = new StringTokenizer("abc;def;ghi", ";");
//parcurgerea tuturor secventelor de caractere ale sirului initial
while(st.hasMoreElements()){
System.out.println("Elementul curent: "+st.nextToken());
}//while
}//main
}//class

75
EXPRESII REGULARE IN JAVA
 expresieregulară (regex) = definește un model (pattern)
pentru stringuri. Modelul căutat poate fi orice de la un
singur caracter la un șir cu caractere speciale sau expresie
complexă.

 Expresiile
regulare pot fi utilizate pentru căutari, editări și
manipulări de texte.

 Pattern-ul (modelul) folosit de regex este aplicat pe text de


la stânga spre dreapta.
 java.util.regex - pachetul utlilizat pentru regex

 regex nu va fi detaliat in acest curs Java.


76
Exemplu regex:

import java.util.regex.Pattern;
public class Test{
public static void main(String args[]){
String content = "Acesta este un curs de programare";
String pattern = ".*curs.*";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println("Textul contine 'curs'? " +
isMatch);
}
}

// Textul contine 'curs'? True

Obs: .* are semnificația: orice secvență de caractere


77
Exemplu regex:

import java.util.regex.Pattern;
public class MyTokens {
public static void main(String a[]){
String str = "Sunt student la comunicatii. Imi
plac mult vacantele";
Pattern ptn = Pattern.compile("(la|Imi|mult)");
String[] parts = ptn.split(str);
for(String p: parts)
System.out.println(p);
}
}

78
Exemplu regex (validare cnp):

import java.util.Scanner;
import java.util.regex.Pattern;

public class ExRegex {


static Scanner scanner=new Scanner(System.in);
public static void main(String args[]) {
String cnp=null;
System.out.println("Introduceti cnp");
cnp=scanner.next();

if(Pattern.matches("[1256]{1}[0-9]{12}", cnp))
System.out.println("cnp corect");
else
System.out.println("cnp incorect");
} 79

}
80
Material suplimentar

Considerente evolutive Java

81
JAVA SE 7

 Nume de cod Dolphin, ce aduce nou?


 JVM cu suport pentru limbaje dinamice,

 Pointeri pe 64-bit

 Mici modificari de limbaj (proiectul Coin):

82
- switch cu String-uri
- try with resources – management automat de resurse
- deducere de tip pentru la crearea instantelor generice
- declararea simplificata a metodelor varargs
- literali pentru intregi binari
- permite caracterul underscore in literalii numerici
- prinderea de exceptii multiple si resemnalizarea exceptiilor
cu verificarea de tip
- facilitati de programare concurenta
- o noua biblioteca I/O – independenta de platforma si support
pentru metadata. Noi pachete: java.nio.file si
java.nio.file.attribute
- suport pentru algoritmi Elliptic curve cryptography

83
- Un pipeline XRender pentru Java 2D, imbunatateste
gestionarea trasaturilor specifice GPU- urilor moderne
- Noi API –uri pentru caracteristici grafice
- Imbunatatirea suportului pentru noile protocoale de retea,
SCTP si Sockets Direct Protocol
- update-uri de upstream la XML si Unicode
SINTEZA JAVA 7:
 Operatorul diamant:

84
 Switch cu String:

 Try cu resurse:
JAVA SE 8-17
 Java SE 8 – LTS (with Lamda’s) appeared march 2014, update
8u241 ca LTS version
 suport pentru expresii lambda

 Metode default si statice in interfete

 JSE 9 (JDK 9 –September 2017), system modular care ajuta

85
dezvoltatorii sa utilizeze o mica parte din Java SE pentru
implementarea de mici servicii sau instante separate in cloud
 JSE 10 (JDK 9 – march 2018), noi trasaturi

 JSE 11 - LTS (September 2018 - support pana in 2021, update


13.0.6), multe caracteristici noi (NU applet viewer)
 JSE 12-16 (2019 – 2024) (JDK14 2020/02/20, Final Release
Candidate, 2020/03/17 General Availability)
 JSE 17 LTS din 2021
SINTEZA JAVA 8:
 Expresii lambda:

86
 Method reference + forEach:
 Streams: secvență de obiecte, poate fi obținută dintr-o
colecție, tablou de obiecte sau resursă I/O. Pot fi aplicate
metode asupra obiectelor din stream → stream modificat →
lanț de metode sau lanț de stream-uri
 Stream-urile fac scrierea codului mai rapidă și mai vizibilă

 există stream-uri paralele care pot fi utilizate de mai multe


thread-uri, pentru a reduce timpul de lucru

87
 Java 8 Date API (nou API cu facilitati suplimentare):
import java.time.LocalDate;
public class LocalDateExample1 {
public static void main(String[] args) {
LocalDate date = LocalDate.now();
LocalDate yesterday = date.minusDays(1);
LocalDate tomorrow = yesterday.plusDays(2);

88
System.out.println("Today date: "+date);
System.out.println("Yesterday date: "+yesterday);
System.out.println("Tommorow date: "+tomorrow); }
}
 Clase optionale (un mod de a evita exceptiile de tip NullPointerException
permitand accesul prin obiecte null fara a genera exceptie, gandind operatia
ca un mecanism fallback in caz de obiect null)

Optional<Integer> a = Optional.ofNullable(value1); // value1 can be null


a.isPresent(); //verify if a is null
Integer value1 = a.orElse(new Integer(0)); //return value 0 if null
SINTEZA JAVA 9:
 Sistem modular– Proiectul Jigsaw (îmbunătățiri majore, pot fi
exportate sau importate API-uri întregi dintr-un modul în altul,
păstrând implementarea privata și încapsulată

HTTP (Noul API suportă HTTP 2 și are performanțe


 Client
comparabile cu cele oferite de ApacheHttpClient, Netty and Jetty):

89
SINTEZA JAVA 10:
 garbagecollector și parallel garbage collector,
managementul de memorie etc. Un nou cuvânt cheie var
pentru definirea de variabile

 Deducerea de tip pentru variabile locale:

90
SINTEZA JAVA 11:
 Suportul va fi preluat de openJdk Oracle Support, organizație open
source. OpenJdk devine noul standard java.
 Local-Variable Syntax for Lambda Parameters (conceptul var este
extins și adăugat la expresiile lambda pentru cazurile în care se
doresc adnotari pe variabile):

91
 Lansare programe sursă (Inainte de Java 11, pentru rulare trebuia
compilat programul sursă și fișierul bytecode obținut interpretat de
JVM și rulat). In Java 11 putem scrie direct:
java HelloWorld.java
 Client HTTP (Standard) – noi îmbunătățiri

 Renunță la modulele Java EE și CORBA, applet-uri, JavaFX-


Java FX rămâne ca plug-in
JAVA 17
1) Pattern matching pentru expresiile și instrucțiunile din switch:

public static double getPerimeter(Shape shape) throws IllegalArgumentException {


return switch (shape) {
case Rectangle r -> 2 * r.length() + 2 * r.width();
case Circle c -> 2 * c.radius() * Math.PI;
default -> throw new IllegalArgumentException("Unrecognized shape");
};
}
2) Clase sigilate - Sealed classes (caracteristica permanenta in Java 17) → o
clasa sau interfata sigilata restrictioneaza ce clase sau interfete o pot extinde
sau implementa.

3) Clase Record (caracteristica permanenta inca de la Java 16) – O clasa


Record este o clasa care actioneaza ca un purtator transparent pentru date
care nu pot fi modificate. 92

S-ar putea să vă placă și