目录
存储内容的不同:
基本类型:变量的值就是一个数字,一个字符或者是一个布尔值。基本数据类型包括:byte,char,short,int,long,double,float,boolean。
引用类型:是一个对象类型,它的值是 指向内存空间的引用,就是地址,所指的内存中保存着变量所表示的一个值或者一组值。
存储方式的不同:
基本类型(值类型)在内存中的存储位置主要与该变量声明的位置有关:
- 声明在方法内的局部变量,存放在栈中。
- 类变量和成员变量,存放在堆中的。
引用类型变量在栈中分配,引用类型的实例分配在堆中存储。
变量的赋值方式不同:
int a; a = 123; // 基本数据类型 a,在声明的时候就已经为其分配了内存空间,所以可以直接赋值 MyDay today; today.day = "Monday"; // 该方式就会报错,应为在引用对象的声明时只分配了引用空间,并没有分配数据空间, // 没人知道他是一个值,还是一组值。 // 引用类型对象的赋值,必须在声明后通过实例化为其分配一块数据空间,才对变量所指的对象进行访问。 today = new MyDay();
变量间值传递方式不同:
基本类型是值传递:因为基本类型在变量声明的时候就分配了内存空间,所以a和b占用不同的内存空间,因而二者的改变不存在互相影响。
int a = 5; int b = a; b = b + 5; // b = 10 ,a = 5; 值传递b的改变不会影响a
引用类型是引用传递:引用类型只有在实例化new MyDay()的时候才会分配内存空间。
MyDay a = new MyDay(); a.today = "Monday"; MyDay b = a; b.today = "Tuesday"; // a.today = "Tuesday",b.today = "Tuesday"。a,b间发生的引用传递,是二者存储了同一个对象的数据内存地址
String:特殊的引用类型
String间是值传递,因为String是 final类型变量,所以他是字符串常量。当String类型变量的值改变的时候,是重新指向另一个内存空间。
String 是字符串常量,无法改变字符串的内容,如果改变则创建一个新对象指向修改后的内容。所以经常改变的字符串变量不适合用String,StringBuffer和StringBuild是字符串变量,区别就在于 StringBuffer是线程安全的 ,StringBuilder不是线程安全的。但StringBuilder的效率高于StringBuffer。
String str = 'aa';// str指向内存1,内存1存放的内容是aa str = 'bb';// 对于String类型变量的修改,并不是修改了内存1中的内容,而是另外开辟了一块新的内存,内存2来存放bb
根据以上特征,在来看一下传递的过程:
String a = 'aa'; String b = a; String b = 'bb';
第一步 a指向内存1 存放的是aa
第二步 b指向内存1 存放的是aa
第三步 修改string的内容,则申请一块新的内存2,存放bb,并将变量b指向内存2此时的变量a的指向仍然是 内存1 存放的是aa
基本类型也存在着自己的包装类,包装类的作用:
基本类型拥有的赋值,运算,取值功能,包装类提供更多的功能来操作基本类型数据。
- 基本类型和包装类间相互转化
- 包装类和字符串之间相互转化 toString,valueOf