Java的堆是一个运行时数据区,不需要程序代码来显式的释放,由垃圾回收来负责即可。堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器(因为是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据)。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和引用数据类型(这个和基本数据类型无关,不多做介绍)
1.3.1 数据共享简单介绍
//基本数据类型的共享和对象不一样,对象共享的本质上是引用,对象修改会影响另外一个变量,基本类型只是共享的值,当值修改时,实际上是让变量又重新指向了另一个地方
public static void main(String[] args) { int a = 5; int b = 5;//一定是先找栈里有没有5,有就让b也指向5 a = 6; //先找栈里有没有6,如果没有则新建6并让a指向
System.out.println(b); }
对于成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化。
形式参数是局部变量,局部变量的数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。
成员变量存储在堆中的对象里面,由垃圾回收器负责回收
1.class BirthDate {
2. private int day; //day是成员变量
3. private int month;
4. private int year;
5. public BirthDate(int d, int m, int y) {
6. day = d; //d是局部变量
7. month = m;
8. year = y;
9. }
10. 省略get,set方法………
11.}
十六进制整型常量:以十六进制表示时,需以0x或0X开头,如0xaa,0X9f。
八进制整型常量:八进制必须以0开头,如0123,034。
长整型: 长整型必须以L作结尾,如9L,342L。
浮点数常量: 由于小数常量的默认类型是double型,所以float类型的后面一定要加f(F)。同样带小数的变量默认为double类型。 如:float f;f=1.3f;//必须声明f。
字符常量: 字符型常量需用两个单引号括起来(注意字符串常量是用两个双引号括起来)。Java中的字符占两个字节。
1.4 Java基本类型的“类型转换”简单类型数据间的转换,有两种方式:自动转换和强制转换,通常发生在表达式中或方法的参数传递时。
1.4.1 自动转换:是JVM根据条件自动帮助我们转换,可以简单了解一下转换规则。当一个较"小"数据与一个较"大"的数据一起运算时,系统将自动将"小"数据转换成"大"数据,再进行运算 。
这些类型由"小"到"大"分别为 (byte,short,char)--int--long--float—double,这里我们所说的"大"与"小",并不是指占用字节的多少,而是指表示值的范围的大小 。所以byte --char--short之间不可以自动转换
1.4.2 强制转换:将"大"数据转换为"小"数据时,你必须使用强制类型转换。即你必须采用下面这种语句格式: int n=(int)3.14159/2;可以想象,这种转换肯定可能会导致溢出或精度的下降
表达式的数据类型自动提升 eg 所有的byte,short,char型的值将被提升为int型;
包装类和基本类型转换 :实际上Java存在一个自动装箱的机制,他可以自动转换。但是,我们可以用构造器转为包装类;用包装类对象的xxxValue()把包装类转为基本类型
其它类型间转为字符串:①调用类的串转换方法:X.toString(); ②自动转换:X+""; ③使用String的方法:String.volueOf(X);
字符串转为其它类型 ①先转换成相应的封装器实例,再调用对应的方法转换成其它类型 new Double("3.1").doubleValue().或者Double.valueOf("32.1").doubleValue()②静态parseXXX方法String s = "1";byte b = Byte.parseByte( s );
Date类与其它数据类型的相互转换 :整型和Date类之间并不存在直接的对应关系,只是你可以使用int型为分别表示年、月、日、时、分、秒,这样就在两者之间建立了一个对应关系 。具体转换,可能用到format类
1.4.3 备注只有boolean不参与数据类型的转换
二:String类型