狂刷牛客的Java专题,我总结出易错的类型转换题型

it2026-04-21  3

类型转换

刷了牛客的Java专题,整理出常见易错的数据类型转换的面试题,以此希望巩固一下自己的基础知识,也希望能帮到正在学Java的朋友。

将低精度int向上转型到float,由于java的特性导致而不需要进行强制转换;如果没有这个f,就默认是double类型了由于float的精度没有double类型高,因此必须对其进行显式的格式书写。

float x=1; //正确 float y=1.0f; //正确 float z=1.0; //错误 double x = 1.0d //正确

java中如果碰到char、byte和short参与运算时,会自动将这些值转换为int类型然后再进行运算。

byte a1 = 2, a2 = 4, a3; short s = 16; a2 = s; // 报错,short类型转为byte类型出错 a3 = a1 * a2; // 报错,需要强转,结果为int

以java8为准,switch支持10种类型:

基本类型:byte,char,short,int

包装类:Byte,Short,Character,Integer,String,enum

Java实际只能支持int类型的switch语句,那其他的类型时如何支持的?

基本类型:byte char short 这些基本数字类型可自动向上转为int, 实际还是用的int。String 类型,实际switch比较的是string.hashCode值,它是一个int类型enum类型,实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型

所以也可以说 switch语句只支持int类型

当多个精度的数字同时进行运算时,最终结果以最高精度为准。在多数情况下,整数和小数的各级混合运算中,一般结果都是double类型的。

下列输出结果为:

public static void main(String[] args) { Object o1 = true ? new Integer(1) : new Double(2.0); Object o2; if (true) { o2 = new Integer(1); } else { o2 = new Double(2.0); } System.out.print(o1); System.out.print(" "); System.out.print(o2); } // 结果为:1.0 1

三元操作符类型的转换规则: 1.若两个操作数不可转换,则不做转换,返回值为Object类型 2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。 3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。

4.若两个操作数都是直接量数字,则返回值类型为范围较大者

在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度。

String a[]=new String[50]; String b[]; char c[]; String d[50]; //报错 char e[50]; //报错

包装类的equals()方法不处理数据转型

1、基本型和基本型封装型进行“”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,包装类的“”运算在不遇到算术运算的情况下不会自动拆箱因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

int a = 220; Integer b = 220; System.out.println(a==b);//true

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关。

Integer c=3; Integer h=3; Integer e=321; Integer f=321; System.out.println(c==h);//true System.out.println(e==f);//false

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

Integer a=1; Integer b=2; Integer c=3; System.out.println(c.equals(a+b));//true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

int i=1; int j = 2; Integer c=3; System.out.println(c.equals(i+j));//true

7

java中的数据类型分类: 基本数据类型(或叫做原生类、内置类型)8种: 整数:byte,short,int,long(默认是int类型) 浮点类型: float,double(默认是double类型) 字符类型:char 布尔类型:boolean 引用数据类型3种:数组,类,接口 其中,基本数据类型之间除了boolean,其他数据类型之间可以任意的相互转换(强制转化或默认转换),这个与c++中有点区别。

long → float 无须强制转换

float占4个字节为什么比long占8个字节大呢,因为底层的实现方式不同。

浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。

第1位,符号位,即S

接下来8位,指数域,即E。

剩下23位,小数域,即M,取值范围为[1 ,2 ) 或[0 , 1)

然后按照公式: V=(-1)^s * M * 2^E

也就是说浮点数在内存中的32位不是简单地转换为十进制,而是通过公式来计算而来,通过这个公式虽然,只有4个字节,但浮点数最大值要比长整型的范围要大。

非纯数字的字符串转化为Integer对象会报数字格式异常。

parseInt 是将字符串参数解析为带符号的十进制整数。 字符串中的字符都必须是十进制数字,除了第一个字符可能是ASCII减号’-’ ( ‘\u002D’ )以指示负值或ASCII加号’+’ ( ‘\u002B’ )以指示正值。 返回所得到的整数值,就像参数和小数10被赋予[parseInt(java.lang.String, int)]方法的参数一样。

下面哪些赋值语句是正确的()

long test = 012; float f = -412; int b = (int)true; double d = 0x12345; byte b = 128;

A和B中long和float,正常定义需要加l和f,但是long和float属于基本类型,会进行转化,所以 不会报出异常。AB正确

boolean类型不能和任何类型进行转换,会报出类型异常错误。所以C错。

D选项可以这样定义,D正确。

E选项中,byte的取值范围是-128—127。报出异常: cannot convert from int to byte.所以E选项错误。

这里还有个常考的知识点:

byte x = (byte)128; System.out.println(x);

输出 x= -128

原因:为什么(byte)输出-128

计算机中为了方便计算,在计算机中数据的储存形式为其补码,要将数据从计算机中打印出来,如对“10000000”求原码在打印其真值(数据本身的值)(即对补码再求补码)

11.

y是2,返回的结果是2+(z--/++x),再来看z--/++x,结果应该是3/2,但是因为x,y,z都是int型的,所以最后的返回值只能是int,这时候z--/++x的值就是1,那么最终的结果就是2+1=3 另外一个常考的点:[i++与++i](https://blog.csdn.net/weixin_44707004/article/details/107548935) 下面哪些选项返回true?

D选项:程序会把s封装成一个Long类型,由于**Square类没有重写equals()方法**,所以调用的是**Object类的equals()方法,而该方法其实就是判断两个引用是否相等**,故D也错误。

之前做过一个项目,密码返回的是char[],然后在与数据库的密码对比时,一直出错,原因是犯了如下的错误:

char[] a = {'1','2','3','4'}; System.out.println(a.toString()); //[C@233fe9b6 System.out.println(new String(a)); //1234

14.

~是取反的意思; 计算机存储的是补码,即 5的补码为:0000 0000 0000 0101 10的补码为:0000 0000 0000 1010 ~ 10对10取反:1111 1111 1111 0101 5 + ~10: 1111 1111 1111 1010 此时是计算机中存储的5 + ~10的结果,为补码,打印输出需要转为源码,结果为:1000 0000 0000 0101 (即对1111 1111 1111 1010求补码,结果为-6) 牛客解析下面有这样一个公式:-n=~n+1可推出~n=-n-1,所以~10=-11再加5结果为-6

15.

B. final修饰的后即为常量,运算结果仍为byte C. byte 类型变量运算会自动转换为 int,需要强转 D. 编译期异常

public static String toString(char c){return String.valueOf(c);} public static String valueOf(char c){ char data[] = {c}; return String(data,ture); }

返回都是字符串,只有char变成int的时候才会变成对应的assic码

public static String valueOf(int i){return Integer.toString(i)}
最新回复(0)