【Java】基本数据类型、包装类与字符串间的转换 例题

文章探讨了Java中的三元运算符,比较了Objecto1和Objecto2的结果,以及隐式和显式类型转换的区别。强调了整数和Double类型转换以及Integer类的缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

关于这道题,初见感觉有点cpu烧坏了,准确来说是看了网上的一些讲解都感觉不尽人意。自己整理了一下,希望能帮助到大家。


题目:

如下两个题目输出结果相同吗?各是什么。

Object o1 = true ? new Integer(1) : new Double(2.0);

System.out.println(o1);//1.0

Object o2;

if (true) o2 = new Integer(1);

else o2 = new Double(2.0);

System.out.println(o2);//1

分析:

首先分析o1:Object o1 = true ? new Integer(1) : new Double(2.0);

  1. 三元运算符的语法是:

    condition ? expression1 : expression2
    
    • 如果 condition 为真(即 true),则选择 expression1
    • 如果 condition 为假(即 false),则选择 expression2
  2. 在该题目中,有以下表达式:

    Object o1 = true ? new Integer(1) : new Double(2.0);

    condition 是 true,因此我们选择 expression1,即 new Integer(1)。虽然是一个整数对象,但是三元运算符的结果类型必须是操作数的共同类型。

共同类型:两个操作数的最小公共类型。

   new Integer(1) 是整数类型,new Double(2.0) 是双精度浮点数类型。整数和双精度浮点数的共同类型是 Double。因此,三元运算符的结果类型是 Double, new Integer(1) 被自动转换为 Double 类型。所以,o1 被赋值为 1.0

其次分析o2:if (true) o2 = new Integer(1); else o2 = new Double(2.0);

由于条件是 true,所以执行了 if 分支,将 o2 赋值为 new Integer(1)。因此,o2 也被赋值为 1

综上,结果是相等的。


引申:不同类型数据间的转换
  1. 隐式类型转换(自动类型转换)

    • 隐式类型转换是在编译时自动发生的,无需显式指定。
    • 它允许将一个较小范围的数据类型转换为一个较大范围的数据类型。
    • 例如,将 int 转换为 double 或将 short 转换为 int
    • 隐式类型转换不会导致数据丢失
  2. 显式类型转换(强制类型转换)

    • 显式类型转换需要使用强制转换运算符(例如 (type))来明确指定转换的目标类型。
    • 它允许将一个较大范围的数据类型转换为一个较小范围的数据类型。
    • 例如,将 double 转换为 int 或将 long 转换为 short
    • 显式类型转换可能导致数据溢出或精度丢失,因此需要谨慎使用。
  3. 基本数据类型之间的转换

    • 整型、实型和字符型被视为简单数据类型。
    • 低级到高级的自动类型转换:
      • 低级变量可以直接转换为高级变量,例如:byte b; int i = b;
      • 对于 char 类型,向高级类型(整型)转换时,会转换为对应的 ASCII 码值。
    • 高级到低级的强制类型转换:
      • 使用强制类型转换,例如:int i = 99; byte b = (byte) i;
  4. 字符串与其他数据类型的转换

    • 将其他类型转换为字符串:
      • 调用类的 toString() 方法。
      • 使用自动转换:X + ""
      • 使用 String.valueOf(X)
    • 将字符串转换为其他类型:
      • 使用静态 parseXXX 方法,例如:int i = Integer.parseInt("123");
  5. Date 类与其他数据类型的转换

    • Date 类与整型之间的对应关系:
      • 使用 Date 构造函数,例如:Date date = new Date(2023, 10, 11);
    • Date 类与长整型之间的对应关系:
      • 使用 Date 构造函数,例如:Date date = new Date(1633948800000L);
    • 获取 Date 类中的年、月、日等信息,例如:int year = date.getYear();

补充:
public class methodTest {
    public void method(){
        Integer i =new Integer(1);
        Integer j=new Integer(1);
        //通过new创建的对象是一定不相等 比较的是空间地址
        System.out.println(i==j);
        Integer m=1;
        Integer n=1;
        //Integer是int的包装类,如果不显式通过new Integer来创建
        //java则会在虚拟机中为其创建缓存,范围为-128-127
        System.out.println(m==n);
        Integer x=128;
        Integer y=128;
        System.out.println(x==y);
        //超出了范围
    }
 
写完了>w< 艾尔登法环启动!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值