Java程序员都要懂得知识点:原始数据类型
摘要:Java原始数据类型有short、byte、int、long、boolean、char、float、double。原始数据是未处理的或简化的数据,它构成了物理存在的数据,原始数据具有多种存在形式,例如文本数据、图像数据、音频数据或几种类型数据的混合。
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知识点问题总结之原始数据类型》,原文作者:breakDraw。
Java程序员都要懂得知识点:原始数据类型的更多相关文章
- Java程序员都要懂得知识点:反射
摘要:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- Java程序员需要学习的知识点
Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你 ...
- Java程序员都需要懂的「反射」
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 今天来简单写一下Java的反射.本来没打算写反射 ...
- Java程序员都应该去使用一下这款强大的国产工具类库
这不是标题党,今天给大家推荐一个很棒的国产工具类库:Hutool.可能有很多朋友已经知道这个类库了,甚至在已经在使用了,如果你还没有使用过,那不妨去尝试一下,我们项目组目前也在用这个.这篇文章来简单介 ...
- 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!
前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问? 一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Reg ...
- 99.9%的Java程序员都说不清的问题:JVM中的对象内存布局?
本文转载自公众号:石彬的架构笔记,阅读大约需要8分钟. 作者:李瑞杰 目前就职于阿里巴巴,资深 JVM 研究人员 在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我 ...
- 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(1)- JIT编译优化
麻烦大家帮我投一票哈,谢谢 经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java ...
- 90% 的 Java 程序员都说不上来的为何 Java 代码越执行越快(2)- TLAB预热
经常听到 Java 性能不如 C/C++ 的言论,也经常听说 Java 程序需要预热,那么其中主要原因是啥呢? 面试的时候谈到 JVM,也有很多面试官喜欢问,为啥 Java 程序越执行越快呢? 一般人 ...
- 阿里面试Java程序员都问些什么?
刚开始也是小白,也是一步步成成起来的.需要提的一点是,你将来是需要靠这个吃饭的,所以请对找工作保持十二分的热情,而且越早准备越好. 阿里一面 一面是在上午9点多接到支付宝的面试电话的,因为很期望能够尽 ...
- 看完这篇微服务架构设计思想,90%的Java程序员都收藏了
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...
随机推荐
- html考点
编程: 1.放大镜不考 2.购物不考 广告 html html必不可少的标签 <meta charset="utf-8"/> 引入css jis 外部 注释html , ...
- JVM核心知识体系(转)
1.问题 1.如何理解类文件结构布局? 2.如何应用类加载器的工作原理进行将应用辗转腾挪? 3.热部署与热替换有何区别,如何隔离类冲突? 4.JVM如何管理内存,有何内存淘汰机制? 5.JVM执行引擎 ...
- Velocity之Hello World(入门实例)
参考:http://blog.csdn.net/mengxuwq/article/details/1871161 (非常感谢这篇文章,让我初步入门) 自己调试完全能运行后,写在此,供新人参考,供自己温 ...
- 高性能队列——Disruptor(转)
https://tech.meituan.com/disruptor.html 背景 Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中 ...
- JUC并发编程学习(十一)四大函数式接口(必备)
四大函数式接口(必备) 程序员:泛型.反射.注解.枚举 新时代程序员:lambda表达式.链式编程.函数式接口.Stream流式计算 函数式接口:只有一个方法的接口 @FunctionalInterf ...
- Welcome to YARP - 4.限流 (Rate Limiting)
目录 Welcome to YARP - 1.认识YARP并搭建反向代理服务 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 ...
- 聊聊如何在Java应用中发送短信
很多业务场景里,我们都需要发送短信,比如登陆验证码.告警.营销通知.节日祝福等等. 这篇文章,我们聊聊 Java 应用中如何优雅的发送短信. 1 客户端/服务端两种模式 Java 应用中发送短信通常需 ...
- Ubuntu部署雷池Waf社区版
安装docker环境 更新软件包 sudo apt update 安装docker环境 apt-get install docker.io docker -v 安装docker compose V2版 ...
- python3使用pymsql操作mysql数据库
操作系统 :Windows 10_x64 python版本 :3.9.2 pymysql版本: 1.0.2 MySQL版本: 5.7.38 之前写过一篇关于python操作mysql数据库的文章: ...
- 文心一言 VS 讯飞星火 VS chatgpt (133)-- 算法导论11.2 5题
五.用go语言,假设将一个具有n个关键字的集合存储到一个大小为 m 的散列表中.试说明如果这些关键字均源于全域U,且|U|>nm,则U 中还有一个大小为n 的子集,其由散列到同一槽位中的所有关键 ...