JavaRush /Java Blog /Random-TK /Java-da awtobokslamak we gutulmak
DSergey_Kh
Dereje

Java-da awtobokslamak we gutulmak

Toparda çap edildi
Bu makalada Java-da awtoboks / blokirleme diýilýän aýratynlyga serederis . Awtobokslamak we gutulmak, başlangyç görnüşleri obýekt görnüşlerine we tersine öwürmekdir. Java-da awtobokslamak we gutulmak - 1Processhli amal Java Runtime Environment (JRE) tarapyndan awtomatiki ýerine ýetirilýär. Emma bu funksiýany ýerine ýetireniňizde seresap bolmaly, sebäbi ... Bu programmaňyzyň işine täsir edip biler.

Giriş

intJDK 1.5-den aşakdaky wersiýalarda, “, char” , “Integer”, “Character”, “Float”, “Double” ýaly floatbaşlangyç maglumat görnüşlerini öwürmek aňsat däldi . doubleJDK 5-den başlap, başlangyç görnüşleri ekwiwalent obýektlere öwürmek bu funksiýa awtomatiki usulda amala aşyrylýar. Bu emläk “Autoboxing” diýlip atlandyrylýar . Tersine degişlilikde “Unboxing” , ýagny obýektleri degişli başlangyç görnüşlere öwürmek prosesi. Awtobokslamak we gutulmak üçin nusga kody aşakda berilýär: Awtobokslamak
Integer integer = 9;
Blokdan çykarmak
int in = 0;
in = new Integer(9);
Awto gaplamak we gaplamak haçan ulanylýar? Awtoboksirlemek Java düzüjisi tarapyndan aşakdaky şertlerde ulanylýar:
  • Haçan-da başlangyç görnüşiň bahasy, degişli örtük synpynyň obýektine garaşýan usul parametri hökmünde bir usula geçirilende.
  • Haçan-da başlangyç görnüşiň bahasy degişli örtük synpynyň üýtgeýjisine bellenilende.
Aşakdaky mysaly gözden geçiriň: 1-nji sanaw: Awtoboksirlemegi görkezýän ýönekeý kod
public int sumEvenNumbers(List<Integer> intList ) {
int sum = 0;
for (Integer i: intList )
if ( i % 2 == 0 )
sum += i;
return sum;
}
Jdk 1.5-den öň ýokardaky kod düzme ýalňyşlygyna sebäp bolardy, sebäbi galan operator% we unary plus + = örtük synpyna ulanylyp bilinmedi. Emma jdk 1.5-den we ondan ýokary kod bu ýalňyşlary düzýär, Integer-e öwürýär int. Blokdan çykarmak Java düzüjisi tarapyndan aşakdaky şertlerde ulanylýar:
  • Haçan-da bir obýekt parametr hökmünde degişli başlangyç görnüşe garaşýan usula geçende.
  • Haçan-da bir obýekt degişli başlangyç görnüşiň üýtgeýjisine bellenilende.
Aşakdaky mysaly gözden geçiriň: 2-nji sanaw: Boks gutusyny görkezýän ýönekeý kod
import java.util.ArrayList;
import java.util.List;

public class UnboxingCheck {

public static void main(String[] args) {
Integer in = new Integer(-8);

// 1. Распаковка через вызов метода
int absVal = absoluteValue(in);
System.out.println("absolute value of " + in + " = " + absVal);

List<Double> doubleList = new ArrayList<Double>();

// Автоупаковка через вызов метода
doubleList.add(3.1416);

// 2. Распаковка через присвоение
double phi = doubleList.get(0);
System.out.println("phi = " + phi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
Awtobokslamak we gutulmak, döredijä okamak we düşünmek aňsat bolan kod ýazmaga mümkinçilik berýär. Aşakdaky tablisada maglumatlaryň başlangyç görnüşleri we degişli örtük obýektleri görkezilýär.
Ilkinji görnüşler Gabyk sapaklary
boolean Boolean
baýt Baýt
char Nyşan
ýüzmek Float
int Bitewi
uzyn Uzyn
gysga Gysga
1-nji tablisa: Deňeşdiriş operatorlary bilen deňeşdirilen operatorlar bilen başlangyç görnüşler we şoňa meňzeş örtük synplary ulanylyp bilner. Aşakdaky kod parçasy munuň nähili bolýandygyny görkezýär: 3-nji sanaw: Deňeşdiriş operatory bilen awtoboksirlemegi we gutulmagy görkezýän nusga kody
public class BoxedComparator {
  public static void main(String[] args) {
      Integer in = new Integer(25);
      if (in < 35)
          System.out.println("Value of int = " + in);
  }
}
Usul artykmaç ýüklenende awtomatik gaplamak we açmak Aşakdaky düzgünlere esaslanan usuldan aşa ýüklenende awtomatiki gaplamak we açmak amala aşyrylýar:
  • Giňeltmek we gaplamagyň arasynda saýlama bolan ýagdaýynda gaplamany “ýeňýär”; giňeltmek makul bilner.
4-nji sanaw: Artykmaç ýüklemegiň peýdasyny görkezýän nusga kody
public class WideBoxed {
  public class WideBoxed {
  static void methodWide(int i) {
       System.out.println("int");
   }

  static void methodWide( Integer i ) {
      System.out.println("Integer");
  }

  public static void main(String[] args) {
      short shVal = 25;
      methodWide(shVal);
  }
 }
}
Programmanyň çykyşy - görnüşiint
  • Giňeltmek üýtgeýän argumentleriň sanyny ýeňýär, giňelmek we üýtgeýän argumentleriň arasynda saýlamaga öwrülen ýagdaýynda giňeltmek makul bilner.
Sanaw 5: Artykmaç ýüklemegiň peýdasyny görkezýän nusga kody
public class WideVarArgs {

    static void methodWideVar(int i1, int i2) {
      System.out.println("int int");
    }

    static void methodWideVar(Integer... i) {
       System.out.println("Integers");
    }

   public static void main( String[] args) {
       short shVal1 = 25;
      short shVal2 = 35;
     methodWideVar( shVal1, shVal2);
   }
  }
  • Gaplamak üýtgeýän argumentleriň sanyny gaplaýar we gaplamak bilen üýtgeýän argumentleriň arasynda saýlamaga öwrülen ýagdaýynda, gaplamak makul bilner.
6-njy sanaw: Artykmaç ýüklemegiň peýdasyny görkezýän nusga kody
public class BoxVarargs {
     static void methodBoxVar(Integer in) {
         System.out.println("Integer");
     }

     static void methodBoxVar(Integer... i) {
         System.out.println("Integers");
     }
     public static void main(String[] args) {
         int intVal1 = 25;
         methodBoxVar(intVal1);
    }
}
Awto gaplamany ulananyňyzda aşakdaky zatlary ýatda saklamalysyňyz: Bilşimiz ýaly her bir gowy aýratynlygyň kemçiligi bar. Bu meselede awtoulag gaplamasy hem kadadan çykma däldir. Bu aýratynlygy ulananyňyzda bir döredijiniň ýadyňyzda saklamaly käbir bellikleri:
  • Obýektleri ' ==' operator bilen deňeşdirmek bulaşyk bolup biler, sebäbi başlangyç görnüşlere we obýektlere ulanylyp bilner. Bu operator obýektlere ulanylanda, obýektleriň özleri däl-de, obýektlere salgylanmalary deňeşdirýär.
7-nji sanaw: Deňeşdirmäni görkezýän nusga kody.
public class Comparator {
   public static void main(String[] args) {
     Integer istInt = new Integer(1);
       Integer secondInt = new Integer(1);

       if (istInt == secondInt) {
         System.out.println("both one are equal");

       } else {
          System.out.println("Both one are not equal");
      }
   }
}
  • Obýektleri we başlangyç görnüşleri deňlik we baglanyşyk operatorlary bilen garyşdyrmak. Bir başlangyç görnüşi bir obýekt bilen deňeşdirsek, obýekt gutusyz, NullPointerExceptionobýekt bolsa zyňyp biler null.
  • Obýekt keşi. Usul, valueOf()keşde saklaýan başlangyç zatlaryň gapyny döredýär. Gymmatlyklar -128-den 127 aralygynda keş görnüşinde saklanýandygy sebäpli, bu keş görnüşli zatlar başgaça hereket edip biler.
  • Öndürijiligiň peselmegi. Awtoboksirlemek ýa-da gutulmak, programma öndürijiligini peseldýär, sebäbi zibil ýygnaýjyny has ýygy işlemäge mejbur edýän islenmeýän zady döredýär.
“AutoBoxing” -iň kemçilikleri “AutoBoxing” -iň birnäçe artykmaçlygy bar bolsa-da, onuň aşakdaky kemçilikleri bar: 8-nji sanawy: öndürijilik meselesini görkezýän nusga kody.
public int sumEvenNumbers(List intList) {
          int sum = 0;
          for (Integer i : intList) {
              if (i % 2 == 0) {
                  sum += i;
              }
          }
         return sum;
   }
Koduň bu bölüminde sum +=i giňeldiler sum = sum + i. '' Operatordan başlap +, JVM gutusyny açyp başlaýar, sebäbi ' +' operatory Integer obýektine ulanyp bolmaýar. Soň bolsa netije yzyna gaýtarylýar. JDK 1.5-den öň maglumatlaryň görnüşleri intwe Integer üýtgeşikdi. Usul artykmaç ýüklenen ýagdaýynda bu iki görnüş kynçylyksyz ulanyldy. Awtomatiki gaplamagyň / gaplamagyň peýda bolmagy bilen bu has kynlaşdy. remove()Muňa artykmaç ýüklenen usuldyr ArrayList. Synpda ArrayListiki sany pozmak usuly bar - remove(index)we remove(object). Bu ýagdaýda usuly artykmaç ýüklemek bolmaz we degişli parametrler bilen degişli usul çagyrylar.

Netije

Awtoboksirlemek, başlangyç maglumatlaryň görnüşlerini degişli örtük synplaryna (obýektlere) aç-açan öwürmegiň mehanizmidir. Düzediji, deslapky görnüşleri obýektlere öwürmek usulyny we valueOf()obýektiň başlangyç görnüşlerini almak üçin usullary we ş.m. ulanýar. Awtoboksirlemek, “Boolean” görnüşini “ Boolean”, “Byte”, “Character”, “Float”, “Integer”, “Long”, “Short” -e öwürýär. Açmak ters tarapa ýüze çykýar. Asyl makalaIntValue()doubleValue()booleanbytecharfloatintlongshort
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION