CodeGym /Java kursus /Modul 1 /Indpakningsklasser i detaljer

Indpakningsklasser i detaljer

Modul 1
Niveau , Lektie
Ledig

1. Integerklasse

Integerer også god ved at det er en klasse, hvilket betyder at den kan have felter og metoder. Og selvfølgelig har den dem. Mange af dem - snesevis af dem. Her vil vi overveje de mest grundlæggende.

Klassen Integerhar to felter, der indeholder de maksimale og mindst mulige værdier af inttypen:

Mark Beskrivelse
Integer.MAX_VALUE
Maksimal mulig værdi af inttypen
Integer.MIN_VALUE
Minimum mulig værdi af inttypen

Nogle gange vil du tildele den mindste eller størst mulige intværdi til en variabel. For at undgå at fylde din kode med uforståelige konstanter, kan du skrive dette meget tydeligt som følger:

Kode Beskrivelse
int min = Integer.MIN_VALUE;
min == 0x80000000

Klassen Integerhar også nogle interessante metoder. Her er de:

Metoder Beskrivelse
String Integer.toHexString(int)
Returnerer en streng, der er den hexadecimale repræsentation af tallet
String Integer.toBinaryString(int)
Returnerer en streng, der er den binære repræsentation af tallet
String Integer.toOctalString(int)
Returnerer en streng, der er den oktale repræsentation af tallet
Integer Integer.valueOf(int i)
Indpakker det beståede inti en Integergenstand
Integer Integer.parseInt(String)
Returnerer tallet opnået fra den beståede streng

Du har tidligere stødt på den statiske Integer.parseInt()metode. Lad os huske, hvordan det fungerer:

int name = Integer.parseInt(string);

Hvis en streng, der indeholder et tal (kun cifre) sendes til parseInt()metoden, vil den parse strengen og returnere det tal, den indeholder.

Resten af ​​metoderne er også nyttige. For eksempel kan nogle af dem konvertere et bestået tal til en streng, der indeholder den binære, oktale eller hexadecimale repræsentation af tallet.



2. Doubleklasse

Generelt Doubleligner klassen klassen Integer, kun den omslutter en doublesnarere end en int. Det har også områder og metoder, som vil være interessante for os. Overvej et par af dem:

Klassen Doublehar seks interessante felter:

Mark Beskrivelse
double Double.NEGATIVE_INFINITY
Negativ uendelighed
double Double.POSITIVE_INFINITY
Positiv uendelighed
int Double.MIN_EXPONENT
Minimum mulig eksponent (2 x )
int Double.MAX_EXPONENT
Maksimal mulig eksponent (2 x )
double Double.MIN_VALUE
Minimum mulig værdi af doubletypen
double Double.MAX_VALUE
Maksimal mulig værdi af doubletypen

Uendelighed

Hvis du dividerer -1.0med 0.0, får du negativ uendelighed. Hvis du dividerer 1.0med 0.0, får du positiv uendelighed. Ikke kun kan du dividere a doublemed nul, men du kan også bruge det til at gemme resultatet af disse operationer.

Eksponent for endouble

Det er nemt at forstå eksponenten. Internt består en double af en mantisse og en eksponent. Men her er værdien af ​​eksponenten ikke , men . Hvis eksponenten stiger med , vil den samlede værdi af tallet fordobles.10x2x1

MIN_EXPONENT == -1024, hvilket betyder , som er omtrent lig med2-102410-308

Og selvfølgelig Doublehar klassen interessante metoder:

Metoder Beskrivelse
String Double.toHexString(double)
Returnerer en streng, der er den hexadecimale repræsentation af tallet
boolean Double.isInfinite(double)
Kontrollerer, om det beståede tal er uendeligt.
boolean Double.isNaN(double)
Kontrollerer, om det beståede nummer erNaN
Double Double.valueOf(double)
Indpakker det beståede doublei en Doublegenstand
Double Double.parseDouble(String)
Returnerer tallet opnået fra den beståede streng

Interessant nok er der en isInfinite()metode, der returnerer true, hvis det beståede tal er positivt eller negativt uendeligt.

Metoden isNaN()ligner - den kontrollerer, om det beståede tal er NaN( Not-a-Number , en speciel konstant, der angiver en udefineret værdi).



3. Characterklasse

Klassen Characterer først og fremmest interessant for dens store antal statiske hjælpemetoder, der lader dig kontrollere, om tegn tilhører forskellige kategorier.

Eksempler

Metoder Beskrivelse
Character.isAlphabetic(int)
Kontrollerer, om et tegn er et alfabetisk tegn
Character.isLetter(char)
Kontrollerer, om tegnet er et bogstav
Character.isDigit(char)
Kontrollerer, om tegnet er et ciffer
Character.isSpaceChar(char)
Kontrollerer, om tegnet er et mellemrum, et linjeskift eller et sideskift (koder: 12, 13, 14)
Character.isWhitespace(char)
Kontrollerer, om tegnet er mellemrum: et mellemrum, tabulator osv.
Character.isLowerCase(char)
Kontrollerer, om tegnet er småt
Character.isUpperCase(char)
Kontrollerer, om tegnet er stort
Character.toLowerCase(char)
Konverterer tegnet til små bogstaver
Character.toUpperCase(char)
Konverterer tegnet til store bogstaver

Et træk ved disse metoder er, at de fungerer med alle kendte alfabeter: Arabiske tal klassificeres som cifre osv.



4. Booleanklasse

Typen Booleaner stort set den samme som booleantypen. Forskellene er minimale.

Nedenfor viser vi en forenklet version af klassen Boolean:

Kode Beskrivelse
class Boolean
{
   public static final Boolean TRUE = new Boolean(true);
   public static final Boolean FALSE = new Boolean(false);

   private final boolean value;

   public Boolean(boolean value)
   {
      this.value = value;
   }

   public boolean booleanValue()
   {
      return value;
   }

   public static Boolean valueOf(boolean value)
   {
      return (value ? TRUE : FALSE);
   }
}


Konstanter : TRUEи FALSE


Variabelklassekonstruktør Metoden returnerer værdien af ​​den interne variabel Denne statiske metode konverterer

Booleantil og til .








trueTRUEfalseFALSE

Typen Booleanhar to konstanter (to felter):

Klassens konstanter Modstykke til den booleske type Beskrivelse
Boolean.TRUE
true
rigtigt
Boolean.FALSE
false
falsk

Du kan arbejde med dem på samme måde, som du arbejder med booleantypen:

Kode Bemærk
if (Boolean.TRUE)
{
}
Klassen Booleaner den eneste klasse, der kan skrives inde i en betingelse
Boolean a = Boolean.TRUE;
boolean b = Boolean.TRUE;
boolean c = true;
Alle tre variabler er lig med true/TRUE
Boolean a = Boolean.TRUE;
Boolean b = Boolean.TRUE;
if (a == b)
Konstanter kan sammenlignes ved at bruge begge, equalsog ==

dette vil også virke.

Autoboxing fungerer godt her. Det betyder, at du kan bruge denne type på samme måde som typen boolean- der er ingen faldgruber at passe på.

hvordan det er skrevet Hvordan det virker
Boolean a = true;
Boolean b = true;
Boolean c = false;
boolean d = a;
Boolean a = Boolean.valueOf(true);
Boolean b = Boolean.valueOf(true);
Boolean c = Boolean.valueOf(false);
boolean d = a.booleanValue();

Og her en sammenligning af booleanog Booleantyperne:

boolean a = true;
Boolean b = true; // b will be equal to Boolean.TRUE
Boolean c = true; // c will be equal to Boolean.TRUE

a == b; // true (compared by value)
a == c; // true (compared by value)
b == c; // true (compared by reference, but they point to the same object)

Hvis du virkelig har brug for et uafhængigt Booleanobjekt, skal du oprette det eksplicit:

boolean a = true;
Boolean b = new Boolean(true); // New Boolean object
Boolean c = true; // c will be equal to Boolean.TRUE

a == b; // true (compared by value)
a == c; // true (compared by value)
b == c; // false (compared by reference, and they point to different objects)

Endnu et eksempel, hvor vi vil bruge en Booleaninderside af en if:

Kode Bemærk
Boolean less = (2 < 3);
if (less)
{
   ...
}
Dette vil kompilere og fungere

Dette vil kompilere, men det virker ikke!

Kode Bemærk
Boolean less = null;
if (less)
{
   ...
}

Fejl . Denne linje vil give en undtagelse


5. Caching værdier under autoboxing

Der er nogle faldgruber relateret til heltalsindpakningstyper.

Som du allerede ved, hvis vi sammenligner en intog en Integer, Integerkonverteres den til en int:

hvordan det er skrevet Hvordan det virker
int a = 5;
Integer b = 5;
if (a == b)
{
   ...
}
int a = 5;
Integer b = Integer.valueOf(5);
if (a == b.intValue())
{
   ...
}

Hvis du sammenligner to Integerobjekter med hinanden, konverteres de ikke til ints:

Kode Konsoludgang
Integer a = 500;
Integer b = 500;
int c = 500;

System.out.println(a == b); // Compared by reference
System.out.println(a == c);
System.out.println(b == c);




false
true
true

a == cog , men , fordi når vi sammenligner, og vi sammenligner referencer. Hvilket i bund og grund er, hvad vi ville forvente.b == ca != bab

Overraskelse

Men hvis vi erstatter 500med 100, så får vi et helt andet resultat:

Kode Konsoludgang
Integer a = 100;
Integer b = 100;
int c = 100;

System.out.println(a == b); // Compared by reference
System.out.println(a == c);
System.out.println(b == c);




true
true
true

Problemet her er, at et nyt Integerobjekt ikke altid oprettes under autoboxing . Objekter cachelagres for værdier -128gennem 127inklusive.

Klassen Integerhar et skjult array, der gemmer objekter: Integer(-128), Integer(-127), ... Integer(126),Integer(127)

Hvis du skriver Integer x = 128, så opretter autoboxing-processen et nyt objekt, men hvis du skriver Integer x = 127, så henter autoboxing-processen det eksisterende objekt fra cachen (fra arrayet).

Hvis du ikke ønsker, at Integerobjektet skal komme fra cachen, skal du oprette det eksplicit ved at skrive:Integer x = new Integer(127);

Alle indpakningstyper har sådan en cache: Integer, Long, Byte, Short, Boolean. For Booleantypen er dens TRUEog FALSEværdier begge konstanter, så de er også i det væsentlige cachelagret.


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