Java 数据类型及类型转换的互相转换实例代码

网友投稿 375 2022-11-18


Java 数据类型及类型转换的互相转换实例代码

一、基本数据类型

java的数据类型可以分为两大类:基本类型和复合类型。

基本类型:整型(int,short,long,byte)、浮点型(float,double)、布尔型(boolean)http://、和字符型(char)

复合类型:数组,类,接口

1.整型

各种整型数据所占空间及数的范围

数据类型

所占内存空间/位

数的范围

byte

8

-128~127

short

16

-32768~32767

int

32

-2^31~2^31-1

long

64

-2^63~2^63-1

整型以补码的形式存放在内存中。

2.浮点型

浮点类型所占的位数及数值范围

数据类型

所占内存空间/位

有效数字

数值范围

float

32

7个十进制位

约+-3.4x10^38

double

64

15~16个十进制位

约+-1.8x10^308

3.字符型

用char表示。2字节(16位)来存放一个字符,并且存放的不是ASCII码是Unicode码。

4.布尔型

用boolean表示。只有两个取值true和false。

二、常量

常量包含整型常量,浮点型常量,字符型常量,字符串常量以及布尔常量,符号常量(用final来定义 eg final int MALE = 1;)

1.整型常量

十进制(正数,负数,0),八进制(以0开头)和十六进制(以0x或0x开头)

2.浮点型常量

浮点型常量有两种表示形式。

普通的十进制数形式。由数字和小数组成。如0.123;123.0;0.0;.123;123.都是合法的

指数形式。1.5E5表示1.5x10^5;2.9E-7表示2.9x10^-7。注意字母E(也可以是小写e)之前必须有数字,且E后面的指数必须是整数。如E3,2E1.7均不合法。

java规定浮点数默认双精度,如果需要指定单精度,需要在末尾加上F或f.比如12.5F,2E5f。

三、变量

java用来表示变量名、常量名、方法名、类名的有效字符序列都成为用户自定义标识符,简称标识符。eg:int a = 1;a就是一个标识符。

变量包含整型变量,浮点型变量,字符变量,布尔型变量。

1.浮点型变量

浮点数的采用二进制方式存储的,二进制浮点数往往不能精确表示一个十进制小数,即使这个小数是一个有限小数,比如1.3,它在内存中也是一个无限小数,即可能是1.299999,也可能是1.300001。所以尽量避免直接比较两个浮点数是否精确相等。通常的方法是比较两个两个浮点数的差值是否足够接近0。

2.字符变量

将一个字符存放到字符变量中,实际上并不是把该字符本身存放到内存单元内,而是将该字符的Unicode码存放到内存单元中。比如字符‘A'的Unicode吗是0x0041,它会以二进制存储在内存中。

它的存储类型和short很相似,其实Java确实将字符变量作为无符号的短整型数据来处理的,这就决定了Java中的字符数据和整型数据之间可以通用。用户对可以对字符型数据进行算数运算,此时相当于将它的Unicode码看成一个整数进行运算。

Java规定一个局部变量在使用之前必须要初始化,否则无法通过编译。局部变量指的是定义在方法里的变量,它只有在方法里有效,在方法外无法使用。

四、数据类型转换

转换基本规则:范围小的转为范围大的,精度小的转为精度大的。按照数据转换时是否有会损失精度,Java中的转换分为扩展转换和缩减转换。

1.扩展转换

原类型

目的类型

byte

short,int,long,float,double

short

int,long,float,double

char

int,long,float,double

int

long,float,,double

long

float,double

float

double

eg:byte+int —— int+int;int+double —— double+double

Java规定,如果两个数据类型没出现在同一行的两列,则两个数据都必须转换成同一类型,若这个目的类型有多个可以选择,则选精度,范围最小的那个。

eg: byte+char —— int+int。

扩展转换是系统自动进行的,又称自动类型转换,不会损失精度。

2.缩减转换

Java规定凡是符合下表的转换,称为缩减转换。这种转换会损失精度,系统不会自动进行,需要程序员显示地指定。

原类型

目的类型

short

byte

char

byte,short

int

byte,short,char

long

byte,short,char,int

float

byte,short,char,int,long

double

byte,short,char,int,long,float

要将第一列的数据转换成第二列的数据类型,必须使用强制类型转化。基本格式:(数据类型)数据

eg: int a —— (byte)a

强制类型转换也可用在扩展转换中,使阅读更清晰。

eg: long+int+byte —— long+(long)int+(long)byte

注意:无论扩展转换还是缩减转换,只是产生元数据的一个副本,转换结果对元数据没有影响。

五、JAVA数据类型转换大全

1)将字符串转化为整型;

int i = Integer.parseInt(String str);

int i = Integer.valueOf(String str).intValue();

注:Integer.parseInt和 Integer.valueOf 不同,前者生成的是整型,而后者是一个对象,所以要通过intValue()来获得对象的值;

字串转成 Double, Float, Long 的方法大同小异.

2) 整型转化为字符串:

String str = String.valueOf(int i);

String str = Integer.toString(int i);

String str = “” + i ;

注: Double, Float, Long 的方法大同小异.

3) Long转化为date:

SimpleDateFormat sf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

//tieml,timef是long,前面转化过来的

Date date = new Date(timel - timef);

String time = sf.parse(date);

1、float型转换为double型:

float f1=100.00f;

Float F1=new Float(f1);

//F1.doubleValue()为Float类的返回double值型的方法

double d1=F1.doubleValue();

2、double型转换为int型:

double d1=100.00;

Double D1=new Double(d1);

int i1=D1.intValue();

3、int型转换为double型:

int i1=200;

double d1=i1;

(2). 字符串与其它数据类型的转换

4、字符串与其它类型间的转换:

⑴其它类型向字符串的转换

①调用类的串转换方法:X.toString();

②自动转换:X+“”;

③使用String的方法:String.valueOf(X);

⑵字符串作为值,向其它类型的转换

①先转换成相应的封装器实例,再调用对应的方法转换成其它类型

例如,字符中“32.1”转换double型的值的格式为:new Float(“32.1”).doubleValue()。

也可以用:Double.valueOf(“32.1”).doubleValue()

②静态parseXXX方法

String s = "1";

byte b = Byte.parseByte( s );

short t = Short.parseShort( s );

int i = Integer.parseInt( s );

long l = Long.parseLong( s );

Float f = Float.parseFloat( s );

Double d = Double.parseDouble( s );

③Character的getNumericValue(char ch)方法

返回指定的 Unicode 字符表示的 int 值。

(3). 其它实用数据类型转换

5.Date类与其它数据类型的相互转换

整型和Date类之间并不存在直接的对应关系,只是你可以使用int型为分别表示年、月、日、时、分、秒,这样就在两者之间建立了一个对应关系,在作这种转换时,你可以使用Date类构造函数的三种形式:

①Date(int year, int month, int date):以int型表示年、月、日

②Date(int year, int month, int date, int hrs, int min):以int型表示年、月、日、时、分

③Date(int year, int month, int date, int hrs, int min, int sec):以int型表示年、月、日、时、

分、秒

在长整型和Date类之间有一个很有趣的对应关系,就是将一个时间表示为距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。对于这种对应关系,Date类也有其相应的构造函数:Date(long date)。

获取Date类中的年、月、日、时、分、秒以及

星期你可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以将其理解为将Date类转换成int。

而Date类的getTime()方法可以得到我们前面所说的一个时间对应的长整型数,与包装类一样,Date类也有一个toString()方法可以将其转换为String类。

有时我们希望得到Date的特定格式,例如20020324,我们可以使用以下方法,首先在文件开始引入,

import java.text.SimpleDateFormat;

import java.util.*;

java.util.Date date = new java.util.Date();

//如果希望得到YYYYMMDD的格式

SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMDD");

String dateFormat=sdf.format(date);

//如果希望分开得到年,月,日

SimpleDateFormat sy=newSimpleDateFormat("yyyy");

SimpleDateFormat sm=new SimpleDateFormat("MM");

SimpleDateFormat sd=new SimpleDateFormat("dd");

String syear=sy.format(date);

String smon=sm.format(date);

String sday=sd.format(date);

//js中将Data转换成String类型

* 对Date的扩展,将 Date转化为指定格式的String

* 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2个占位符

* 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3位的数字)

*eg:

* (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==>2006-07-0208:09:04.423

* (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==>2009-03-10 二20:09:04

* (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==>2009-03-10 周二08:09:04

* (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss")==> 2009-03-10 星期二08:09:04

* (new Date()).pattern("yyyy-M-d h:m:s.S") ==>2006-7-2 8:9:4.

6.字符型转时间型:(2005-10-1)

reportdate_str = “2005-10-01”;

reportdate_str = reportdate_str + “ 00:00:00.0”

reportdate = java.sql.Timestamp.valueOf(reportdate_str);

7.时间型转字符型:

V_DATE = reportdate.toString();

8.将long型转化为String型

long APP_UNIT = (long)userview.getDEPT_ID();

String S_APP_UNIT = String.valeOf(APP_UNIT);

基本类型s都可以通过String.valueof(s)来转化为String型。

JAVA中常用数据类型转换函数

虽然都能在JAVA API中找到,整理一下做个备份。string->byte

Byte static byte parseByte(String s) byte->string

Byte static String toString(byte b)char->string

Character static String to String (char c)string->Short

Short static Short parseShort(String s)Short->String

Short static String toString(Short s)String->Integer

Integer static int parseInt(String s)Integer->String

Integer static String tostring(int i)String->Long

Long static long parseLong(String s)Long->String

Long static String toString(Long i)String->Float

Float static float parseFloat(String s)Float->String

Float static String toString(float f)String->Double

Double static double parseDouble(String s)Double->String

Double static String toString(Double)

数据类型

基本类型有以下四种:

int长度数据类型有:byte(8bits)、short(16bits)、int(32bits)、long(64bits)、

float长度数据类型有:单精度(32bits float)、双精度(64bits double)

boolean类型变量的取值有:ture、false

char数据类型有:unicode字符,16位

对应的类类型:Integer、Float、Boolean、Character、Double、Short、Byte、Long

转换原则

从低精度向高精度转换

byte 、short、int、long、float、double、char

注:两个char型运算时,自动转换为int型;当char与别的类型运算时,也会先自动转换为int型的,再做其它类型的自动转换

基本类型向类类型转换

正向转换:通过类包装器来new出一个新的类类型的变量

Integer a= new Integer(2);

反向转换:通过类包装器来转换

int b=a.intValue();

类类型向字符串转换

正向转换:因为每个类都是object类的子类,而所有的object类都有一个toString()函数,所以通过toString()函数来转换即可

反向转换:通过类包装器new出一个新的类类型的变量

eg1: int i=Integer.valueOf(“123”).intValue()

说明:上例是将一个字符串转化成一个Integer对象,然后再调用这个对象的intValue()方法返回其对应的int数值。

eg2: float f=Float.valueOf(“123”).floatValue()

说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。

eg3: boolean b=Boolean.valueOf(“123”).booleanValue()

说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。

eg4:double d=Double.valueOf(“123”).doubleValue()

说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。

eg5: long l=Long.valueOf(“123”).longValue()

说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。

eg6: char=Character.valueOf(“123”).charValue()

说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值。

基本类型向字符串的转换

正向转换:

如:

int a=12;

String b;b=a+””;

反向转换:

通过类包装器

eg1:int i=Integer.parseInt("123")

说明:此方法只能适用于字符串转化成整型变量

eg2: float f=Float.valueOf(“123”).floatValue()

说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。

eg3: boolean b=Boolean.valueOf(“123”).booleanValue()

说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应

的boolean数值。

eg4:double d=Double.valueOf(“123”).doubleValue()

说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。

eg5: long l=Long.valueOf(“123”).longValue()

说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。

eg6: char=Character.valueOf(“123”).charValue()

说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值。

六、java 数据类型转换的陷阱

本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道:System.currentTimeMillis();返回的是long类型的数值。当计算时间相加的时候,如果不注意数据类型的自动转换,则很容易出现问题,如下所示:

Date expiration = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365 * 5);

上面例子本意是求5年后的过期时间,而实际输出的结果却比当前时间还早的时间值。究其原因是java数值计算过程中发生的溢出。为什么会出现溢出呢?java不是存在数据类型自动转换吗?转换规则如下所示:

低————————————–>高

byte,short,char->int->long->float->double

在运算中,不同类型的数据先转化为同一类型,然后进行运算。虽然java中存在数据类型自动转换,但是需要注意的是:各运算符是有优先级的,乘法的运算优先级要高于加法,因此,java会执行完乘法运算后再执行加法运行。而执行乘法运算时,所有的操作数都是int型,因此没有触发自动类型转换,运算的结果自然是int型的,所以导致1000 * 60 * 60 * 24 * 365 * 5在计算过程中发生溢出。知道了原因就好办了,可以在乘法运算时进行一次强制类型转换:

Date expiration = new Date(System.currentTimeMillis() + 1000L * 60 * 60 * 24 * 365 * 5);

从而可以获得正确的过期时间。

java避开基本数据类型转换列表陷阱

在开发过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间进行转换,使用起来非常方便,但有时候会不小心陷入陷阱里面,看代码

public static void main(String[] args) {

int[] data = {1,2,3,4,5};

List list = Arrays.asList(data);

System.out.println(list.size());

}

答案为5 是不是?但是运行代码看看然而 结果为 1;是不是很意外?很吃惊?

别急,慢慢回答你的疑惑,先看下 Arrays.asList 的底层实现代码,

public static List asList(T... a) {

return new ArrayList<>(a);

}

通过看底层源码,我们知道这个功能是通过泛型实现的,我们也知道java8个基本数据类型是不能泛型化的,在上面的代码中 Arrays.asList 将数组当做一个整体进行处理了,

为了解决这个问题我们将 代码稍稍改下就好,将基本数据类型变为包装类型就解决了

public static void main(String[] args) {

Integer[] data = {1,2,3,4,5};

List list = Arrays.asList(data);

System.out.println(list.size());

}

下面附送两个面试陷阱题

面试陷阱1:

byte b1 = 10;

byte b2 = 20;

//错误: 不兼容的类型: 从int转换到byte可能会有损失

//否则,两个操作数都将转换为int类型。

byte b3 = b1 + b2 //错误,b1+b2是int类型,java的整数默认类型为int,b3是byte类型,二者类型不同,所以出错

byte b3 = (byte)(b1 + b2); //正确

面试陷阱2:

short s1 = 10;

s1 = s1 + 12; //错误: 不兼容的类型: 从int转换到short可能会有损失

short s2 = 10;

s2 += 12; // 等同于short s2 = (short)(s2 + (short)1); //正确


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring源码学习之bean的初始化以及循环引用
下一篇:spring boot创建和数据库关联模块详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~