① java中的基本数据类型一定存储在栈中吗
首先:
八个基本数据类型不能看作对象(这点很特殊),存放在栈中。栈内操作速度快,创建销毁很容易。
其次:
八个基本数据类型都有对应的包装类,包装类就是对象了。比如Integer j = new Integer(10)。j属于对象的引用,引用放在栈中,而实际的数据10 则放在堆中。 (堆区适合存放大的数据对象,但是操作速度远远不及栈中)
(提示:对象的销毁---对象的引用放在栈中,所以使用完引用就被从栈中销毁了,但是实际的对象仍然存放在堆中,只有在没有任何的引用使用它的时候才被垃圾回收器销毁掉)
上面都是java的基础部分-----你看《Thinking in java》吧,上面解释的非常清楚
② 数据类型
一.什么是数据类型
1.在网络给的官方意思是:
数据类型在数据结构中的定义是一个值的集合以及在这个值集上的一组操作。
2.我们可以简单的理解成:java对数据进行了分类,存在不同的数据类型。
3.为什么需要对数据进行分类:
因为不同的数据类型所占用的空间不一样,也就是为了更好的用计算机的内存空间。
二.数据的类型
数据类型分为:基本数据类型和引用数据类型
1.基本数据类型
1).基本类型分为:数值型、字符型(char)、布尔型(boolean)
①.数值型有:整数数据类型(byte、short、int、long)和浮点数据类型(float、double)
②.字符型有:char
③.布尔型(boolean)有:true、false
2).整数数据类型的大小如下图所示:
如果需要储存的值比long的值还大怎么办
Java提供了一个类:BigInteger:用于处理较大整数
3).浮点数数据类型的大小如下图所示:
①.float表示単精度(32位)、double表示双精度(64位)
②.単精度和双精度的区别:
a.于单精度浮点数,运行速度相比double更快,占内存更小,
b.是当数值非常大或者非常小的时候会变得不精确。
c.度比单精度表示的位数大精确的位数多,简单地说, float表示的小数点位数少
注意:浮点数表示的不是一个精准的数字,它只是一个无限接近该数字的值
如果要精准的表示某一个小数的话Java提供了一个类BigDecimal来表示更精准的浮点数
4).字符数据类型(char)
①.是字符:单引号引起来的 一个符号 就是字符数据例如:’A’
②.char是16 位,值的范围[0-65535 ],没有负数。字符常量使用单引号 ‘’包裹起来。
③.使用一个数字表示,对应有一个ASCII码表[ 字符编码 ]表示‘A’ 这个字符
④.字符数据可以当成一个整数来使用,
什么是asscii表,就像化学元素周如下
5).布尔数据类型(boolean)
就两个值 true和false,但是不能用0和1表示
6).引用数据类型:类(class)、接口(interface)、数组
重点说一下String这个引用类型:
①.String是java中已经设计好的一个类,表示的值是字符串,是字符串数据类型
②.基本表现形式: String i = "hfdjks";
③.String和运算符+ 一起使用时 ,这时运算符表示字符串拼接如:
String name = "小李";
System.out.println(“name:”+name+12);//输出结果为:name:小李12
三.基本数据类型和引用数据类型的区别
1.基本数据类型
基本数据类型存储的是数据本身(值)
2.引用数据类型
引用数据类型存储的是数据(值)的引用(也就是数据在内存中的地址)
四. 数据类型的默认值
1. java的程序中每个数据都有默认类型,比如:10,在java中的默认类型为int;
2.每种数据对应的数据类型如下:
只要是整数:默认类型为int,(注意long类型的整数需要在数据类型后面加上一个L)
只要是小数:默认类型为double
只要是单引号:默认类型为char(注意单引号内部只能有一个符号)
只要是双引号:默认类型为String
只要是 true或者false:默认为Boolean类型
③ java基本数据类型在栈中怎么存放的
public void foo() {
int i = 100000000;
int j = 1;
Bar b = new Bar();
}
上面代码编译成class文件之后
public void foo();
flags: ACC_PUBLIC
Code:
stack=2, locals=4, args_size=1
0: ldc #15 // int 100000000
2: istore_1
3: iconst_1
4: istore_2
5: new #1 // class Bar
8: p
9: invokespecial #16 // Method "<init>":()V
12: astore_3
13: return
LineNumberTable:
line 3: 0
line 4: 3
line 5: 5
line 6: 13
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this LBar;
3 11 1 i I
5 9 2 j I
13 1 3 b LBar;
栈深度为2 本地变量表为4(对象方法对this的引用 存储i和j需要的地址 存储Bar用的地址)
由于我代码中是写死的字面常量100000000 所以有个ldc命令去常量池里读了
#15 = Integer 100000000
这个常量 然后调用store命令存入了本地变量表的第Name为1的位置
然后后边的int j = 1; 直接调用了iconst_1(这个1都没有存到类的常量池里..)获取了值为1的常量 然后存储到了Name为2的位置
然后Bar对象是引用类型 所以是LBar
例子并不全 你可以自己加一些代码 比如你加一个 int h = i + j;
你就会发现他通过iload命令读取加载变量表中指定位置的值到栈中 然后调用iadd自动从栈中弹出两个之前加载的int值进行计算 栈深度其实就是指他一次能加载多少变量到栈
这个随便说说你不会清楚的 找本虚拟机的书 了解下基本指令 然后对照自己的class文件 你就明白了
④ java 基本数据类型 变量赋的值,储存在计算机的哪里啊 eg: int i=0; 0储存在哪里啊 是在栈中堆
0是在栈中的。
java中八大基本类型都是值传递的,比如
public class Test1 {
public static void main(String[] args) {
int i=1;
add(i);
System.out.println(i);
}
public static void add(int i){
i++;
}
}
运行结果为1
值传递确实是将值复制给方法中的局部变量
比起这个以后肯定会碰到String的值传递,因为String类型一旦创建就无法改变,是final类,所以虽然String是引用类型,但传值规律是和基本类型一样的。
⑤ C语言的基本类型在内存中怎么储存的
C语言的基本类型在内存中以二进制的形式储存的。
1、整型数据:所有整数(正负零)在内存中都是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加1。
2、字符型数据:把字符的相对应的ASCII码放到存储码单元中,而这些ASCII代码值在计算机中同样以二进制补码的形式存放的。
3、实型数据:也叫浮点数,在计算机中也是以二进制的方式存储,关键在于如何将十进制的小数转化为二进制来表示。
扩展资料:
根据计算机的内部字长和编译器的版本,C语言的基本类型表示的数的长度范围是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。
如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。长整数158L和基本整常数158在数值上并无区别。
⑥ java基本数据类型在栈中怎么存放的
1、所有的基本数据类型全部是存储在栈里面,速度快。2、一个对象,它的实体是存储在堆里面的,而它的引用是存储在栈里面。
2
例子:String str = new String("123");这个str就在栈里面,而他的"123"这个对象在堆里面。 str 指向"123";3、就对象本身而言,它的所有属性的值如果不是单例或者静态的,就是存储在堆里面的。一个类的所有对象的属性值都在堆里面 并且占用不同的内存空间,而一个类的方法只在方法区里占一个地方,所有的对象指向同一个方法区。
⑦ java中基本数据类型,在内存中的分配问题
int double等8种基本类型的数据是存放在栈中的。
Integer Double 等是引用类型,是 new 出来的,这些对象会在内存的堆中开辟空间存放。
⑧ Java 基本数据类型作为局部变量存储在哪
基本数据类型作为局部变量是放在栈中的,new出来的对象是放在堆中的,用static声明的变量是静态变量,静态变量和字符串常量是放在data segment中的
⑨ Java基本数据类型
一、基本数据类型:
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0
short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0
int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0
long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L
float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数字(与double的区别在于float类型有效小数点只有6~7位),默认值0
double:双精度浮点型,用于存储带有小数点的数字,在内存中占64位,即8个字节,默认值0
char:字符型,用于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空
boolean:布尔类型,占1个字节,用于判断真或假(仅有两个值,即true、false),默认值false
二、Java数据类型基本概念:
数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范会相对严格。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上讲将数据类型分为两种:基本类型和引用数据类型。
基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。
引用数据类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。
三、Java中的数据类型与内存的关系
在Java中,每个存放数据的变量都是有类型的,如:
charch;floatx;inta,b,c;
ch是字符型的,就会分配到2个字节内存。不同类型的变量在内存中分配的字节数不同,同时存储方式也是不同的。
所以给变量赋值前需要先确定变量的类型,确定了变量的类型,即确定了数据需分配内存空间的大小,数据在内存的存储方式。
四、Java数据类型在内存中的存储:
1)基本数据类型的存储原理:所有的简单数据类型不存在“引用”的概念,基本数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面八种数据类型是这种存储模型;
2)引用类型的存储原理:引用类型继承于Object类(也是引用类型)都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,昆明北大青鸟http://www.kmbdqn.cn/认为“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。
⑩ java基本数据类型在栈中怎么存放的
public void foo() {
int i = 100000000;
int j = 1;
Bar b = new Bar();
}
上面代码编译成class文件之后
public void foo();
flags: ACC_PUBLIC
Code:
stack=2, locals=4, args_size=1
0: ldc #15 // int 100000000
2: istore_1
3: iconst_1
4: istore_2
5: new #1 // class Bar
8: p
9: invokespecial #16 // Method "":()V
12: astore_3
13: return
LineNumberTable:
line 3: 0
line 4: 3
line 5: 5
line 6: 13
LocalVariableTable:
Start Length Slot Name Signature
0 14 0 this LBar;
3 11 1 i I
5 9 2 j I
13 1 3 b LBar;
栈深度为2 本地变量表为4(对象方法对this的引用 存储i和j需要的地址 存储Bar用的地址)
由于我代码中是写死的字面常量100000000 所以有个ldc命令去常量池里读了
#15 = Integer 100000000
这个常量 然后调用store命令存入了本地变量表的第Name为1的位置
然后后边的int j = 1; 直接调用了iconst_1(这个1都没有存到类的常量池里..)获取了值为1的常量 然后存储到了Name为2的位置
然后Bar对象是引用类型 所以是LBar
例子并不全 你可以自己加一些代码 比如你加一个 int h = i + j;
你就会发现他通过iload命令读取加载变量表中指定位置的值到栈中 然后调用iadd自动从栈中弹出两个之前加载的int值进行计算 栈深度其实就是指他一次能加载多少变量到栈
这个随便说说你不会清楚的 找本虚拟机的书 了解下基本指令 然后对照自己的class文件 你就明白了