CodeGym /Curs Java /Java Multithreading /Număr (întreg, lung, octet)

Număr (întreg, lung, octet)

Java Multithreading
Nivel , Lecţie
Disponibil

„Deoarece dezvoltatorii puteau veni cu clase care descriu numerele, au decis să fie creativi, ca dezvoltatorii adevărați.”

„În primul rând, au venit cu o clasă abstractă Number, din care sunt derivate Byte, Short, Integer, Long, Float și Double. Are metode care ajută la convertirea numerelor în alte tipuri numerice.”

Metode din clasa Number
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

"Corect. La urma urmei, nu poți scrie asta:"

Long x = 100000;
Integer y = (Integer) x;

"Da, aceste tipuri nu sunt primitive. De aceea folosim metodele clasei Number:"

Long x = 100000;
Integer y = x.intValue();

„Dar mai sunt câteva lucruri de luat în considerare. Deoarece Integer nu este un int, obiectele Integer nu pot fi comparate cu operatorul clasic «==».”

Compararea tipurilor primitive
int x = 500;
int y = 500;
x == y; //true
Compararea tipurilor non-primitive
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

— Exact. Cumva nu m-am gândit la asta imediat.

— Dar mai sunt.

"Îmi scurtcircuitați circuitele! Ce altceva mai este?"

„Când atribuim o valoare int unei variabile Integer, metoda Integer.valueOf este numită:”

Cod Ce se întâmplă cu adevărat
Integer x = 5;
Integer x = Integer.valueOf(5);

„Da, am înțeles deja asta din exemplul de mai sus”.

„Dar, funcția valueOf nu creează întotdeauna un nou obiect Integer.”

„Uh, ce vrei să spui „nu întotdeauna”?”

„Mechează în cache valori de la -128 la 127.”

Cod Ce se întâmplă cu adevărat Descriere
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Variabilele x, y și z conțin referințe la diferite obiecte
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Variabilele x, y și z conțin referințe la același obiect.
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
Variabilele z și t conțin referințe la același obiect.

„Cu alte cuvinte, situația este următoarea:”

1)  Dacă scriem „new Integer()”, atunci suntem garantați că vom obține un nou obiect.

2)  Dacă apelăm Integer.valueOf(), în mod explicit sau prin autoboxing, atunci metoda poate returna un obiect nou sau un obiect în cache dacă argumentul număr este în intervalul de la -128 la 127.

"Ce este atât de groaznic la metoda de returnare a unui obiect din cache?"

"Nu contează. Trebuie doar să știi că uneori, atunci când nu te aștepți, obiectele ar putea fi egale. Totul cu egalitate este complicat. Dacă comparăm un primitiv cu un non-primitiv, atunci ele sunt comparate ca primitive:"

Problema de comparatie
int x = 300;
Integer y = 300;
Integer z = 300;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
Un exemplu și mai interesant. Cache-ul intră în imagine aici
int x = 100;
Integer y = 100;
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
Dar cache-ul nu este implicat aici
int x = 100;
Integer y = new Integer(100);
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)

— Grozav... Și cum voi reține toate astea?

„Nu trebuie să memorezi asta. Trebuie doar să înțelegi cum este organizat totul și ce se întâmplă de fapt atunci când un primitiv și omologul său non-primitiv intră în joc”.

"De asemenea, vă recomand să vă uitați la metodele clasei Integer. Are destul de multe metode bune și utile. Chiar ați folosit una dintre ele destul de des."

"Da, îmi amintesc. Integer.parseInt();"

Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION