写点什么

Java 程序员都要懂得知识点:原始数据类型

发布于: 2021 年 04 月 02 日

​​摘要: Java 原始数据类型有 short、byte、int、long、boolean、char、float、double。原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式,例如文本数据、图像数据、音频数据或几种类型数据的混合。


本文分享自华为云社区《Java知识点问题总结之原始数据类型》,原文作者:breakDraw。


java 原始数据类型有 short、byte、int、long、boolean、char、float、double。原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式,例如文本数据、图像数据、音频数据或几种类型数据的混合。以为关于 Java 原始数据类型的相关知识点总结。

 

Q:java 中数据类型大小会和平台是 32 位、64 位相关吗?

A:不相关,虚拟机原因平台兼容


Q:java 中解析数据时,需要考虑处理器的大小端问题吗?(即 0x1234 的 12 是放在高地址还是低地址)

A:不需要。java 由于虚拟机的关系,屏蔽了大小端问题,需要知道的话可用 ByteOrder.nativeOrder() 查询。在操作 ByteBuffer 中,也可以使用 ByteBuffer.order() 进行设置:。


Q:java 中 short、int 、long 的字节分别是多少?

A:2、4、8


Q: float、double 是多少字节?

A:4、8


Q: java 中 byte、char 是多少字节?C++中 char 是多少字节?

A : java 中是 1 和 2, C++中 char 是 1


Q: java 中 boolean 类型的大小?

A: bool 类型无空间大小(来自 java 编程思想)


根据http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html官方文档的描述:

boolean: The boolean data type has only two possible values:true and false. Use this data type for simple flags that track true/falseconditions. This data type represents one bit of information, but its “size”isn’t something that’s precisely defined.

布尔类型:布尔数据类型只有两个可能的值:真和假。使用此数据类型为跟踪真/假条件的简单标记。这种数据类型就表示这一点信息,但是它的“大小”并不是精确定义的。


贴一下书中关于数据类型的描述:



​Q: 不可变类型有哪几种?

A: short、int、long、float、double、byte、char、boolean 的 包装类型, 以及 String,这 9 种属于不可变类型。(这只是部分,还有其他的不可变类)

不可变类型概念:里面的值的内容变了,对应的内存地址也会变化。


Q:类里的成员如果是基本数据类型, 那么会自动初始化吗?初始化成什么?

A: 会, 初始化为 0 或者 false。


Q: java 中局部变量没初始化,会报错吗?

A: 会


Q: 布尔类型可以强制转化成其他类型吗?

A : 不能。 boolean b = 1 或者 boolean b = “true” 是不可以的


Q: 什么时候不能隐式转化?

A: 如果会丢失精度,则不能隐式转化,比如 long 转 int 或者 double 转 long 这种。 编译器会强制我们使用强制转化


Q: 8 种原始数据类型的类型优先级排序是?

A:(byte/short/char)<int<long<float<double 即隐式转换都是从低往高转。


Q:下面哪个是错误的?



A:B 选项是错误的。因为 2 个 byte 类型变量相加的时候,会自动转换成 int 类型,右边的 int 类型赋值给 short 类型便会报错。(好冷的知识)


Q:


float f = 1.1;
复制代码


​有错吗?

A:float 浮点后面要加 f。加 f 就代表是 float 类型,否则就是 double 类型浮点。


float f = 1.1f;double d1 = 1.1;
复制代码


Q: 布尔类型可以做加减乘除吗?

A : 不能


Q: Integer N= 0; int n = N; 这时候会发生什么?

A: 自动拆包


Q:整型包装类型的比较,下面输出啥?


Integer num1 = 128,num2 = 128;System.out.println(num1==num2);
复制代码


​A:输出 false。值的范围在-128~127 的时候 Integer 可以直接用==比较大小,但是超出这个范围时,==就不管用了,要用 equals。大致原因是在那个范围,Integer 的对象会直接用缓存对象,所以地址都相同。不在那个范围,Integer 对象会新生成 1 个对象,所以地址不同。

另一个注意点: “==” 对于对象来说,比较的是地址。


Q: java 中哪 2 个类可以支持任意精度的整数 和任意精度的浮点数?

A: BigInteger 和 BigDecimal 这 2 个也属于不可变类。


Q: java 的数组一定需要我们手动初始化吗?

A: 不需要,数组元素会自动初始化为 null 或者 0 或者 false。

 

Q:java 支持 C++里的运算符重载吗?

A: 不支持

 

Q: if(a=b) 可以吗?

A: 不行,不能在条件表达式中放入赋值操作。除非 a 和 b 都是 boolean 类型。


Q:浮点数相等的比较方式

A:相等的话要像下面这样


if(Math.abs(a-b))<1E-6F)
复制代码


​如果用浮点的 a==b 或者 a!=b 做 while 循环退出判断,可能会导致死循环


Q:下面的数组声明哪几个是对的?

A. char[] chr1 = new char[]{‘A’,‘B’,‘C’};

B. char[] chr2 = new char[3]{‘A’,‘B’,‘C’};

C. char[][] chr3 = new char[][10];

D. char[][] chr4 = new char[10][];

E. char[] chr5 = new char[3];

A:ADE 是对的。

字符串


Q:StringBuffer 和 StringBuilder 的区别:

A:StringBuffer 是线程安全的,但是慢 StringBuilder 是线程不安全的(即可以多个线程同时读取他的内容),但是快。


Q:String s =“123”+“456”+“789”;对于这种静态的拼接,用 StringBuffer 去拼接比用 String 去拼接要快,对吗?

A:错,反编译代码后,我们发现代码是 String s = “123456789”;因为对于静态字符串的连接操作,Java 在编译时会进行彻底的优化,将多个连接操作的字符串在编译时合成一个单独的长字符串。因此要注意 StringBuffer/Builder 的适用场合: for 循环中大量拼接字符串。如果是静态的编译器就能感知到的拼接,不要盲目地去使用 StirngBuffer/Builder

PS:

  • 如果是字符串变量相加,会优化成 StringBuilder 做 append

如果是常量字符串相加, 则会直接拼接具体可以查看这篇博文,里面有展示这 2 种情况的字节码。


Q:下面输出什么结果?为什么?


String s1 = "Hello";String s2 = "Hello";String s3 = "Hel" + "lo";String s4 = "Hel" + new String("lo");String s5 = new String("Hello");String s6 = s5.intern();String s7 = "H";String s8 = "ello";String s9 = s7 + s8; System.out.println(s1 == s2);  // trueSystem.out.println(s1 == s3);  // trueSystem.out.println(s1 == s4);  // falseSystem.out.println(s4 == s5);  // falseSystem.out.println(s1 == s6);  // trueSystem.out.println(s1 == s9);  // false
复制代码


​Q:println(s1 == s2)输出 trueprintln(s1 == s3)输出 trueprintln(s1 == s4)输出 falseprintln(s4 == s5)输出 falseprintln(s1 == s6)输出 trueprintln(s1 == s9)输出 false

  • 字符串的==操作比较的是引用地址。

  • 如果是直接写死在代码里的常量字符串,则地址是固定的,都在常量池中。

  • 写死的常量字符串拼接,依旧会作为常量放入常量池中。(常量池就是指,程序编译的时候,就已经知道了这个字符串)

  • 如果是 String 类型的,则引用地址是堆中的 string 对象地址,而非常量池中地址。(因为程序编译的时候,string 里的内容不一定是确定的,因此不可能会放到常量池中)

  • 因此涉及 string 拼接的,都是和原先常量不等。s7 和 s8 已经属于 string 对象,所以二者不属于常量拼接。

  • intern 会试图把字符串放入常量池。

具体原因可见

https://www.cnblogs.com/syp172654682/p/8082625.html

可变参数


Q: 方法重载时,如何选择可变参数和固定参数?像下面输出啥:


public static void main(String[] args) {        f(1);    }     public static void f(int ...a){        System.out.println("可变参数方法:"+Arrays.toString(a));    }     public static void f(int a){        System.out.println("固定长度 参数方法:"+a);    }
复制代码


​A:输出固定长度参数方法。

原则:如果重载方法中,固定参数方法能满足,优先用固定参数方法,不满足时再去选择可变参数方法。


参考资料:


https://www.cnblogs.com/syp172654682/p/8082625.html


点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 04 月 02 日阅读数: 46
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
Java程序员都要懂得知识点:原始数据类型