JavaRush /Blog Jawa /Random-JV /Jinis primitif ing Jawa: Dheweke ora primitif
Viacheslav
tingkat

Jinis primitif ing Jawa: Dheweke ora primitif

Diterbitake ing grup

Pambuka

Pangembangan aplikasi bisa dianggep minangka nggarap sawetara data, utawa luwih, nyimpen lan ngolah. Dina iki aku pengin ndemek aspek tombol pisanan. Kepiye data disimpen ing Jawa? Ing kene kita duwe rong format: referensi lan jinis data primitif . Ayo dadi pirembagan bab jinis-jinis primitif lan kemungkinan kanggo nggarap wong-wong mau (apa wae sing bisa ngomong, iki minangka dhasar kawruh kita saka basa program). Jinis data primitif Jawa minangka pondasi kabeh. Ora, aku ora exaggerating ing kabeh. Oracle wis Tutorial kapisah darmabakti kanggo primitif: Jinis Data Primitif Jinis primitif ing basa Jawa: Ora pati primitif - 1 Sajarah sethitik. Ing wiwitan ana nol. Nanging nul mboseni. Banjur bit katon . Kok diceluk ngono? Iki dijenengi saka singkatan " bi nary digi t " (nomer biner). Tegese mung nduweni rong makna. Lan wiwit iku nul, iku logis sing saiki iku salah siji 0 utawa 1. Lan urip wis dadi luwih nyenengake. Potongan-potongan wiwit kumpul ing wedhus. Lan wedhus iki wiwit diarani byte (byte). Ing donya modern, byte = 2 kanggo daya katelu, i.e. 8. Nanging pranyata iki ora mesthi. Ana akeh ramalan, legenda lan gosip babagan asale jeneng byte. Sawetara wong mikir yen kabeh babagan enkoding ing wektu kasebut, dene liyane mikir yen maca informasi kanthi cara iki luwih nguntungake. A byte minangka potongan memori paling cilik sing bisa dialamatake. Iku bita sing duwe alamat unik ing memori. Ana legenda yen ByTe minangka singkatan saka Binary Term - tembung mesin. Tembung mesin - mung sijine, iki jumlah data sing prosesor bisa proses ing siji operasi. Sadurunge, ukuran tembung mesin padha karo memori addressable paling cilik. Ing Jawa, variabel mung bisa nyimpen nilai byte. Kaya sing dakkandhakake ing ndhuwur, ana rong jinis variabel ing Jawa:
  • jinis primitif java langsung nyimpen nilai bita data (kita bakal ndeleng jinis primitif kasebut kanthi luwih rinci ing ngisor iki);
  • jinis referensi, nyimpen bait alamat obyek ing Heap, yaiku, liwat variabel kasebut, kita entuk akses langsung menyang obyek kasebut (kaya remot kontrol kanggo obyek kasebut)

bait Jawa

Dadi, sejarah menehi kita byte - jumlah minimal memori sing bisa digunakake. Lan kasusun saka 8 bit. Tipe data integer paling cilik ing java yaiku byte. Iki minangka jinis 8-bit sing ditandatangani. Iki artine apa? Ayo ngetung. 2^8 punika 256. Nanging yen kita pengin nomer negatif? Lan pangembang Jawa mutusake yen kode binar "10000000" bakal makili -128, yaiku, bit sing paling penting (bit paling kiwa) bakal nuduhake manawa nomer kasebut negatif. Biner "0111 1111" padha karo 127. Tegese, 128 ora bisa ditetepake kanthi cara apa wae, amarga iku bakal -128. Pitungan lengkap diwenehi ing jawaban iki: Yagene sawetara bita -128 kanggo 127 ing Jawa? Kanggo ngerti carane nomer dijupuk, sampeyan kudu katon ing gambar:
Jinis primitif ing basa Jawa: Ora pati primitif - 2
Patut, kanggo ngetung ukuran 2 ^ (8-1) = 128. Iki tegese watesan minimal (lan wis minus) bakal -128. Lan maksimal yaiku 128 - 1 (nyuda nol). Sing, maksimum bakal 127. Ing kasunyatan, kita ora bisa karo jinis byte supaya asring ing "tingkat dhuwur". Sejatine iki pangolahan data "mentah". Contone, nalika nggarap transmisi data liwat jaringan, nalika data minangka set 0s lan 1s sing ditularake liwat sawetara saluran komunikasi. Utawa nalika maca data saka file. Dheweke uga bisa digunakake nalika nggarap senar lan enkoding. Tuladha kode:
public static void main(String []args){
        byte value = 2;
        byte shortByteValue = 0b10; // 2
        System.out.println(shortByteValue);
        // Начиная с JDK7 мы можем разделять литералы подчёркиваниями
        byte minByteValue = (byte) 0B1000_0000; // -128
        byte maxByteValue = (byte) 0b0111_1111; // 127
        byte minusByteValue = (byte) 0b1111_1111; // -128 + 127
        System.out.println(minusByteValue);
        System.out.println(minByteValue + " to " + maxByteValue);
}
Miturut cara, aja mikir yen nggunakake jinis byte bakal nyuda konsumsi memori. Byte utamané digunakake kanggo ngurangi konsumsi memori nalika nyimpen data ing susunan (Contone, nyimpen data sing ditampa liwat jaringan ing sawetara buffer, kang bakal dipun ginakaken minangka Uploaded byte). Nanging nalika nindakake operasi ing data, nggunakake byte ora bakal ketemu pangarepan. Iki amarga implementasine Java Virtual Machine (JVM). Wiwit paling sistem 32 utawa 64 dicokot, byte lan short sak petungan bakal diowahi menyang 32-dicokot int, kang bakal kita pirembagan bab mengko. Iki nggawe petungan luwih gampang. Kanggo rincian liyane, waca Apa tambahan byte diowahi dadi int amarga aturan basa Jawa utawa amarga jvm? . Jawaban kasebut uga ngemot pranala menyang JLS (Spesifikasi Bahasa Jawa). Kajaba iku, nggunakake byte ing panggonan sing salah bisa nyebabake momen kikuk:
public static void main(String []args){
        for (byte i = 1; i <= 200; i++) {
            System.out.println(i);
        }
}
Bakal ana loop ing kene. Amarga nilai counter tekan maksimal (127), bakal kebanjiran lan nilai bakal dadi -128. Lan kita ora bakal metu saka siklus.

cendhak

Watesan kanggo nilai byte cukup cilik. Mulane, kanggo jinis data sabanjuré kita mutusaké kanggo pindho jumlah bit. Tegese, saiki ora 8 bit, nanging 16. Yaiku, 2 bita. Nilai bisa diitung kanthi cara sing padha. 2 ^ (16-1) = 2 ^ 15 = 32768. Iki tegese sawetara saka -32768 kanggo 32767. Iki digunakake arang banget kanggo kasus khusus. Minangka dokumentasi basa Jawa ngandhani: " Sampeyan bisa nggunakake singkat kanggo nyimpen memori ing array gedhe ."

int

Dadi, kita entuk jinis sing paling kerep digunakake. Butuh 32 bit, utawa 4 bait. Umumé, kita terus pindho. Kisaran nilai saka -2^31 nganti 2^31 – 1.

Nilai int maksimal

Nilai maksimum int 2147483648 yaiku 1, sing ora cilik. Kaya kasebut ing ndhuwur, kanggo ngoptimalake petungan, amarga Iku luwih trep kanggo komputer modern, njupuk menyang akun kapasitas dicokot, kanggo count; data bisa implicitly diowahi kanggo int. Punika conto prasaja:
byte a = 1;
byte b = 2;
byte result = a + b;
Kode kasebut ora mbebayani, nanging kita entuk kesalahan: "kesalahan: jinis sing ora kompatibel: kemungkinan konversi saka int menyang bait." Sampeyan kudu mbenerake asil byte = (byte)(a + b); Lan conto liyane sing ora mbebayani. Apa sing kedadeyan yen kita mbukak kode ing ngisor iki?
int value = 4;
System.out.println(8/value);
System.out.println(9/value);
System.out.println(10/value);
System.out.println(11/value);
Lan kita bakal entuk kesimpulan
2
2
2
2
*suara panik*
Kasunyatane yaiku nalika nggarap nilai int, sisane dibuwang, mung ninggalake kabeh bagean (ing kasus kaya ngono, luwih becik nggunakake dobel).

dawa

We terus pindho. Kita tikelake 32 karo 2 lan entuk 64 bit. Miturut tradhisi, iki 4 * 2, yaiku, 8 bita. Kisaran nilai saka -2^63 nganti 2^63 – 1. Luwih saka cukup. Jinis iki ngidini sampeyan ngetung nomer gedhe lan gedhe. Asring digunakake nalika nggarap wektu. Utawa liwat jarak adoh, contone. Kanggo nunjukake yen nomer dawa, pasang huruf L - Long sawise nomer kasebut. Tuladha:
long longValue = 4;
longValue = 1l; // Не ошибка, но плохо читается
longValue = 2L; // Идеально
Aku pengin luwih dhisik. Sabanjure, kita bakal nimbang kasunyatan sing ana pambungkus sing cocog kanggo primitif, sing ngidini kanggo nggarap primitif minangka obyek. Nanging ana fitur menarik. Iki minangka conto: Nggunakake kompiler online Tutorialspoint sing padha, sampeyan bisa mriksa kode ing ngisor iki:
public class HelloWorld {

     public static void main(String []args) {
        printLong(4);
     }

    public static void printLong(long longValue) {
        System.out.println(longValue);
    }
}
Kode iki dianggo tanpa kasalahan, kabeh iku nggoleki. Nanging sanalika jinis ing cara printLong diganti saka dawa kanggo Long (i.e. jinis dadi ora primitif, nanging obyek), dadi ora cetha Jawa parameter apa kita liwat. Iku wiwit nganggep yen int lagi ditularaké lan bakal ana kesalahan. Mulane, ing kasus cara, kudu kanthi jelas nuduhake 4L. Kerep banget dawa digunakake minangka ID nalika nggarap database.

Jawa ngambang lan Jawa ganda

Jinis iki diarani tipe floating point. Tegese, iki dudu jinis integer. Jinis float punika 32 bit (kaya int), lan pindho diarani jinis tliti pindho, supaya 64 bit (multiply dening 2, kaya kita seneng). Tuladha:
public static void main(String []args){
        // float floatValue = 2.3; lossy conversion from double to float
        float floatValue = 2.3F;
        floatValue = 2.3f;
        double doubleValue = 2.3;
        System.out.println(floatValue);
        double cinema = 7D;
}
Lan ing ngisor iki conto prabédan ing nilai (amarga presisi jinis):
public static void main(String []args){
        float piValue = (float)Math.PI;
        double piValueExt = Math.PI;
        System.out.println("Float value: " + piValue );
        System.out.println("Double value: " + piValueExt );
 }
Jinis primitif iki digunakake ing matématika, contone. Punika bukti, konstanta kanggo ngitung nomer PI . Inggih, ing umum, sampeyan bisa ndeleng API saka kelas Math. Mangkene liyane sing kudu penting lan menarik: malah dokumentasi ujar: " Jinis data iki ora bakal digunakake kanggo nilai sing tepat, kayata mata uang. Kanggo iku, sampeyan kudu nggunakake kelas java.math.BigDecimal tinimbang.Nomer lan Strings nyakup BigDecimal lan kelas migunani liyane sing diwenehake dening platform Java. " Tegese, dhuwit ing float lan pindho ora perlu diitung. Conto babagan akurasi nggunakake conto kerja ing NASA: Java BigDecimal, Nangani petungan kanthi presisi sing dhuwur Ya, rasakake dhewe:
public static void main(String []args){
        float amount = 1.0000005F;
        float avalue = 0.0000004F;
        float result = amount - avalue;
        System.out.println(result);
}
Tindakake conto iki, banjur tambahake 0 sadurunge nomer 5 lan 4. Lan sampeyan bakal weruh kabeh medeni) Ana laporan menarik ing Rusia babagan float lan pindho ing topik: https://youtu.be/1RCn5ruN1fk Conto kerja karo BigDecimal bisa katon kene: Nggawe sen karo BigDecimal Miturut cara, float lan pindho bisa bali luwih saka mung nomer. Contone, conto ing ngisor iki bakal ngasilake Tanpa wates:
public static void main(String []args){
        double positive_infinity = 12.0 / 0;
        System.out.println(positive_infinity);
}
Lan iki bakal ngasilake NAN:
public static void main(String []args){
        double positive_infinity = 12.0 / 0;
        double negative_infinity = -15.0 / 0;
        System.out.println(positive_infinity + negative_infinity);
}
Cetha babagan tanpa wates. Apa NaN? Iki Ora nomer , tegese asil ora bisa diitung lan dudu nomer. Punika conto: Kita arep ngetung ROOT kothak saka -4. Oyod kuadrat saka 4 yaiku 2. Tegese, 2 kudu kuadrat banjur entuk 4. Apa sing kudu kuadrat kanggo entuk -4? Ora bakal bisa, amarga ... yen ana nomer positif, banjur bakal tetep. Lan yen negatif, banjur minus dening minus bakal menehi plus. Tegese, ora bisa diitung.
public static void main(String []args){
        double sqrt = Math.sqrt(-4);
        System.out.println(sqrt + 1);
        if (Double.isNaN(sqrt)) {
           System.out.println("So sad");
        }
        System.out.println(Double.NaN == sqrt);
}
Mangkene ringkesan liyane babagan topik nomer floating point: Where is your point?
Apa maneh sing kudu diwaca:

boolean Jawa

Jinis sabanjure yaiku Boolean (jinis logis). Sampeyan mung bisa nampa nilai sing bener utawa salah, yaiku tembung kunci. Digunakake ing operasi logis kayata while loops, lan ing cabang nggunakake if, switch. Apa sing menarik sing bisa ditemokake ing kene? Contone, kanthi teoritis, kita mung butuh 1 informasi, 0 utawa 1, yaiku bener utawa salah. Nanging ing kasunyatan, Boolean bakal njupuk luwih akeh memori lan iki bakal gumantung ing implementasine JVM tartamtu. Biasane iki biaya padha int. Pilihan liyane yaiku nggunakake BitSet. Mangkene katrangan singkat saka buku Java Fundamentals: BitSet

aksara jawa

Saiki kita wis tekan jinis primitif pungkasan. Dadi, data ing char njupuk 16 bit lan nggambarake karakter kasebut. Jawa nggunakake enkoding Unicode kanggo char. Simbol kasebut bisa disetel miturut rong tabel (sampeyan bisa ndeleng ing kene ):
  • Tabel karakter Unicode
  • Tabel karakter ASCII
Jinis primitif ing basa Jawa: Ora pati primitif - 3
Tuladha ing studio:
public static void main(String[] args) {
    char symbol = '\u0066'; // Unicode
    symbol = 102; // ASCII
    System.out.println(symbol);
}
Miturut cara, char, sing ateges nomer, ndhukung operasi matematika kayata jumlah. Lan kadhangkala iki bisa nyebabake akibat sing lucu:
public class HelloWorld{

    public static void main(String []args){
        String costForPrint = "5$";
        System.out.println("Цена только для вас " +
        + costForPrint.charAt(0) + getCurrencyName(costForPrint.charAt(1)));
    }

    public static String getCurrencyName(char symbol) {
        if (symbol == '$') {
            return " долларов";
        } else {
            throw new UnsupportedOperationException("Not implemented yet");
        }
    }

}
Aku banget nyaranake mriksa IDE online saka tutorialspoint . Nalika aku ndeleng teka-teki iki ing salah sawijining konferensi, iku ngunggahake semangatku. Muga-muga sampeyan uga seneng karo conto kasebut) DIPERBARUI: Iki ana ing Joker 2017, laporan: " Java Puzzlers NG S03 - Saka ngendi sampeyan kabeh? "

Literal

Literal minangka nilai sing ditemtokake kanthi jelas. Nggunakake literal, sampeyan bisa nemtokake nilai ing sistem nomer beda:
  • Sistem desimal: 10
  • Sistem heksadesimal: 0x1F4, diwiwiti kanthi 0x
  • Sistem Octal: 010, diwiwiti saka nol.
  • Sistem biner (wiwit Java7): 0b101, diwiwiti ing 0b
Aku bakal manggon sethitik liyane ing sistem octal, amarga iku lucu:
int costInDollars = 08;
Baris kode iki ora bakal dikompilasi:
error: integer number too large: 08
Kayane omong kosong. Saiki ayo elinga babagan sistem biner lan oktal. Ora ana loro ing sistem binar, amarga ana rong nilai (wiwit 0). Lan sistem octal nduweni 8 nilai, wiwit saka nol. Tegese, nilai 8 dhewe ora ana. Mulane, iki minangka kesalahan sing sepisanan katon ora masuk akal. Lan kanggo ngelingi, iki aturan "tindak lanjut" kanggo nerjemahake nilai:
Jinis primitif ing basa Jawa: Ora pati primitif - 4

Kelas Wrapper

Primitif ing Jawa duwe kelas bungkus dhewe supaya sampeyan bisa nggarap minangka obyek. Tegese, kanggo saben jinis primitif ana jinis referensi sing cocog. Jinis primitif ing basa Jawa: Ora pati primitif - 5Kelas Wrapper ora bisa diganti: iki tegese yen obyek digawe, negarane - nilai kolom nilai - ora bisa diganti. Kelas Wrapper diumumake minangka final: obyek, supaya bisa diwaca mung. Aku uga kaya kanggo sebutno iku ora bisa kanggo warisan saka kelas iki. Jawa kanthi otomatis nggawe konversi antarane jinis primitif lan pambungkus:
Integer x = 9;          // autoboxing
int n = new Integer(3); // unboxing
Proses ngowahi jinis primitif dadi jinis referensi (int->Integer) diarani autoboxing , lan mbalikke diarani unboxing . Kelas kasebut ngidini kanggo nyimpen primitif ing sawijining obyek, lan obyek kasebut bakal tumindak kaya Obyek (uga, kaya obyek liyane). Kanthi kabeh iki, kita entuk macem-macem cara statis sing migunani, kayata mbandhingake angka, ngowahi simbol dadi cilik, nemtokake manawa simbol minangka huruf utawa angka, nggoleki nomer minimal, lsp. Fungsi sing kasedhiya mung gumantung ing pambungkus kasebut. Conto implementasine dhewe saka pambungkus kanggo int:
public class CustomerInt {

   private final int value;

   public CustomerInt(int value) {
       this.value = value;
   }

   public int getValue() {
       return value;
   }
}
Paket utama, java.lang, wis duwe implementasine saka kelas Boolean, Byte, Short, Character, Integer, Float, Long, Double, lan kita ora perlu nggawe apa-apa dhewe, nanging mung nggunakake maneh sing wis siap. siji. Contone, kelas kasebut menehi kita kemampuan kanggo nggawe, umpamane, dhaptar , amarga Dhaptar mung kudu ngemot obyek, sing primitif ora. Kanggo ngowahi nilai saka jinis primitif, ana cara statis valueOf, contone, Integer.valueOf (4) bakal ngasilake obyek saka jinis Integer. Kanggo konversi mbalikke ana cara intValue (), longValue (), etc.. Compiler masang telpon kanggo valueOf lan * Nilai ing dhewe, iki inti saka autoboxing lan autounboxing. Kaya apa conto autopacking lan autounpacking sing ditampilake ing ndhuwur:
Integer x = Integer.valueOf(9);
int n = new Integer(3).intValue();
Sampeyan bisa maca liyane babagan autopacking lan autounpacking ing artikel iki .

Cast

При работе с примитивами существует такое понятие How приведение типов, одно из не очень приятных свойств C++, тем не менее приведение типов сохранено и в языке Java. Иногда мы сталкиваемся с такими ситуациями, когда нам нужно совершать взаимодействия с данными разных типов. И очень хорошо, что в некоторых ситуациях это возможно. В случае с ссылочными переменными, там свои особенности, связанные с полиморфизмом и наследованием, но сегодня мы рассматриваем простые типы и соответственно приведение простых типов. Существует преобразование с расширением и преобразование сужающее. Всё на самом деле просто. Если тип данных становится больше (допустим, был int, а стал long), то тип становится шире (из 32 бит становится 64). И в этом случае мы не рискуем потерять данные, т.к. если влезло в int, то в long влезет тем более, поэтому данное приведение мы не замечаем, так How оно осуществляется автоматически. А вот в обратную сторону преобразование требует явного указания от нас, данное приведение типа называется — сужение. Так сказать, чтобы мы сами сказали: «Да, я даю себе отчёт в этом. В случае чего — виноват сам».
public static void main(String []args){
   int intValue = 128;
   byte value = (byte)intValue;
   System.out.println(value);
}
Whatбы потом в таком случае не говорor что «Ваша Джава плохая», когда получат внезапно -128 instead of 128 ) Мы ведь помним, что в byteе 127 верхнее meaning и всё что находилось выше него соответственно можно потерять. Когда мы явно превратor наш int в byte, то произошло переполнение и meaning стало -128.

Область видимости

Это то место в codeе, где данная переменная будет выполнять свои функции и хранить в себе Howое-то meaning. Когда же эта область закончится, переменная перестанет существовать и будет стерта из памяти и. How уже можно догадаться, посмотреть or получить ее meaning будет невозможно! Так что же это такое — область видимости? Jinis primitif ing basa Jawa: Ora pati primitif - 6Область определяется "блоком" — вообще всякой областью, замкнутой в фигурные скобки, выход за которые сулит удаление данных объявленных в ней. Или How минимум — сокрытие их от других блоков, открытых вне текущего. В Java область видимости определяется двумя основными способами:
  • Классом.
  • Методом.
Как я и сказал, переменная не видна codeу, если она определена за пределами блока, в котором она была инициализирована. Смотрим пример:
int x;
x = 6;
if (x >= 4) {
   int y = 3;
}
x = y;// переменная y здесь не видна!
И How итог мы получим ошибку:

Error:(10, 21) java: cannot find symbol
  symbol:   variable y
  location: class com.javaRush.test.type.Main
Области видимости могут быть вложенными (если мы объявor переменную в первом, внешнем блоке, то во внутреннем она будет видна).

Заключение

Сегодня мы познакомorсь с восемью примитивными типами в Java. Эти типы можно разделить на четыре группы:
  • Целые числа: byte, short, int, long — представляют собой целые числа со знаком.
  • Числа с плавающей точкой — эта группа включает себе float и double — типы, которые хранят числа с точностью до определённого знака после запятой.
  • Булевы значения — boolean — хранят значения типа "истина/ложь".
  • Karakter - klompok iki kalebu jinis char.
Kaya sing dituduhake ing teks ing ndhuwur, primitif ing Jawa ora patiya primitif lan ngidini sampeyan ngatasi akeh masalah kanthi efektif. Nanging iki uga ngenalake sawetara fitur sing kudu kita eling yen kita ora pengin nemoni prilaku sing ora bisa diramal ing program kita. Kaya sing dikandhakake, sampeyan kudu mbayar kabeh. Yen kita pengin primitif karo "tajam" (sudhut) sawetara - kaya dawa - kita kurban alokasi saka Piece luwih gedhe saka memori lan ing arah ngelawan. Kanthi ngirit memori lan nggunakake bait, kita entuk sawetara winates saka -128 nganti 127.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION