今天就跟大家聊聊有关Java 数据类型及类型转换实现互相转换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
java的数据类型可以分为两大类:基本类型和复合类型。
基本类型:整型(int,short,long,byte)、浮点型(float,double)、布尔型(boolean)、和字符型(char)
复合类型:数组,类,接口
各种整型数据所占空间及数的范围
数据类型 | 所占内存空间/位 | 数的范围 |
byte | 8 | -128~127 |
short | 16 | -32768~32767 |
int | 32 | -2^31~2^31-1 |
long | 64 | -2^63~2^63-1 |
整型以补码的形式存放在内存中。
浮点类型所占的位数及数值范围
数据类型 | 所占内存空间/位 | 有效数字 | 数值范围 |
float | 32 | 7个十进制位 | 约+-3.4x10^38 |
double | 64 | 15~16个十进制位 | 约+-1.8x10^308 |
用char表示。2字节(16位)来存放一个字符,并且存放的不是ASCII码是Unicode码。
用boolean表示。只有两个取值true和false。
常量包含整型常量,浮点型常量,字符型常量,字符串常量以及布尔常量,符号常量(用final来定义 eg final int MALE = 1;)
十进制(正数,负数,0),八进制(以0开头)和十六进制(以0x或0x开头)
浮点型常量有两种表示形式。
普通的十进制数形式。由数字和小数组成。如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.3,它在内存中也是一个无限小数,即可能是1.299999,也可能是1.300001。所以尽量避免直接比较两个浮点数是否精确相等。通常的方法是比较两个两个浮点数的差值是否足够接近0。
将一个字符存放到字符变量中,实际上并不是把该字符本身存放到内存单元内,而是将该字符的Unicode码存放到内存单元中。比如字符‘A'的Unicode吗是0x0041,它会以二进制存储在内存中。
它的存储类型和short很相似,其实Java确实将字符变量作为无符号的短整型数据来处理的,这就决定了Java中的字符数据和整型数据之间可以通用。用户对可以对字符型数据进行算数运算,此时相当于将它的Unicode码看成一个整数进行运算。
Java规定一个局部变量在使用之前必须要初始化,否则无法通过编译。局部变量指的是定义在方法里的变量,它只有在方法里有效,在方法外无法使用。
转换基本规则:范围小的转为范围大的,精度小的转为精度大的。按照数据转换时是否有会损失精度,Java中的转换分为扩展转换和缩减转换。
原类型 | 目的类型 |
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。
扩展转换是系统自动进行的,又称自动类型转换,不会损失精度。
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
注意:无论扩展转换还是缩减转换,只是产生元数据的一个副本,转换结果对元数据没有影响。
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数值。
本文通过时间数值的处理来研究一下数据类型的自动转换。我们知道: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 <T> List<T> 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); //正确
看完上述内容,你们对Java 数据类型及类型转换实现互相转换有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。