Java入门——浅谈数据类型的转换和运算符

目录

  • 一、数据类型的转换
    • 1. 前情提要
    • 2. int<=>long
    • 3.int <=>double
    • 4. int <=> byte
    • 5. int <=> char
    • 6. int <=>string
    • 7. 数据类型的默认值
  • 二、运算符
    • 1. 算术运算符
    • 2. 自增自减运算符
    • 3. 关系运算符
    • 4.逻辑运算符
    • 5. 位运算符
    • 6.移位运算符
    • 7. 条件(三目)运算符

一、数据类型的转换

1. 前情提要

只有相同数据类型之间可以相互转换。数值型之间的转化。

不互相干的两个类型不能相互转换

2. int<=>long

public class note {
    public static void main(String[] args) {
        int a = 10;
        long b = 20;//隐藏的类型提升:int->long
        a = b;//error
        b = a; //可运行
    }
}

解释:上述代码中20默认是int类型,但用long存放它,包含了隐藏的类型提升。

不类型转换:long b = 20L;

大类型转换为小类型,会导致报错,范围不一样。

public class note {
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        long b = a + 1;
        //修改后 long b = a + 1L;
        System.out.println(b);
    }
}
结果:-2147483648

原因:程序的执行都是从右向左执行。a + 1运行时已经溢出

long + int => long + long

public class note {
    //数据丢失
    public static void main(String[] args) {
        int a = Integer.MAX_VALUE;
        long b = a + 1L;
        int c = (int)b;
        System.out.println(b);
    }
}

原因:大类型强制类型转换时会造成精度丢失。b为long类型,变为int型,范围变小,精度丢失。

3.int <=>double

public class note {
    public static void main(String[] args) {
        int a = 1;
        double b = 2;
        double c = a / b;
        int d = (int) c;
        System.out.println(a/b);
        System.out.println(d);
    }
}
结果:0.5
     0

解释:两次类型提升。

  1. 2是一个整型,将int-> double
  2. a/b:大类型和小类型进行数学运算时,会将小类型自动提升为大类型,a提升为double型。double/double
  3. double型强制变为int型,造成精度丢失,小数部分没有了

4. int <=> byte

public class note {
    public static void main(String[] args) {
        byte a = 120;
        byte b = 130;//error
        int c = 120;
        byte d = c;//error
        System.out.println(a);
        System.out.println(b);
    }
}
结果:java: 不兼容的类型:int转换到byte可能会有损失

原因:对于数值型和字符型来说,小于4字节的数据类型,在存储时会转为4字节。

当byte保存的数据赋值给byte,超出byte的范围仍需强制类型转换

当把一个int变量赋值给byte时,无论是否超出保存范围,都需要强转。

public static void main(String[] args) {
        final byte a = 10;
        final byte b = 20;
        byte c = a + b;
        System.out.println(c);
    }
}
结果:30

解释:被final修饰的变量数据值不能改、类型不能提升。所以上述代码依旧是byte型

5. int <=> char

public class note {
    public static void main(String[] args) {
        char a = 'a';
        int b = a;
        int c = 97;
        char d = (char) c;
        System.out.println(b);
        System.out.println(d);
    }
}
结果:97
     'a'

原因:1. char->int自动提升,97

  1. int ->char 强转
  2. 在计算机内部,char字符会按照不同的编码规则转为int存储

6. int <=>string

public class note {
    public static void main(String[] args) {
        int num = 10;
        String str1 = String.valueOf(num);
        String str2 = "" + num;
        System.out.println(str1);
        System.out.println(str2);
        String str ="123";
        // 把str这个字符串变量转为int
        int a = Integer.parseInt(str);
        System.out.println(a);
    }
}
结果:10
     10
     123
  1. 直接使用String对象 +
  2. 使用string的valueOf方法
  3. 当字符串包含非数字,string转换为int会出错

7. 数据类型的默认值

数据类型 默认值
byte/short/int/long 0
float/double 0.0
char \u0000
boolean false
引用数据类型 null

在java中,所有数据类型都有默认值。只存在于类变量中,方法中的局部变量不存在默认值

二、运算符

1. 算术运算符

常用:+ - * / %
  1. 0不能作为除数
  2. % --求余数—可用于整数与小数
public class note {
    public static void main(String[] args) {
        double a = 11.5;
        int b = 2;
        System.out.println(a % b);
    }
}
结果:1.5

2. 自增自减运算符

a++:先取a的值后自增
++a:先自增在运算

3. 关系运算符

== != < > <= >=

关系运算符的输出结果都是布尔值

4.逻辑运算符

&&:逻辑与:两个操作数都是true返回true,有一个为false返回false
||: 逻辑或:两个操作数都为false返回false,有一个为ture返回true
上面两个为短路操作符
!:逻辑非:false返回true;true返回false

5. 位运算符

&:按位与:全1出1
|:按位或:有1出1
!:按取反:!1=0   !0=1
^:按位异或:相同为0,不同为1

题目:一组数中,只有一个数出现一次,其余的数都出现两次,如何快速找到这个数字

答:全部异或,剩下的那个数字就是出现一次的。

6.移位运算符

<< >> 
>>>:无符号右移:右侧舍弃, 左侧补 0
举例:10 << 1 => 20--------左移一位相当于 * 2
	 10 >> 1 => 5---------右移一位相当于 / 2

7. 条件(三目)运算符

表达式1 ?表达式2:表达式3

理解:表达式1为真,取表达式2的值;表达式1为假,取表达式3的值

你可能感兴趣的:(Java入门,java)