Java基础--【数据类型】--int & Integer

Java中Int(基础类型)和Integer(封装类,也叫包装类)


  • java中内存分配机制

  • 基本类型(原始数据类型)


byte short int long float double char boolean 基本类型的变量持有原始值。 

  • 复合数据类型(引用类型)


引用类型持有引用值(即对某个对象的引用,而非对象本身)。

 

  • 一般Java在内存分配时会涉及到以下区域:


寄存器:我们在程序中无法控制 

:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 (因为基本数据类型的数据字面值是存放在栈中的,因此使用起来的速度就会非常的快。假如是对象引用的话需要根据该对象的引用去堆中搜寻相应的对象内容,因此速度相对较慢

:存放用new产生的数据 

静态域:存放在对象中用static定义的静态成员 

常量池:存放常量 

非RAM存储:硬盘等永久存储空间 
其中主要是堆,栈的存储。

  • 【堆和栈】


函数中定义的一些基本类型的数据变量和对象的引用变量都在函数的栈内存中分配。栈的优势是存取速度比堆要快,仅次于直接位于CPU 的寄存器,而且数据可以共享。但是存在栈中的数据大小与生存周期必须是确定的。 

当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

  • 【基本数据类型】


这种类型是通过诸如 int a=7; 的形式来定义的,称为自动变量。这里自动变量是字面值。不是类的实例,即不是类的引用,这里并没有类的存在。a 是指向一个 int 类型的引用,指向 7 这个字面值。由于其大小确定生存期可知(这些定义在某个程序块中,程序块退出后,字段值就消失),因此存在中. 

由于栈的数据可以共享,因此 int a=3; int b=3; 这段代码,编译器首先处理 int a =3; ,先会在栈中创建一个变量为 a 的引用,然后查找有没有字面值为 3的地址,没有找到,就开辟一个存放 3 这个字面值的地址,然后将a 指向 3 的地址。接下来处理int b =3; 在创建完 b 这个引用变量后,由于栈中已经有 3 这个字面值,便将 b 指向 3 的地址。【定义变量,给变量赋值】

  • 【基本数据类型对应的包装类】


Java中的基本类型不是面向对象的,它们只是纯粹的数据,除了数值本身的信息之外,基本类型数据不带有其他信息或者可操作方法。这在实际使用中存在很多不足,为了解决这个不足,* 对每个基本类型都对应了一个引用的类型*,称为装箱基本类型。

  • 【装箱和拆箱】


1、 装箱: 所谓的装箱就是将基本的数据类型向其对应的包装类的转换。基本数据类型-->包装类。

2、拆箱:拆箱就是装箱的逆运算,包装类-->基本数据类型

 /**
 * Java中的数据类型
 */
@Test
public void javaIntTest(){
	// 声明一个Int变量
	int number = 10;
	int number2 = 10;

	/**
	 * 装箱:自动完成
	 */
	Integer i = new Integer(number);
	System.out.println("装箱自动完成: "+i);

	/**
	 * 声明Integer的第二种方式
	 */
	Integer j = 10;

	System.out.println(i==j);
	System.out.println(number==number2);
	System.out.println(i.intValue()==j.intValue());
	System.out.println(i.hashCode()+"\t"+j.hashCode());

	/**
	 * 拆箱: 包装类-->基本数据类型
	 */
	int p = i.intValue(); // 拆箱
	int p1 = i; // 自动拆箱
	System.out.println("拆箱: "+p);
	System.out.println("自动拆箱: "+p1);
}

JDK1.5 为Integer 增加了一个全新的方法:public static Integer valueOf(int i) 在自动装箱过程时,编译器调用的是static Integer valueOf(int i)这个方法 于是Integer a=3; ==> Integer a=Integer.valueOf(3);。
此方法与new Integer(i)的不同处在于: 

方法一调用类方法返回一个表示 指定的 int 值的 Integer 实例。方法二产生一个新的Integer 对象。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值