A. java中基本數據類型,在內存中的分配問題
int double等8種基本類型的數據是存放在棧中的。
Integer Double 等是引用類型,是 new 出來的,這些對象會在內存的堆中開辟空間存放。
B. 在Java的基本數據類型中,char類型數據占幾位元組內存空間
在C語言中指針是一來個unsigned 類型的無符號自數,其所佔內存位元組一般是和計算機的CPU字長是一致的,拿32位計算機來說,指針所佔的內存空間一般為4個位元組,不管char *還是int *抑或是float *,都是4個位元組。
程序員可以使用sizeof運算符獲取數據類型或者某個變數的內存所佔位元組數。比如
printf("%d\t%d\t%d\n", sizeof(char *), sizeof(int *), sizeof(float *));
C. Java基本數據類型boolean占內存多少
boolean佔1個bit,1/8個位元組,而Boolean是引用類型,在棧內存中存放著它的引用,在堆內存中存放著它的對象(Integer可以看成是對象),沒法計算它占對少內存
D. Java里基本數據類型的內存分配問題
基本數據類型是在內存的棧里放的,int[]a=new int[5]. a放在棧里,a只是一個引用,棧中放的數組的地址,真正的數組是放在堆中的
E. Java中的基本類型和引用類型變數的區別
這有篇文章,是介紹關於Java堆和棧的,其中也有你的問題的答案,希望對你有用!
http://liufei-fir.javaeye.com/blog/699509
棧與堆都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。
Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和 multianewarray等指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由於要在運行時動態分配內存,存取速度較慢。
棧的優勢是,存取速度比堆要快,僅次於寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變數(,int, short, long, byte, float, double, boolean, char)和對象句柄。
棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:
int a = 3;
int b = 3;
編譯器先處理int a = 3;首先它會在棧中創建一個變數為a的引用,然後查找棧中是否有3這個值,如果沒找到,就將3存放進來,然後將a指向3。接著處理int b = 3;在創建完b的引用變數後,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。
這時,如果再令a=4;那麼編譯器會重新搜索棧中是否有4值,如果沒有,則將4存放進來,並令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。
要注意這種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改並不會影響到b, 它是由編譯器完成的,它有利於節省空間。而一個對象引用變數修改了這個對象的內部狀態,會影響到另一個對象引用變數。
String是一個特殊的包裝類數據。可以用:
String str = new String("abc");
String str = "abc";
兩種的形式來創建,第一種是用new()來新建對象的,它會在存放於堆中。每調用一次就會創建一個新的對象。
而第二種是先在棧中創建一個對 String類的對象引用變數str,然後查找棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,並令str指向」abc」,如果已經有」abc」 則直接令str指向「abc」。
比較類裡面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==,下面用例子說明上面的理論。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一個對象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的對象。每一次生成一個。
因此用第二種方式創建多個」abc」字元串,在內存中其實只存在一個對象而已. 這種寫法有利與節省內存空間. 同時它可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對於String str = new String("abc");的代碼,則一概在堆中創建新對象,而不管其字元串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。
另一方面, 要注意: 我們在使用諸如String str = "abc";的格式定義類時,總是想當然地認為,創建了String類的對象str。擔心陷阱!對象可能並沒有被創建!而可能只是指向一個先前已經創建的對象。只有通過new()方法才能保證每次都創建一個新的對象。
由於String類的immutable性質,當String變數需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。
F. Java程序運行時,沒有賦值的基本類型變數會在內存中分配空間嗎
基本類型的變數如果是臨時變數,只要定義了,就會分配內存空間,不管是否被賦值;如果是作為對象的屬性出現,只要該對象不實例化,就不會分配內存空間。x0dx0ax0dx0a一個完整的Java程序運行過程會涉及以下內存區域:x0dx0a1、寄存器:JVM內部虛擬寄存器,存取速度非常快,程序不可控制。x0dx0a2、 棧:保存局部變數的值,包括:x0dx0a 1)用來保存基本數據類型的值;x0dx0a 2)保存類的實例,即堆區對象的引用(指針)x0dx0a 3)也可以用來保存載入方法時的幀x0dx0a3、堆:用來存放動態產生的數據,比如new出來的對象。注意創建出來的對象只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的對象擁有各自的成員變數,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法復制一次。x0dx0ax0dx0a4、常量池:JVM為每個已載入的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、欄位的符號引用(1)。池中的數據和數組一樣通過索引訪問。由於常量池包含了一個類型所有的對其他類型、方法、欄位的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在於堆中。x0dx0ax0dx0a5、代碼段:用來存放從硬碟上讀取的源程序代碼。x0dx0a6、數據段:用來存放static定義的靜態成員。x0dx0ax0dx0a注意:x0dx0a 1.一個Java文件,只要有main入口方法,我們就認為這是一個Java程序,可以單獨編譯運行。x0dx0a 2.無論是普通類型的變數還是引用類型的變數(俗稱實例),都可以作為局部變數,他們都可以出現在棧中。只不過普通類型的變數在棧中直接保存它所對應的值,而引用類型的變數保存的是一個指向堆區的指針,通過這個指針,就可以找到這個實例在堆區對應的對象。因此,普通類型變數只在棧區佔用一塊內存,而引用類型變數要在棧區和堆區各佔一塊內存。
G. java中基本數據類型和引用數據類型在內存分配上有什麼不同
Java的內存分配上,主要分4個塊!
一塊是用來裝代碼的,就是編譯的東西。
一塊是用來裝靜態變數的,例如用static關鍵字的變數,例如字元串常量。
一塊是stack,也就是棧,是用來裝變數和引用類型的!但區別在於,裝了變數以後,變數上是有值的,而引用類型本身在stack上是沒有值的。
一塊是heap,也就是堆!堆可以一句話概括,裝new出來的東西!
所以綜上所述,基本數據類型都在stack中,而引用類型,變數是放在stack中,真正有內容的東西放在heap中,也就是當new了一個新的引用類型,他就會放在堆中,同時棧中的引用類型變數會指向堆中你new出來的東西!
這樣說希望能幫你了解到java的內存分配問題。
H. java的基本數據類型是什麼為什麼
Java語言是一種嚴格的「類型化」語言。這意味著每個變數都必須有一個聲明好的類型。
六種數字類型(四個整數型,兩個浮點型),一種字元類型,還有一種布爾型。
一、整數:
定義:沒小數部分,允許負數。
byte 1個位元組 -2^7~2^7-1
short 2個位元組 -2^15~21^5-1
int 4個位元組 -2^31~2^31-1
long 8個位元組 -2^63~2^63-1
二、浮點數:
定義:含小數部分。
float 4個位元組 約+—3.40282347E+38F(6~7個有效的十進制數位)
double 8個位元組 約+-1.79769313486231570E+308(15個有效數位)
說明:
1)float類型的數值有個後綴:f/F,如果沒有後綴f/F,那麼默認為double。
2)當這些數字遇到取值范圍錯誤時,會發生(上溢Overflow);而在遇到象被零除時,會發生下溢(Underflow)。
三、字元類型:
定義:單引號用來表示char常量,
說明:
1)雙引號則表示一個字串,他是Java的一個對象,並不是數據類型。
2)char類型表示Unicode編碼方案中的字元。
Unicode可同時包含65536個字元,ASCII/ANSI只包含255個字元,實際上是Unicode的一個子集。Unicode字元通常用
十六進制編碼方案表示,范圍在'\u0000'到'\uFFFF'之間。\u0000到\u00FF表示ASCII/ANSI字元。\u表示這是一個
Unicode值。
3)在Java中除了用這個\u的形式來表示字元外,還可以使用換碼序列來表示特殊字元。
\b 退格 \u0008
\t Tab製表 \u0009
\n 換行 \u000a
\r 硬回車 \u000d
\" 雙引號 \u0022
\' 單引號 \u0027
\ 反斜杠 \u005c
4)理論上在Java的應用程序和小應用程序中使用Unicode字元,但至於他們是否能真正顯示出來,卻要取決於使用的瀏覽器和操作系統,其中操作系統是最根本的。
四、布爾類型:
boolean類型只有兩個值:false和true
數據類型可以分為兩大類:
1)基本類型;
2)擴展類型。
本節中,我們就一起來學習一下Java語言的基本數據類型。它包括
類型 描述 取值范圍
Boolean 布爾型 只有兩個值true、false
Char 字元型
Byte 8位帶符號整數 -128到127之間的任意整數
Short 16位無符號整數 -32768~32767之間的任意整數
Int 32位帶符號整數 -231到231-1之間的任意整數
Long 64位帶符號整數 -263到263-1之間的任意整數
Float 32位單精度浮點數 根據IEEE754-1985標准
Double 64位雙精度浮點數 根據IEEE754-1985標准
一些提示:
不象其它程序設計語言,Java語言中的整型的位數是固定的,而不會根據硬體平台以及操作系統的不同而不同。
1> boolean型
在上一章的邏輯運算符中,我們就已經看到過了取值為true和false的變數,這種變數稱為boolean型變數。
實例說明
源程序:test601.java
public class test601
{
public static void main(string args[])
{
boolean x=true;
boolean y=false;
System.out.println("x&&y="+(x&&y));
System.out.println("x||y="+(x||y));
System.out.println("x^y="+(x^y));
System.out.println("!x="+(!x));
}
}
根據邏輯運算符的計算表可以得出x&&y=true&&false=false;x||y=true||false=true;x^y=true^false=true;!x=!true=false。
2 >char型
char型是用來表示字母的,它僅能表示一個單一的字母。通常char型常量必須使用單引號括起來,以與數字區分開來。下面就是一個char
型變數的實例:
char letter=』a』;
char型在Java語言中並不是很常用,因為如果要存儲字元的話,一般使用擴展的數據類型string.
3 >整型
在Java語言中,提供了多種整型數據類型:byte、short、int、long。它們都是定義了一個整數,唯一的區別就是它們能夠表示數據的范
圍。
能夠表示數據的范圍越大,佔用的內存空間也就越大,因此,在程序設計中應該選擇最合適的類型來定義整數。
大家可以根據以下規律,記住它們所佔的內存空間:
1) int是最基本的,它佔用32位(現代計算機不就是32位機嘛!);
2) long,長的,也就是比int還長,它佔用64位;
3) short,短的,也就是比short還短,它佔用16位;
4) byte,位元組,8位組成一個位元組,當然byte就只佔8位了。
根據它們所佔用的內存空間不同,能夠表示的數字范圍也不同。佔用內存空間越大,能夠表示的數字范圍也就越廣。
實例說明
源程序:test602.java
public class test602
{
public static void main(String args[])
{
int x=20;
System.out.println(x+5);
System.out.println(x*7);
}
}
源程序:test603.java
public class test603
{
public static void main(String args[])
{
byte x=129;
System.out.println(x+5);
}
}
4 >>浮點型
前面我們學習了存儲整數的變數數據類型,現在我們還看看存儲小數的變數數據類型---浮點數。在Java語言中有兩種浮點數類型:float
、double。
其中float是單精度型,佔用32位內存空間,而double是雙精度型,佔用64位內存空間。
浮點數:
浮點數這個名稱是相對於定點數而言的,這個點就是小數點。浮點數就是指小數點可以根據需要改位置。
源程序:test604.java
public class test604
{
public static void main(String args[])
{
float x1=7;
float y1=9;
double x2=7.0;
double y2=9.0;
System.out.println(x1/y1);
System.out.println(x2/y2);
}
}