java基本类型、包装类、字符串及转换

一 java数据类型和内存分配

Java中的数据类型

  1. 基本类型(原始数据类型) byte short int long float double char boolean 。基本类型的变量持有原始值。

  2. 引用类型(符合数据类型),引用类型持有引用值(即对某个对象的引用,而非对象本身,包括对象、字符串和数组)。

Java在内存分配

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

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

  2. 栈:存放基本类型的数据和对象的引用但对象本身不存放在栈中,而是存放在堆中

  3. 堆:存放用new产生的数据

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

  5. 常量池:存放常量

  6. 非RAM存储:硬盘等永久存储空间 其中我们主要能控制的是堆,栈的存储。

数据类型和堆、栈的一些关系

  1. 函数中定义的一些基本类型的数据变量对象的引用变量都在函数的栈内存中分配。 栈的优势是存取速度比堆要快,仅次于直接位于CPU 的寄存器,而且数据可以共享。但是存在栈中的数据大小与生存周期必须是确定的。 当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

  2. 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

二 基本数据类型

有8种,boolean、byte、char、short、int、long、float、double

为什么基本类型保存在栈中? 这种类型是通过诸如 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中的基本类型不是面向对象的,它们只是纯粹的数据,除了数值本身的信息之外,基本类型数据不带有其他信息或者可操作方法。这在实际使用中存在很多不足,为了解决这个不足,对每个基本类型都对应了一个引用的类型,称为包装器类型。 这里写图片描述

四 装箱、拆箱

JDK1.5之后,基本类型和包装类之间的转换采用了自动装箱、自动拆箱来实现。在这之前,装箱和拆箱需要手动实现,以int类型为例。

手动装箱:

 int i = 8;
 Integer I = new Integer(i);

手动拆箱:

 Integer n = new Integer(8);
 int m = n.intValue();

可能小伙伴们就有疑问了,自动装箱、拆箱虽然方便,但会不会效率不高了。下面我简单说下自动装箱、拆箱的原理,想要更深、更实打实了解的可以点击这篇文章:Java中基本数据类型和包装类 我这篇文章大部分内容都是搬运的这里的。

自动装箱原理:如果不需要新的 Integer 实例,则通常应优先使用自动装箱,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能 ,有缓存直接查找缓存,无缓存的情况编译器在编译时自动添加:Integer i = new Integer(100);与手动装箱一样。

自动拆箱原理:

包装类对象自动转换成基本数据类型。如:int a = new Integer(100)这类语句会自动拆箱。自动拆箱本质是上,编译器编译时自动添加:int a = new Integer(100).intValue();

五 基本类型和字符串之间的转换

在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换。

其中,基本类型转换为字符串有三种方法:

  1. 使用包装类的 toString() 方法

  1. 使用String类的 valueOf() 方法

  1. 用一个空字符串加上基本类型,得到的就是基本类型数据对应的字符串

 // 将基本类型转换为字符串
 int c = 10;
 String str1 = Integer.toString(c);  //方法一
 String str2 = String.valueOf(c);    //方法二,底层调用Integer.toString(c)
 String str3 = c + "";               //方法三

再来看,将字符串转换成基本类型有两种方法:

  1. 调用包装类的 parseXxx 静态方法

  1. 调用包装类的 valueOf() 方法转换为基本类型的包装类,会自动拆箱

 String str = "8";
 int d = Integer.parseInt(str);  //方法一
 int e = Integer.valueOf(str);   //方法二,底层调用valueOf

PS:其他基本类型与字符串的相互转化这里不再一一列出,方法都类似。平常使用valueOf就行,要什么类型就什么类型.valueOf(x);

转自:http://www.cnblogs.com/Qian123/p/5714001.html

最后一张图,展示所有转换

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值