Java 数据类型及类型转换的互相转换实例代码
一、基本数据类型
java的数据类型可以分为两大类:基本类型和复合类型。
基本类型:整型(int,short,long,byte)、浮点型(float,double)、布尔型(boolean)、和字符型(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来定义egfinalintMALE=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:inta=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:inta——(byte)a
强制类型转换也可用在扩展转换中,使阅读更清晰。
eg:long+int+byte——long+(long)int+(long)byte
注意:无论扩展转换还是缩减转换,只是产生元数据的一个副本,转换结果对元数据没有影响。
五、JAVA数据类型转换大全
1)将字符串转化为整型;
inti=Integer.parseInt(Stringstr);
inti=Integer.valueOf(Stringstr).intValue();
注:Integer.parseInt和Integer.valueOf不同,前者生成的是整型,而后者是一个对象,所以要通过intValue()来获得对象的值;
字串转成Double,Float,Long的方法大同小异.
2)整型转化为字符串:
Stringstr=String.valueOf(inti);
Stringstr=Integer.toString(inti);
Stringstr=“”+i;
注:Double,Float,Long的方法大同小异.
3)Long转化为date:
SimpleDateFormatsf=newSimpleDateFormat("yyyy/MM/ddHH:mm:ss");
//tieml,timef是long,前面转化过来的
Datedate=newDate(timel-timef);
Stringtime=sf.parse(date);
1、float型转换为double型:
floatf1=100.00f;
FloatF1=newFloat(f1);
//F1.doubleValue()为Float类的返回double值型的方法
doubled1=F1.doubleValue();
2、double型转换为int型:
doubled1=100.00;
DoubleD1=newDouble(d1);
inti1=D1.intValue();
3、int型转换为double型:
inti1=200;
doubled1=i1;
(2).字符串与其它数据类型的转换
4、字符串与其它类型间的转换:
⑴其它类型向字符串的转换
①调用类的串转换方法:X.toString();
②自动转换:X+“”;
③使用String的方法:String.valueOf(X);
⑵字符串作为值,向其它类型的转换
①先转换成相应的封装器实例,再调用对应的方法转换成其它类型
例如,字符中“32.1”转换double型的值的格式为:newFloat(“32.1”).doubleValue()。
也可以用:Double.valueOf(“32.1”).doubleValue()
②静态parseXXX方法
Strings="1";
byteb=Byte.parseByte(s);
shortt=Short.parseShort(s);
inti=Integer.parseInt(s);
longl=Long.parseLong(s);
Floatf=Float.parseFloat(s);
Doubled=Double.parseDouble(s);
③Character的getNumericValue(charch)方法
返回指定的Unicode字符表示的int值。
(3).其它实用数据类型转换
5.Date类与其它数据类型的相互转换
整型和Date类之间并不存在直接的对应关系,只是你可以使用int型为分别表示年、月、日、时、分、秒,这样就在两者之间建立了一个对应关系,在作这种转换时,你可以使用Date类构造函数的三种形式:
①Date(intyear,intmonth,intdate):以int型表示年、月、日
②Date(intyear,intmonth,intdate,inthrs,intmin):以int型表示年、月、日、时、分
③Date(intyear,intmonth,intdate,inthrs,intmin,intsec):以int型表示年、月、日、时、
分、秒
在长整型和Date类之间有一个很有趣的对应关系,就是将一个时间表示为距离格林尼治标准时间1970年1月1日0时0分0秒的毫秒数。对于这种对应关系,Date类也有其相应的构造函数:Date(longdate)。
获取Date类中的年、月、日、时、分、秒以及
星期你可以使用Date类的getYear()、getMonth()、getDate()、getHours()、getMinutes()、getSeconds()、getDay()方法,你也可以将其理解为将Date类转换成int。
而Date类的getTime()方法可以得到我们前面所说的一个时间对应的长整型数,与包装类一样,Date类也有一个toString()方法可以将其转换为String类。
有时我们希望得到Date的特定格式,例如20020324,我们可以使用以下方法,首先在文件开始引入,
importjava.text.SimpleDateFormat;
importjava.util.*;
java.util.Datedate=newjava.util.Date();
//如果希望得到YYYYMMDD的格式
SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMDD");
StringdateFormat=sdf.format(date);
//如果希望分开得到年,月,日
SimpleDateFormatsy=newSimpleDateFormat("yyyy");
SimpleDateFormatsm=newSimpleDateFormat("MM");
SimpleDateFormatsd=newSimpleDateFormat("dd");
Stringsyear=sy.format(date);
Stringsmon=sm.format(date);
Stringsday=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:
*(newDate()).pattern("yyyy-MM-ddhh:mm:ss.S")==>2006-07-0208:09:04.423
*(newDate()).pattern("yyyy-MM-ddEHH:mm:ss")==>2009-03-10二20:09:04
*(newDate()).pattern("yyyy-MM-ddEEhh:mm:ss")==>2009-03-10周二08:09:04
*(newDate()).pattern("yyyy-MM-ddEEEhh:mm:ss")==>2009-03-10星期二08:09:04
*(newDate()).pattern("yyyy-M-dh:m:s.S")==>2006-7-28: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型
longAPP_UNIT=(long)userview.getDEPT_ID();
StringS_APP_UNIT=String.valeOf(APP_UNIT);
基本类型s都可以通过String.valueof(s)来转化为String型。
JAVA中常用数据类型转换函数
虽然都能在JAVAAPI中找到,整理一下做个备份。string->byte
BytestaticbyteparseByte(Strings)byte->string
BytestaticStringtoString(byteb)char->string
CharacterstaticStringtoString(charc)string->Short
ShortstaticShortparseShort(Strings)Short->String
ShortstaticStringtoString(Shorts)String->Integer
IntegerstaticintparseInt(Strings)Integer->String
IntegerstaticStringtostring(inti)String->Long
LongstaticlongparseLong(Strings)Long->String
LongstaticStringtoString(Longi)String->Float
FloatstaticfloatparseFloat(Strings)Float->String
FloatstaticStringtoString(floatf)String->Double
DoublestaticdoubleparseDouble(Strings)Double->String
DoublestaticStringtoString(Double)
数据类型
基本类型有以下四种:
int长度数据类型有:byte(8bits)、short(16bits)、int(32bits)、long(64bits)、
float长度数据类型有:单精度(32bitsfloat)、双精度(64bitsdouble)
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出一个新的类类型的变量
Integera=newInteger(2);
反向转换:通过类包装器来转换
intb=a.intValue();
类类型向字符串转换
正向转换:因为每个类都是object类的子类,而所有的object类都有一个toString()函数,所以通过toString()函数来转换即可
反向转换:通过类包装器new出一个新的类类型的变量
eg1:inti=Integer.valueOf(“123”).intValue()
说明:上例是将一个字符串转化成一个Integer对象,然后再调用这个对象的intValue()方法返回其对应的int数值。
eg2:floatf=Float.valueOf(“123”).floatValue()
说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。
eg3:booleanb=Boolean.valueOf(“123”).booleanValue()
说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应的boolean数值。
eg4:doubled=Double.valueOf(“123”).doubleValue()
说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。
eg5:longl=Long.valueOf(“123”).longValue()
说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。
eg6:char=Character.valueOf(“123”).charValue()
说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值。
基本类型向字符串的转换
正向转换:
如:
inta=12;
Stringb;b=a+””;
反向转换:
通过类包装器
eg1:inti=Integer.parseInt("123")
说明:此方法只能适用于字符串转化成整型变量
eg2:floatf=Float.valueOf(“123”).floatValue()
说明:上例是将一个字符串转化成一个Float对象,然后再调用这个对象的floatValue()方法返回其对应的float数值。
eg3:booleanb=Boolean.valueOf(“123”).booleanValue()
说明:上例是将一个字符串转化成一个Boolean对象,然后再调用这个对象的booleanValue()方法返回其对应
的boolean数值。
eg4:doubled=Double.valueOf(“123”).doubleValue()
说明:上例是将一个字符串转化成一个Double对象,然后再调用这个对象的doubleValue()方法返回其对应的double数值。
eg5:longl=Long.valueOf(“123”).longValue()
说明:上例是将一个字符串转化成一个Long对象,然后再调用这个对象的longValue()方法返回其对应的long数值。
eg6:char=Character.valueOf(“123”).charValue()
说明:上例是将一个字符串转化成一个Character对象,然后再调用这个对象的charValue()方法返回其对应的char数值。
六、java数据类型转换的陷阱
本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道:System.currentTimeMillis();返回的是long类型的数值。当计算时间相加的时候,如果不注意数据类型的自动转换,则很容易出现问题,如下所示:
Dateexpiration=newDate(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在计算过程中发生溢出。知道了原因就好办了,可以在乘法运算时进行一次强制类型转换:
Dateexpiration=newDate(System.currentTimeMillis()+1000L*60*60*24*365*5);
从而可以获得正确的过期时间。
java避开基本数据类型转换列表陷阱
在开发过程中经常会使用Arrays和Collections这两个工具类在数组和列表之间进行转换,使用起来非常方便,但有时候会不小心陷入陷阱里面,看代码
publicstaticvoidmain(String[]args){ int[]data={1,2,3,4,5}; Listlist=Arrays.asList(data); System.out.println(list.size()); }
答案为5是不是?但是运行代码看看然而结果为1;是不是很意外?很吃惊?
别急,慢慢回答你的疑惑,先看下Arrays.asList的底层实现代码,
publicstaticList asList(T...a){ returnnewArrayList<>(a); }
通过看底层源码,我们知道这个功能是通过泛型实现的,我们也知道java8个基本数据类型是不能泛型化的,在上面的代码中Arrays.asList将数组当做一个整体进行处理了,
为了解决这个问题我们将代码稍稍改下就好,将基本数据类型变为包装类型就解决了
publicstaticvoidmain(String[]args){ Integer[]data={1,2,3,4,5}; Listlist=Arrays.asList(data); System.out.println(list.size()); }
下面附送两个面试陷阱题
面试陷阱1:
byteb1=10; byteb2=20; //错误:不兼容的类型:从int转换到byte可能会有损失 //否则,两个操作数都将转换为int类型。 byteb3=b1+b2//错误,b1+b2是int类型,java的整数默认类型为int,b3是byte类型,二者类型不同,所以出错 byteb3=(byte)(b1+b2);//正确
面试陷阱2:
shorts1=10; s1=s1+12;//错误:不兼容的类型:从int转换到short可能会有损失 shorts2=10; s2+=12;//等同于shorts2=(short)(s2+(short)1);//正确
到此这篇关于Java数据类型及类型转换的互相转换实例代码的文章就介绍到这了,更多相关java数据类型互相转换内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!