小白学Java之数据类型与运算符(超详细)

本文详细介绍了Java中的数据类型,包括变量的命名规则和各种类型的范围,如整形、长整型、浮点型、字符型、字节型、短整型和布尔型。此外,还深入探讨了算术、关系、逻辑、位和移位运算符的用法,以及在实际编程中需要注意的精度和类型转换问题。

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


前言

不同类型的变量就好比不同大小的蛋糕,放在内存这个冰箱里。优秀的面包师(程序员)会完美利用冰箱内的空间,并且对于特定的顾客能快速且准确地提供相应的蛋糕。而且Java 是强类型语言,说明你做好的蛋糕一旦确定了顾客,如果不强制转换订单(强制类型转换),它就只能对口那一种特定顾客。比如int类型的变量就不能看作字符串,写出 int a = 0; a = ‘abc’;这样的语句。


一、变量和类型


命名方式:小驼峰

意思是:除第一个单词,其余单词首字母大写。

示例:firstNumber、finalResult这种。


1.整形变量

int占4个字节
表示范围:
看一个有意思的:
最大数加1,成了最小数;最小数减1,成了最大数
可以想象一个圆环,最大正数和最小复数连接着


2.长整型变量

int 最大值:2147483647,这个数字对于你未来的余额,肯定是不够的,所以Java用long类型来表示更大的范围。
这个很大了吧,忘了说,long是8个字节。
还有一点,使用long类型时,要在变量值后面加 l 或者L
在这里插入图片描述否侧编译器不给通过滴


3.双精度浮点型变量

double,8个字节
在这里插入图片描述补充一下,这里发生了自动(类型)转换,由低(int)到高(double)


4.单精度浮点型变量

float,4个字节
使用float类型时,要在变量值后面加 f (F也行)
否则就会这样:

在这里插入图片描述


5.字符类型变量

char, 2个字节
注意:单引号’ '和单个字符


6.字节类型变量

byte , 1个字节
表示的范围更小了


7.短整型变量

short , 2个字节
这就是shot范围,并不常用,了解即可


8.布尔类型变量

boolean , 是占 1 个字节, 还是占 1 个比特位,没有明确规定。

boolean只有true和false之分,没有第三种可能,对于0表示假,1表示真,是绝对不可能的事!!!



二、运算符

1.算数运算符(+ - * / %)

来看实例:

public static void main(String[] args) {
        System.out.println(7 + 2);
        System.out.println(7 - 2);
        System.out.println(7 * 2);
        System.out.println(7 / 2);
        System.out.println(7 % 2);
    }

结果为:

对于加减乘和取模(求余数)的运算都不会有什么疑问,关键就是 7 / 2,结果为3,并没有保留小数显示3.5。
这就是由于上文所说的强类型所影响,这里的7和2都是int类型,所以结果自然就是int类型。
如果需要显示小数,强制类型转换即可:

System.out.println(7 / 2);
System.out.println((float)7 / 2);
System.out.println(7 / (float)2);
System.out.println((float)(7 / 2));

结果为:
显示3.5都是因为除数或者被除数都被转换成了float类型,其效果和 7 / 2.0 、7.0 / 2 一样,最后一个3.0是对整型3的强制转换。

%的特别补充

Java可以对小数进行取模运算。

System.out.println(7.5 % 2);

结果为:
也有非常神奇的地方:

System.out.println(7.6 % 2);

结果为:
这是由于:
Java中浮点数内存布局遵守 IEEE 754 标准,尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。

讲成大白话,就是2进制不能表示准确的小数,只能无限接近,进行运算必然会发生精度丢失。


2.关系运算符

主要有六种: == != < > <= >=

特别要注意的是返回值都是boolean类型

public static void main(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a == b);
        System.out.println(a != b);
        System.out.println(a < b);
        System.out.println(a > b);
        System.out.println(a <= b);
        System.out.println(a >= b);
    }

结果只有true和false之分:


3.逻辑运算符

也称短路运算符
主要有3种:&& 、 || 、 !

3.1 &&

逻辑与,2个操作数都为真,结果才为真,否则为假

int a = 10;
int b = 20;
//两个都为假
System.out.println(a == b && a > b);
//左边为假右边为真
System.out.println(a == b && a < b);
//左边为真右边为假
System.out.println(a < b && a == b);
//两个都为真
System.out.println(a != b && a < b);

结果为
直白地说就是有假即为假


3.2 ||

逻辑或,2个操作数都为假,结果才为真,否则为真

int a = 10;
int b = 20;
//两个都为假
System.out.println(a == b || a > b);
//左边为假右边为真
System.out.println(a == b || a < b);
//左边为真右边为假
System.out.println(a < b || a == b);
//两个都为真
System.out.println(a != b || a < b);

结果为

直白说就是有真即为真


3.3 !

这个最简单,真为假,假为真,就是取对立面。

3.4 短路

&& 遇到boolean为true的就结束运算,不管后面还有没有表达式。
同理,|| 遇到boolean为false的就结束运算。

int a = 10;
int b = 20;
System.out.println(a > b && a++ == 10);
System.out.println(a);

结果为

这一段代码中由于 a > b 为假,所以后面a++的运算根本不会执行。可以对比下面的代码来看:

int a = 10;
int b = 20;
System.out.println(a < b && a++ == 10);
System.out.println(a);

结果为
|| 的例子就自己动手来实践吧,不会的可以评论区讨论哦。


4.位运算符

位运算符主要有四种:& | ~ ^

特别提醒:作用对象都是二进制数字

& 按位与

有0则取0,否则为1。
为了更好理解:把0看为假,1看做真,只有都为真才是真(1)。
特别提醒:上述方法只是为了更好记忆理解,在Java中,boolean类型只有true和false。这和C语言是不同的。
看实例:
结果是:0000 1000,为8


| 按位或

有1则取1,否则为0。
理解技巧和&同理,看实例:
结果是:0001 1110,2+4+8+16=30


~ 按位取反

如果该位为 0 则转为 1, 如果该位为 1 则转为 0
看实例:b = 28,对应二进制为0001 1100,按位取反后:1110 0011,注意了!这里符号位为1,说明是负数,正数原、反、补码相同,可以不考虑。
得到的1110 0011是补码,原、反、补码的关系为:
{原码} —> [符号位不变,其他位按位取反] —> {反码} —>[+1]—> {补码}
所以逆过来,先-1,得到1110 0010。再保留符号位,其他位按位取反,1001 1101。颅内运算一下:-(1+4+8+16)=-29


^ 按位异或

两个位相异位1,相同为0。
为了更好理解:异或在于异,就是两个位相异,就按位或,取1
看实例:

short a = 5;
//0000 0101
short b = 28;
//0001 1100
System.out.println(a ^ b);

结果为
结果为:0001 1001,1+8+16=25。

^ 实战:找数字

初级版

找出数组中只出现一次的数字,其它数字都出现了两次

    public static void main(String[] args) {
        int[] arr = new int[] { 1, 1, 3, 8, 8 };
        int temp = 0;
        for (int j : arr) temp ^= j;
        System.out.println(temp);//结果为3
    }

进阶版

找出数组中只出现一次的数字(2个),其它数字都出现了两次

    public static void main(String[] args) {
        int[] arr = new int[] { 1, 1, 3, 4, 8, 8 };
        int temp = 0;
        for (int j : arr) temp ^= j;
        //get  3^4 -> 0111
        //divide into two groups
        int[] res = new int[2];
        temp &= -temp;
        for (int j : arr) {
            if ((temp & j) == 0)
                res[0] ^= j;
            else
                res[1] ^= j;
        }
        for (int re : res) {
            System.out.printf("%d ", re);
        }
    }

5.移位运算

移位运算符有三个:
1.<< 左移
2.>> 右移
3.>>> 无符号右移
作用对象依然是二进制数字

5.1 <<

最左侧位丢掉,右边补0
结果为:0011 1000;8+16+32=56
很明显,就是*2的效果


5.2 >>

最右侧位丢掉, 最左侧补符号位(正数补0, 负数补1)
在这里插入图片描述结果为:0000 1110;8+4+2=14
和上文同理,就是/2的效果


5.3 >>>

最右侧位丢掉, 最左侧补0
这里数字之所以会很大,是发生了强制类型转换(int)


6.条件运算符

条件运算符only one:
(布尔表达式1) ? (表达式2) : (表达式3)
来看例子:
通俗地说,就是a > b吗?为真就执行a,否则就执行b


总结

语言都是相同的,我相信你可以看到一些语言的影子或是再现。不过一定要弄清区别,万万不可混淆语法和应用。好记性不如烂笔头,把这些操作符的计算过程自己用电脑写写,一定会有不一样的收获。
各位,一起加油吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值