【Java数据类型】各种数据类型的相互转换总结

2023-11-18

基础数据类型包括:byte、short、int、long、float、double、char、String、boolean,在许多场合需要用到它们的相互转换。本文,将介绍几种转换方式,以及对转换方式的原理简要介绍。

法则与特性

数据类型转换必须满足如下规则:

  1. 不能对boolean类型进行类型转换。
  2. 不能把对象类型转换成不相关类的对象。

特性:

  1. 在把容量大的类型转换为容量小的类型时,必须使用强制类型转换。
  2. 转换过程中可能导致溢出或损失精度,高级向低级转换;
  3. char与int之间的不转换,参与运算的都是int

数据类型转换的方式:

  1. 级别从低到高为:byte, char, short(这三个平级)–>int–>float–>long–>double;

    注意:byte, short, char相互之间不转换,他们参与运算首先转换为int类型

  2. 自动类型转换:从低级别到高级别,系统自动转的;
  3. 强制类型转换:什么情况下使用? 把一个高级别的数赋给一个比该数的级别低的变量;

    格式:目标类型 变量名=(目标类型)(被转换的数据);

字节(byte)相关转换

byte特性:

  • byte能表示的数的范围是:[-128, +127]
  • byte[]只能用于保存范围在[-128,+127]之间的数字,常用于字节流时做缓冲数组;

你可能会问: 为毛最大值和最小值的绝对值不一样?
解答: 8位的byte,最高位是符号位;于是最大值的二进制位是0111 1111,十进制为127;最小值就是上面的二进制位取反,符号位是1,于是最小值的二进制位是1000 0000,十进制为-128;

获取byte基础信息:

System.out.println("基本类型:byte 二进制位数:" + Byte.SIZE);  
System.out.println("包装类:java.lang.Byte");  
System.out.println("最小值:Byte.MIN_VALUE=" + Byte.MIN_VALUE);  //获取Byte的最大值:127
System.out.println("最大值:Byte.MAX_VALUE=" + Byte.MAX_VALUE);  //获取Byte的最小值:-128

byte数组赋值:

// byte数组赋值
byte[] b = new byte[10]; //一个字节(byte) = 一个char
for(int i=0;i<b.length;i++) {
	b[i]=(byte)(65+i); //字节数组的赋值,赋值的范围[-127,+127]
}

byte数组的输出:

//byte数组的输出
for(int i=0;i<b.length;i++) {
	System.out.println((char)b[i]); //将ASCII码转换为字符输出;
	System.out.println(b[i]); //直接输出,则输出该byte数组元素的ASCII码;
}

byte(字节)数组、String、Char的相互转换:

char[] ch = new char[3];
ch[0]='a';
ch[1]='b';
ch[2]='c';
String str = new String(ch); //char[]转String;

//char[]转byte[]:char-->String-->byte;
byte[] bb = str.getBytes();  //String转byte[];

char[] chStr = new char[3];
for(int i=0;i<chStr.length;i++) {
	chStr[i]=(char)bb[i]; //byte[]转char[];
}

String ss = new String(chStr); //char[]转String
System.out.println(new String(ss));

byte[] bbb = new byte[3];
for(int i=0;i<bbb.length;i++) {
	bbb[i]=(byte)ch[i]; //char[]转byte[]:强制类型转换;
}

八个基础类型与String互转

八个基础数组类型与String互转都可以使用以下方法,这里使用int型为例子。
如果字符串是StringBuffer或者是StringBuilder,则先转换为String,再做转换。

int -> String:

int i=12345;
String s="";

第一种方法:s=i+"";
第二种方法:s=String.valueOf(i);

这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?
第一种方法:s=i+""; //会产生两个String对象
第二种方法:s=String.valueOf(i); //直接使用String类的静态方法,只产生一个对象

第三种方法:s=Integer.toString(i);

Integer i2 = new Integer(40);
String s = i2.toString();

String -> int:

s="12345";
int i;

第一种方法:static int parseInt(String s); 方法
第二种方法:int intValue();方法

public class Main {
	public static void main(String[] args) {
		// Integer(String s) 方法
		Integer i = new Integer("10");
		int a = i.intValue(); // 转换为int
		System.out.println(a + 10); // int型运算并输出

		// static int parseInt(String s) 方法
		int b = Integer.parseInt("20");
		System.out.println(b + 30); // int型运算并输出
	}
}

这两种方法有什么区别呢?作用是不是一样的呢?是不是在任何下都能互换呢?
第一种方法: i=Integer.parseInt(s); //直接使用静态方法,不会产生多余的对象,但会抛出异常
第二种方法: i=Integer.valueOf(s).intValue(); //Integer.valueOf(s) 相当于 new Integer(Integer.parseInt(s)),也会抛异常,但会多产生一个对象

使用拼接符示例

//使用拼接符示例
public class Main {
    public static void main(String args[]) {
    	int i = 123;
    	short sh = 456;
    	long ong = 789L;
    	
    	//直接使用拼接符:“+”
    	String s = new String();
    	s+=i;
    	s+=sh;
    	s+=ong;
    
    	System.out.println("The String: " + s); //输出:123456789
    	
    	float f = 111.134f;
    	double d = 222.3414d;
    	char ch = 'A';
    	boolean b = true;
    	String ss = new String();
    	ss += f;
    	ss += d;
    	ss +=ch;
    	ss += b;
    	
    	System.out.println("The New String: " + ss); //111.134222.3414Atrue
    }
}

使用String.valueOf

//String.valueOf示例
public class Main {
    public static void main(String args[]) {
    	int i = 123;
    	short sh = 456;
    	long ong = 789L;

    	String s = new String();
    	s = String.valueOf(i);
    	System.out.println("i: " + getType(i) + "; s: " + getType(s));
    	//输出:i: class java.lang.Integer; s: class java.lang.String

    	s = String.valueOf(sh);
    	System.out.println("sh: " + getType(sh) + "; s: " + getType(s));
    	//输出:sh: class java.lang.Short; s: class java.lang.String
    	
    	s = String.valueOf(ong);
    	System.out.println("ong: " + getType(ong) + "; s: " + getType(s));
    	//输出:ong: class java.lang.Long; s: class java.lang.String

    	//其他类型同理
    }
    public static String getType(Object o){ //获取变量类型方法
		return o.getClass().toString();
	}
}

使用toString

toString方法

public class Main {
    public static void main(String args[]) {
    	int i = 123; //short、long同理
    	
    	Integer ii = new Integer(i);
    	String s = ii.toString();
    	System.out.println("ii: " + getType(i) + "; s: " + getType(s));
    	//输出:ii: class java.lang.Integer; s: class java.lang.String

    	double d = 10.134d; //float同理
    	
    	Double dd = new Double(d); 
    	String ss = dd.toString();
    	System.out.println("dd: " + getType(dd) + "; sd: " + getType(ss));
    	//输出:ii: class java.lang.Double; s: class java.lang.String
    }
    public static String getType(Object o){ //获取变量类型方法
		return o.getClass().toString();
	}
}

使用parseXxx

//parseXxx示例
public class Main {
    public static void main(String args[]) {
    	String s = "1234";
    	int a = Integer.parseInt(s);
    	System.out.println("s:"+getType(s) + "; a:" + getType(a));
    	//输出:s:class java.lang.String; a:class java.lang.Integer

    	String ss = "56.78f";
    	float ff = Float.parseFloat(ss);
    	System.out.println("ss:"+getType(ss) + "; ff:" + ff +", " + getType(ff));
    	//输出:ss:class java.lang.String; ff:56.78, class java.lang.Float
    	
    	String sss = "89.1234d";
    	double dd = Double.parseDouble(sss);
    	System.out.println("sss:"+getType(sss) + "; dd:" + dd +", " + getType(dd));
    	//输出:sss:class java.lang.String; dd:89.1234, class java.lang.Double
    }
    public static String getType(Object o){ //获取变量类型方法
		return o.getClass().toString();
	}
}

使用xxxValue

//xxxValue示例
public class Main {
    public static void main(String args[]) {
    	String s = "1234";
    	Integer i = new Integer(s);
    	int a = i.intValue(); //转换为int
    	System.out.println("s:"+getType(s) + "; a:" + getType(a));
    	//输出:s:class java.lang.String; a:class java.lang.Integer

    	String ss = "56.78f";
    	Float f = new Float(ss);
    	float ff = f.floatValue();
    	System.out.println("ss:"+getType(ss) + "; ff:" + ff +", " + getType(ff));
    	//输出:ss:class java.lang.String; ff:56.78, class java.lang.Float
    	
    	String sss = "89.1234d";
    	Double d = new Double(sss);
    	double dd = d.doubleValue();
    	System.out.println("sss:"+getType(sss) + "; dd:" + dd +", " + getType(dd));
    	//输出:sss:class java.lang.String; dd:89.1234, class java.lang.Double
    }
    public static String getType(Object o){ //获取变量类型方法
		return o.getClass().toString();
	}
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java数据类型】各种数据类型的相互转换总结 的相关文章

  • Springboot:防止Resttemplate对%进行双重编码

    我们的代码使用Asyncresttemplate如下 String uri http api host com version test address 23 language en US format json getAysncRestT
  • 使用可执行 JAR 时指定 Log4j2 配置文件

    使用可执行 JAR 文件时 我在指定 Log4j2 配置文件位置时遇到问题 如果我将所有 JAR 分开 效果很好 但是当我尝试将它们组合成一个可执行 JAR 文件时 由于某种原因log4j2 xml未从命令行获取文件 我尝试过这两种指定位置
  • Mockito 匹配器和基元数组

    有了 Mockito 我想verify 方法调用byte 在它的参数列表中 但我没有找到如何写这个 myMethod byte 我只想要类似的东西anyByteArray 如何使用 Mockito 做到这一点 我会尝试any byte cl
  • 使用 Firebase Java API 检索/格式化数据的最佳方式

    我在用着Firebase用于数据存储Android项目 并使用Firebase Java API来处理数据 不过 我不确定我是否尽可能高效地完成此操作 并且我希望获得一些有关检索和格式化数据的最佳实践的建议 我的Firebase存储库看起来
  • log4j:ERROR 在 tomcat 7 中部署 war 时无法创建自定义 Appender

    我的 log4j xml 中有以下标签
  • 用Java截取网页的屏幕截图[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有一个免费的工具可以读取给定的网页并截取它的屏幕截图 我使用 VirtualFramebuffer 和 Firefox Binary
  • Java 密钥库 - 以编程方式从密钥库文件中选择要使用的证书

    我有一个 java 密钥库文件 其中包含多个客户端证书 我希望在 Java 应用程序中仅选择其中一个证书来连接到服务 有没有一种简单的方法可以做到这一点 到目前为止 我找到解决方案的唯一方法是使用原始密钥库文件中的客户端证书详细信息 通过其
  • 如何在Eclipse中制作war文件[重复]

    这个问题在这里已经有答案了 制作war文件的简单方法是什么 当我右键单击 在服务器上运行 时 我的项目正在运行 但我想部署在 tomcat 服务器上 我已经安装了m2clipse但这给了我一个错误 maven是否必须制作war文件 我需要特
  • 如何使用 Java2D 创建硬件加速图像?

    我正在尝试创建一个快速图像生成器 它可以执行大量 2d 转换和形状渲染 因此我尝试使用 BufferedImage 然后获取 Graphics2D 对象来执行所有绘图 我现在主要关心的是 make 速度非常快 所以我创建一个像这样的 Buf
  • 如何在Netbeans中自定义jTable标题列字体大小?

    我尝试改变jtable标题字体大小Netbeans 但还不能 无论如何 表行字体大小已成功更改 这是我使用的方法 更改后的输出 问题 标题字体大小未更改 但我也想改变这一点 所以请帮助我该怎么做 一种方法是使用UIManager并替换默认的
  • 如何在 TestNG 报告中包含 Log4j2 消息

    我希望在所有测试用例的 TestNG 报告中提供 Log4j2 日志记录信息 TestNG 使用一个名为 Reporter java 的特殊记录器类来跟踪日志输出并将其保存在其结果 XML 中 在 log4j 中 可以简单地创建一个路由到
  • javax.validation 的 @AssertTrue - 它不应该创建错误消息吗?

    我在 Spring MVC 命令 bean 中有以下代码 AssertTrue public boolean isConditionTrue return false private boolean conditionTrue 我的 JSP
  • Eclipse:对 Java 1.7 的失望(未绑定库)

    我在全新安装的 Eclipse 中处理全新项目时遇到问题 重现步骤 下载此版本的 Eclipse http www eclipse org downloads packages eclipse ide java developers hel
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • 参数列表中的“...”是什么意思? doInBackground(字符串...参数)

    我不明白那个语法 尝试用谷歌搜索各种单词加上 是没有用的 它被称为varargs http java sun com j2se 1 5 0 docs guide language varargs html 这个事实应该产生更好的谷歌结果 h
  • Guice 字段注入不起作用(返回 null)

    我在使用 Guice 时遇到空值问题 接下来我将向您展示一个类似场景的示例 我知道字段注入是一种不好的做法 但我希望它在演示中像这样工作 我有一个名为B 这是我要注入的 class B Inject public B public void
  • JNA Windows 服务启动类型

    我一直在使用 JNA 并且能够使用下面的代码返回 Windows 服务的状态 即启动或停止 但我不确定如何返回服务的启动类型 我确信 JNA 之外还有其他方法 但如果可能的话我想继续使用 JNA import com sun jna imp
  • 通过命令行参数更改默认的 ant 目标

    最近我被分配了一个任务 让ant能够为不同的环境构建war包 除了一项功能外 我几乎完成了 蚂蚁接受一个env参数类似 Denv DEV 并使用不同的配置文件来制作war包 但默认目标是start它将构建 部署并启动 tomcat 我不希望
  • CompletableFuture 的多个 thenAccept 块的执行顺序是什么

    所以我有一个返回a的方法CompletableFuture 在返回之前 此方法添加一个块thenAccept这是在之后执行的CompletableFuture完成 此方法的调用者还添加了另一个块thenAccept 显然 这可以通过多个链式
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对

随机推荐