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);
}
}