5分钟带你从数据类型了解Java相比C/C++有什么优势


数据类型是一门语言的血肉,通过这5分钟的浏览,只学过C/C++的小伙伴会初步了解Java的一些特性,学过一点Java的朋友在读完这篇文章后也一定会对Java的语法规范有更深刻的了解

Java数据类型分为两大类,一类为基本数据类型,包含了int、char等八种数据类型,另一类为引用数据类型(该类型我们暂且不讨论)

首先先让我们看看Java的八种数据类型有哪些:

可移植性

想必大家都知道C/C++的数据类型大小在不同机器、不同编译器上都会有些许的差异,例如在32位电脑上和64位电脑上long的大小就不同,这就导致同样的代码在64位上可以正常运行,但放到32位计算机上就可能会出现溢出等情况。

但Java完全不会有这种顾虑,无论是32位还是64位,所有数据类型大小都是相同的,这就大大减轻了程序员移植代码的难度。

健壮性

在学过C和C++之后再来学Java,我很明显感觉到Java是一门很“矫情”的语言

如果在程序员面前C/C++是

那在程序员面前Java就是。。

想必C/C++的小伙伴都见过这样的代码

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int i = -10;
	unsigned int ui = 10;
	
	if (ui > i) 
        cout << "yes" << endl;//printf("yes
");
	else 
        cout << "no" << endl;//printf("no
");
}

结果为no,道理应该大家都知道,这是因为在(ui>i)时,i被隐式转化为了unsigned类型,由补码反码的知识我们知道-10用unsigned表示是4294967286,道理很简单。但是在项目中你很可能因为一个走神写下了这样的错误,导致程序能正常编译,运行结果却和预料的结果大相径庭(大家应该都有花半个小时甚至一个上午找这种“小”BUG的经历吧。。)

但在Java中,无符号类型直接被砍掉了,没错这样直接根除无符号类型的BUG。。

其实我觉得在这里我很支持Java,因为unsigned存在的价值本身就不大,与signed只是一个二倍的关系。范围没大多少,但使用错误的后果却是极大的,除了上面的代码之外还有下面这种常见无符号BUG:

unsigned int ui=1;
cout<<ui-2<<endl;

最后的输出就是一个很大的数。

除此以外,Java对变量的常数赋值也做了很多限制,例如:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	char c = 888888;
	cout << c << endl;
}

在C/C++这串代码就能正常运行,C/C++编译器默认你知道数字会溢出,知道数据会被截断,因此并没有报错,最多是给你一些警告。

但在Java中这样写。。

是的,直接无法编译,因为byte最大值为127,130已经超过了byte的范围。

除此以外Java中还不允许出现把表示大范围的数赋值给小范围数的情况,如下:

等一下!有什么奇怪画面出现了!

与C/C++顺从不同,直接硬上Java是不愿意的,那么如何让Java乖乖听话呢,那当然是用一些工具胁迫他啦,嘿嘿嘿。。。

没错,就是显示类型转化!(要不然还能是什么?)

public class Test {
    public static void main(String[] args) {
        int a=1;
        byte b=(byte)a;
        System.out.println(b);
    }
}

切记!

一个数据能否赋值取决于该类型的表示范围,而不是内存大小,把short类型的数据给char(在Java中char为两个字节)也是不行的!!!因为short可以表示负数,而char不可以!

到了这里你应该已经理解了Java的健壮性是如何而来的了。

那么这里我再给大家看看一些有趣的代码(Java程序员看过来!)

public class Test {
    public static void main(String[] args) {
        byte a=1;
        byte b=2;
        byte c=a+b;
        System.out.println(c);
    }
}

答案理所应当输出3对吧!

但很可惜并不是,因为这段代码根本不能成功编译。。。

原因就在于在进行该运算时,byte发生了整型提升(不知道整型提升的可以在搜一下相关博客)

因此在这里c接收到的其实是一个int大小的数据,大范围不能给小范围变量赋值,所以报错了。

高效率

在Java中,每一个基本数据类型都有一个包装类,如下图

在包装类中封装了对该类型的一些常用操作,以int为例

public class Test {
    public static void main(String[] args) {
        int a=1;
        int b=2;
        System.out.println(Integer.MAX_VALUE);//获取整型最大值2147483647
        System.out.println(Integer.max(a,b));//a和b的max 2
        System.out.println(Integer.reverse(a));//翻转数字,输出-2147483648

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/292888.html

(0)
上一篇 2022年11月10日
下一篇 2022年11月10日

相关推荐

发表回复

登录后才能评论