java不可变量有哪些_5.Java变量
5.Java變量
所有的程序都使用變量臨時存儲各種數據, 在Java語言中變量必須在程序中被定義(或聲明)后才能使用, 必須為每個變量確定一個具體類型.Java中變量分為基礎類型變量和引用類型變量.
① 基礎類型變量
Java有八種基礎類型變量. 分為數字類型(四個整數型,兩個浮點型), 布爾型和字符類型.
1. 數字類型變量byte?字節型變量,表示整數,取值范圍(-2^8到2^8-1),不支持小數.byte?b0?=?88;byte?b1?=?-10;short?短整型變量,表示整數,取值范圍(-2^16到2^16-1),不支持小數.short?s0?=?99;short?s1?=?-1;int?整型變量,表示整數,取值范圍(-2^32到2^32-1),不支持小數.
×××常量,范圍可以粗略即為正負21億之間,超過這個范圍需要采用long類型.int?i0?=?100000;int?i1?=?-2;long?長整型變量,表示整數,取值范圍(-2^64到2^64-1),不支持小數.long?l0?=?100000L;long?l1?=?-3L;float?浮點數類型,表示小數,取值范圍(到).浮點數有舍入誤差.
定義變量時,需要在數字后邊加個字符f或者F,表示該數字為float類型.float?f0?=?3.14f;float?f1?=?2.73F;double: 浮點數類型,表示小數,取值范圍(到).浮點數有舍入誤差.
定義變量時,需要在數字后邊加個字符d或者D,表示該數字為double類型.double?d0?=?123.4d;double?d1?=?1.4D;char?字符型,用英文單引號'定義.可以儲存任何字符.也可以當整數來用,但一般情況不建議這么用.char?c0?=?'a';char?c1?=?'人';
數據類型和范圍
寫代碼時,根據數據類型和范圍選擇對應的數字類型.超過類型的最大值或者小于最小值的數據會出錯.
java默認值
在java里面定義一個變量, 如果不主動給它賦值, 系統會自動給它賦一個值,這個值叫做`默認值`.
java數字類型的最大值和最小值
計算機存儲×××數據是以二進制方式存儲,有符號數據類型(byte, short, int, long, float)最小值為`-2^n`,最大值為`2^-1`,`n`為占用字節數.無符號類型(char)最小值為0,最大值為2^16(65535). 存儲浮點類型數據表示范圍太大,采用科學計數法方式存儲,所以范圍會整數型大很多.Java數字類型變量默認值和取值范圍類型默認值位數最小值最大值byte08-128127
short016-2^162^16-1
int032-2^322^32-1
long064-2^642^64-1
float0f32-3.4 * 10^383.4 * 10^38
double0d64-1.7 * 10^3081.7 * 10^308
char01602^16
booleanfalse1
浮點數不是精確值
浮點數值不適合用于禁止出現舍入誤差的金融計算中. 例如:System.out.println(2.0-1.1); 將打印0.899999999999999,而不是0.9.因為浮點數值采用二進制系統表示,而二進制無法精確表示分數1/10,就像十進制無法精確表示1/3一樣.如果需要在數值計算中不含有舍入誤差,應該使用BigDecimal類.
2. 布爾類型變量
boolean(布爾類型),只有兩個取值:true(是)和false(否). 默認值false.boolean?bo0?=?true;boolean?bo1?=?false;
示例代碼:package?com.dashidan.lesson5;/**
*?大屎蛋教程網-dashidan.com
*?
*?Java教程基礎篇:?5.?Java變量
*?基礎類型變量
*/public?class?Demo1?{
public?static?void?main(String[]?args)?{
/**?byte?變量*/
byte?b0?=?88;
byte?b1?=?-10;
System.out.println(b0);
System.out.println(b1);
/**?short?變量*/
short?s0?=?99;
short?s1?=?-1;
System.out.println(s0);
System.out.println(s1);
/**?int?變量*/
int?i0?=?100000;
int?i1?=?-2;
System.out.println(i0);
System.out.println(i1);
/**?long?變量*/
long?l0?=?100000L;
long?l1?=?-3L;
System.out.println(l0);
System.out.println(l1);
/**?float?變量*/
float?f0?=?3.14f;
float?f1?=?2.73F;
System.out.println(f0);
System.out.println(f1);
/**?double?變量*/
double?d0?=?123.4d;
double?d1?=?1.4D;
System.out.println(d0);
System.out.println(d1);
boolean?bo0?=?true;
boolean?bo1?=?false;
System.out.println(bo0);
System.out.println(bo1);
/**?char?變量*/
char?c0?=?'a';
char?c1?=?'人';
System.out.println(c0);
System.out.println(c1);
System.out.println(c0?+?c1);
}}
輸出:88
-10
99
-1
100000
-2
100000
-3
3.14
2.73
123.4
1.4
true
false
a
人
20251
② 字符串類型變量
字符串類型是對象類型,不屬于基礎類型. 賦值的時候屬于值傳遞. 在Java中,String是不可變(final)的.Java在運行時保存了一個字符串池(String pool),這使String成為了一個特別的類.
java中字符串為什么是不可變的?
只有當字符串是不可變的,字符串池才有可能實現. 字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串.但如果字符串是可變的,那么`String interning`將不能實現(譯者注:String interning是指對不同的字符串僅僅只保存一個,即不會保存多個相同的字符串.),因為這樣的話,如果變量改變了它的值,那么其它指向這個值的變量的值也會一起改變.如果字符串是可變的,那么會引起很嚴重的安全問題.譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來獲得數據庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入, 這個值如果被修改, 將會帶來很嚴重的安全隱患.
java中字符串不可變有什么優點?
* 由于字符串的值是不可變的, 無改變字符串指向的對象的值,避免安全漏洞.
* 多線程安全, 同一個字符串實例可以被多個線程共享. 這樣便不用因為線程安全問題而使用同步.字符串自己便是線程安全的.
* 類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載. 譬如你想加載java.sql.Connection類,而這個值被改成了myhacked.Connection,那么會對你的數據庫造成不可知的破壞.
* 在它創建的時候hashcode就被緩存了,不需要重新計算. 這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象.這就是HashMap中的鍵往往都使用字符串.
字符串賦值
常用有2種方式: 直接通過=賦值, 和通過new String()?的方式創建字符串對象賦值.String?s1?=?"test0";String?s2?=?new?String("test1");String?s3?=?new?String(s2);
獲取字符串長度
通過String對象自帶的length()方法.String?s0?=?"test0";int?size?=?s0.length();
字符相加
通過+操作可以將2個字符串組合.String?s0?=?"test0";String?s1?=?"test1";String?s2?=?s0?+?s1;
字符串比較
字符串比較內容是否相同,需要通過equals()方法.
字符串比較
Java的虛擬機處理字符串相同的時候很神奇. 通常`==`對于引用類型的變量來說是判斷內存地址是否相同. 但字符串這里虛擬機進行了優化, 會通過Java獨有的"字符串池"技術, 自動判斷上下文中是否有相同的字符串, 如果有相同的字符串, 則直接把原有的字符串對象拿來使用, 不重新創建字符串對象. 如果字符串發生改變則自動創建一個新的字符串對象.
示例代碼:package?com.dashidan.lesson5;/**
*?大屎蛋教程網-dashidan.com
*
*?Java教程基礎篇:?5.?Java變量
*?字符串變量
*/public?class?Demo2?{
public?static?void?main(String[]?args)?{
String?s0?=?"大屎蛋教程網";
String?s1?=?"大屎蛋教程網";
String?s2?=?new?String("大屎蛋教程網");
/**?equal比較字符串內容*/
boolean?isSame?=?s0.equals(s1);
System.out.println("1?equals?isSame?:?"?+?isSame);
isSame?=?s0.equals(s1);
System.out.println("2?equals?isSame?:?"?+?isSame);
isSame?=?s0.equals(s2);
System.out.println("3?equals?isSame?:?"?+?isSame);
/**?s2?是通過new的方式從新創建的字符串對象,s0?s2?指向不同的內存地址*/
isSame?=?(s0?==?s2);
System.out.println("4?==?isSame?:?"?+?isSame);
isSame?=?(s0?==?s1);
/**?這里里的賦值,java虛擬機做了處理,自動指向了同一個字符串*/
System.out.println("5?==?isSame?:?"?+?isSame);
/**?改變字符串?s0*/
s0?+=?"aaa";
/**?s0?發生變化*/
System.out.println("s0?"?+?s0);
/**?s1?沒有發生變化*/
System.out.println("s1?"?+?s1);
/**?字符串s0?發生改變,虛擬機自動新建了一個字符串對象,s0?s1不再指向同一個字符串*/
isSame?=?(s0?==?s1);
System.out.println("6?==?isSame?:?"?+?isSame);
}}
輸出:1?equals?isSame?:?true
2?equals?isSame?:?true
3?equals?isSame?:?true
4?==?isSame?:?false
5?==?isSame?:?true
s0?大屎蛋教程網aaa
s1?大屎蛋教程網
6?==?isSame?:?false
③ 引用類型變量
引用類型(reference type)指向對象在內存空間的地址.
1. 什么是引用
把對象數據比喻為一座房子,引用就是門牌號. 一個對象在內存中會請求一塊內存空間來保存數據,根據對象的大小, 需要占用的空間大小也不等. 訪問對象數據時, 不直接訪問對象在內存中的數據, 而是通過引用去訪問. 如果我們定義了不止一個引用指向同一個對象, 那么這些引用是不相同的, 因為引用也是一種數據類型, 需要一定的內存空間(棧空間stack)來保存. 但是它們的指向的對象數據是相同的, 都指示同一個對象在內存(堆空間heap)的中位置.
例:String?a="This?is?a?Text!";String?b=a;
a和b是不同的兩個引用,我們使用了兩個定義語句來定義它們. 但它們的值是一樣的, 都指向同一個對象 "This is a Text!".如圖:
String對象的值本身是不可更改的
像`b = "World";` `b = a;`這種情況不是改變了"World" 這一對象的值, 而是改變了它的引用`b`的值使之指向了另一個`String`對象`a`.
2.引用類型
java有3種引用類型類class
接口interface
數組array
3.引用要點引用是一種數據類型(保存在stack,??臻g), 保存了對象在內存(heap,堆空間)中的地址.不是簡單數據類型也不是類實例(對象).
不同的引用可能指向同一個對象,換句話說, 一個對象可以有多個引用, 即該類類型的變量.
4.引用傳遞
引用傳遞也稱為傳地址.方法調用時,實際參數的引用(地址)被傳遞給方法中相對應的形參和實參內容相同,指向同一塊內存地址,方法執行中對引用的操作將會影響到實際對象. 詳情參考:參數的值傳遞與引用傳遞.
④ 變量作用域
Java變量從影響范圍劃分, 分為成員變量和局部變量.
1. 成員變量
類內部定義的變量叫做成員變量,如果沒有設定初始值,系統會自動賦值為默認值. 作用范圍是整個類. 成員變量在所在類被實例化后,存在堆內存中.
2. 局部變量
方法內定義的變量被稱為局部變量,局部變量沒有默認值,聲明變量時必須設定初始值. 作用范圍從聲明開始,直到包含它的塊(對應的大括號})結束. 局部變量在所在方法調用時,存在棧內存中. 方法參數是局部變量,范圍涵蓋整個方法.
3. 示例代碼package?com.dashidan.lesson5;/**
*?大屎蛋教程網-dashidan.com
*?
*?Java教程基礎篇:?5.?Java變量
*?變量作用域
*/public?class?Demo3?{
/**
*?a,b?是成員變量,整個方法都可以調用.
*/
public?static?int?a;
public?static?float?b?=?3.0f;
public?static?void?main(String?args[])?{
/**??在方法中調用成員變量,?a為默認值,?b為設定值*/
System.out.println(a);
System.out.println(b);
testVar();
/**?這里輸出變量m,?n,編譯代碼時,會報錯,提示沒有定義變量m,n*/
//System.out.println(m);
//System.out.println(n);
}
public?static?void?testVar()?{
/**m,n?是成員變量,必須初始化賦值.作用域是在這個方法中.?*/
int?m?=?0;
int?n?=?1;
System.out.println(m);
System.out.println(n);
}}
輸出:0
3.0
0
1
⑤ 相關文章
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java不可变量有哪些_5.Java变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java linkedlist 方法_J
- 下一篇: java动态字段排序_JAVA 列表动态