本文分享自华为云社区《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/false conditions. 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 种情况的字节码。
  • https://blog.csdn.net/weixin_34405557/article/details/89630362?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

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);  // true
System.out.println(s1 == s3);  // true
System.out.println(s1 == s4);  // false
System.out.println(s4 == s5);  // false
System.out.println(s1 == s6);  // true
System.out.println(s1 == s9);  // false

Q:
println(s1 == s2)输出 true
println(s1 == s3)输出 true
println(s1 == s4)输出 false
println(s4 == s5)输出 false
println(s1 == s6)输出 true
println(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

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

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

  1. Java程序员都要懂得知识点:反射

    本文分享自华为云社区<java知识点问题精选之反射>,原文作者:breakDraw . Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象, ...

  2. Java程序员都是青春饭吗?

    Java程序员都是青春饭吗?过了35岁还能找到工作吗?会不会没人要了?随着IT行业的发展,互联网行业龙头企业中都流传一句话35岁是程序员的一个坎,过去了就没事,过不去就会被裁掉.正因为这句话大家才会认 ...

  3. 每个Java程序员都应该Follow的10个Twitter账号

    想让自己在第一时间了解Java世界正在发生什么吗? Twitter绝对是了解最新动态的优质资源.我列举了每个Java程序员都应该关注的10个twitter账号.在评论中可添加你喜欢的. 1 @java ...

  4. Java程序员都30岁了,还剩下5年“寿命”,这就是所谓的中年危机?

    Java程序员都30岁了,还剩下5年"寿命",这就是所谓的中年危机? 30岁时,我是一个程序员,离传说中的"退休"只有5年了,为了优雅从容的所谓"光荣 ...

  5. 一提到Reference 百分之九十九的java程序员都懵逼了

    原来的标题是:"一提到Reference 99.99%的java程序员都懵逼了",为啥改成汉字了呢?吐槽一下,因为CSDN出bug了,如果你用了%做标题,你的文章就别想用它的编辑器 ...

  6. 优秀的Java程序员都在看哪些书?

    目录 一.立志存高远,笃行践初心 二.经典书籍 1.Java核心技术 2.Java编程思想 3.Java语言程序设计 4.Effective Java中文版(原书第3版) 5.Java并发编程实战 6 ...

  7. 作为一名Java程序员,这些Spring知识点面试官常考

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | 丸纸 来源 | 极客时间 毋庸置疑,Spring 早已成为 Java 后端开发事实 ...

  8. 为什么很多Java程序员都转行做大数据了?

    如今大数据发展的越来越成熟.各大企业纷纷成立大数据部门.尤其BAT等一线互联网公司每天处理的数据量都是TB级别.大数据部门已成为这些企业的核心部门,数据已成为企业最核心的资产. 但是大数据人才缺口巨大 ...

  9. 无责任书评:每个Java程序员都应该深入理解Java虚拟机!

    Java这门语言的发展是很有意思的,它不像Python, Ruby 等完全是开源社区驱动,也不像C#,VB.NET主要由微软操刀.它是一个以Oracle(之前是Sun)为主,各大巨头一起参与,一起制定 ...

最新文章

  1. python copytree_python shutil.copytree 强制复制目录,源目录存在且有多个文件替代方案....
  2. SAP Fiori Launchpad 错误消息 - 400 File is not contained in a resource root
  3. 交友软件上的两种网友类型......
  4. 如何以及何时使用枚举和注释
  5. oracle 外部表 时间戳,Hive建立外部表与时间戳转换(含建dual表,修改列名,row_number() 函数等)...
  6. LeetCode 1471. 数组中的 k 个最强值(排序)
  7. ASP.NET MVC3 Action Filters详解(一)
  8. JMETER SLAVE和MASTER 分布式启动压测
  9. 【Ionic】Ionic/cmd提示 'node' 不是内部或外部命令,也不是可运行的程序
  10. 面试官:如何评估一个线程池需要设置多少个线程
  11. mysql数据库表无法显示_【MySQL8.0.18】IDEA 连接数据库无法显示数据表
  12. 堆排序HeapSort
  13. (转)使用Flexible实现手淘H5页面的终端适配
  14. java tomcat 内存溢出怎么解决_Tomcat内存溢出解决:TomcatJVM内存设置
  15. chrome浏览器完整保存整个网页 可离线访问
  16. 虚幻4引擎源码学习笔记(二):主循环LaunchEngineLoop
  17. svg练习题——抽风路径、高斯模糊、仪表盘、个性签名、loading加载
  18. Syn-QG: Syntactic and Shallow S emantic Rules for Question Generation阅读笔记
  19. 2022年文化艺术品产权交易所研究报告
  20. 贝尔曼-福特算法(Bellman-Ford)最短路径问题

热门文章

  1. 小小在线教授何为BTC跳矿(教授如何在线扩大收益)
  2. Bootstrap 分页导航
  3. Bootstrap 模态框插件Modal 的事件
  4. es6 Promise.resolve()方法
  5. pip 安装 scipy 出现错 no lapack/blas resources
  6. 远程服务器登入信息,远程登录服务器查看信息
  7. c++byte数组和文件的相互转换_经常对文件相互转换,全能转换工具,解决办公中遇到的所有难题...
  8. python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  9. body里写注释 postman_是时候扔掉 Postman 了,试试 IntelliJ IDEA 自带的高能神器!
  10. 线段树区改区查标记永久化板子