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\n");
	else 
        cout << "no" << endl;//printf("no\n");
}

结果为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发生了整型提升(不知道整型提升的可以在CSDN搜一下相关博客)传送门

因此在这里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
    }
}

类似的操作有几十种,每一个基本数据类型都有,由此可见Java写代码时的高效率。

其它区别

char

在Java中char为两个字节,这就意味这Java可以用UTF-8进行编译,也就是说汉字在Java中也可以作为字符啦!

public class Test {
    public static void main(String[] args) {
        char a='牛';
        System.out.println(a);//输出牛
    }
}

boolean

Java中bool和int是两种类型,而且无法相互转化!

像这样的代码就会报错,因为if语句要的是一个boolean类型

此外boolean没有确切的大小,这点了解即可 

写文不易,博主最近刚开始学习Java,关注我,后面还有更多Java好文哦!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最后一只三脚兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值