java 基本类型详解 及 常见问题
鄙人不才,基础不好,趁着闲时简单学习一下,仅作学习分享,如有不正确地方还请各位看客不吝指出。
常用的基本类型有:byte(8)、short(16)、char(16,取值从0-65535[2^16-1])、int(32)、long(64)、float(32)、double(64)、boolean(true/false).
注:关于boolean的长度的问题csdn的论坛中有讨论:http://bbs.csdn.net/topics/190122943
,有兴趣可以去看一下.
这个问题和String s = "a"产生几个对象类型,很多时候和JVM相关。(我看的时候本来感觉懂了,看着看着就晕了)
具体做一下简单分类:
字符型:char
布尔型:boolean
数值型(细分为两类)
整值型:byte、short、int、long
浮点型:float、double
每个类型的长度不做详述了,可以通过(2^+-n)-1进行计算,char特别一点已指出。
对基本类型的基本操作符不做详解,但以下问题可以稍作了解:
移位操作(<<,>>,>>>)
移位操作符操作可对byte、short、char、int、long。
计算过程中byte,short,char会自动转换为int类型进行计算。因此不能把计算将结果直接赋值回原有类型。
当然可以进行强转,但不推荐。
例如:char c = (char)('a'<<17);-->char c = (char)(12713984);-->最终得到的c值为0对于的字符。
int类型操作结果为int类型。long操作结果为long。
移位操作有周期性,int周期为32(1<<32 = 1),long周期为64(1L<<64 = 1L)
溢出问题
计算过程中计算数值可能会存在超出类型最大/小值的情况。此时不会报错,但是计算结果就是错了。
此类问题可以采用更高精度类型或BigInteger、BigDecimal进行解决。
例如:
int i = Integer.MAX_VALUE;//2147483647
int x = i + i;
此时,x的值却不是4294967294 而是 -2.
还有一种情况,强制转换也会导致精度损失
例如:
int a = 1234567890;
float f = a;
int 可以向同为32位的float转换,但由于float不可能精确到9个有效位,因此精度会有损失.
关于小数位精度问题
经常会遇到 double d = 2.0-1.1;的问题,这里讲一下为什么得到的结果不是0.9?
众所周知,计算机采用二进制进行数据存储。2.0 即2表示为二进制为 10
1.1用二进制表示分为两个部分1和0.1
1 = 1
0.1的采用乘2取整法计算
0.1*2=0.2 ... 0
0.2*2=0.4 ... 0
0.4*2=0.8 ... 0
0.8*2=1.6 ... 1 ... 0.6
0.6*2=1.2 ... 1 ... 0.2
0.2*2=0.4 ... 0
0.4*2=0.8 ... 0
0.8*2=1.6 ... 1 ... 0.6
0.6*2=1.2 ... 1 ... 0.2
0.2*2=0.4 ... 0
0.4*2=0.8 ... 0
0.8*2=1.6 ... 1 ... 0.6
0.6*2=1.2 ... 1 ... 0.2
.....循环了
1.1 = 1.00011001100110011001100110011.....
但是double的长度有限制,因此部分精度会被截断。因此不能精确进行计算。
结论:需要精确计算的时候使用BigDecimal吧.
java中,float类型的变量只有7位的精度,而double类型的变量有15位的精度。
如果超出范围就会造成精度丢失,原因是十进制数的二进制表示可能不够精确,因为计算机会先把这个数字转换成2进制,
就是0101那种,超出的部分会被截取,导致出现这种数据。
关于舍入问题
这个问题一般与需求有关。
new BigDecimal(0.1234567890).setScale(4,取舍方式).doubleValue();
取舍方式提供:
BigDecimal.ROUND_HALF_UP 四舍五入
BigDecimal.ROUND_HALF_DOWN 五舍六入
BigDecimal.ROUND_HALF_EVEN 四舍六入五取偶
额,基本就这样了,如有不足请补充.
java 基本类型详解 及 常见问题的更多相关文章
- JAVA集合类型详解
一.前言 作为java面试的常客[集合类型]是永恒的话题:在开发中,主要了解具体的使用,没有太多的去关注具体的理论说明,掌握那几种常用的集合类型貌似也就够使用了:导致这一些集合类型的理论有可能经常的忘 ...
- java枚举类型详解
枚举类型是JDK1.5的新特性.显然,enum很像特殊的class,实际上enum声明定义的类型就是一个类.而这些类都是类库中Enum类的子类(java.lang.Enum<E>).它 ...
- Java字符串类型详解
Java 字符串类主要有String.StringBuffer.StringBuilder.StringTokenizer 1.字符串类型底层都是使用char数组进行实现. 2.从jdk1.7以后,S ...
- Java虚拟机详解----JVM常见问题总结
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Java 序列化Serializable详解
Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...
- Java String类详解
Java String类详解 Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类,很多时候,我们对它既熟悉又陌生. 类结构: public final ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
- Java类加载器详解
title: Java类加载器详解date: 2015-10-20 18:16:52tags: JVM--- ## JVM三种类型的类加载器- 我们首先看一下JVM预定义的三种类型类加载器,当一个 J ...
随机推荐
- [PHP学习教程 - 日期/时间]001.月份第一天&最后一天(Month First Day & Last Day)
引言:在时间处理上,对于前/后台人性化的展示当前月份最大天数,这个是网站必须要处理的一个方面.但通常这一块会由第三方类库直接包装,这里我们做一个简单的Mark. 今天,我们就为大家提供一个函数,获得指 ...
- ActiveMQ 反序列化漏洞(CVE-2015-5254)复现
1.运行漏洞环境 sudo docker-compose up -d 环境运行后,将监听61616和8161两个端口.其中61616是工作端口,消息在这个端口进行传递:8161是Web管理页面端口.访 ...
- Parrot os安装nvidia失败恢复
因为两种显卡,amd和nvidia,所以按照parrot官方文档安装驱动,结果可想而知,安装失败--- 内心万马奔腾,去国外论坛也发现很多求助的小伙伴,所以有了我这次随笔,如何恢复你的parrot 黑 ...
- docker环境下的Grafana安装
一.参考资源:https://grafana.com/docs/grafana/latest/installation/docker/ 二.过程 1.安装grafana 查看可用image [root ...
- [源码解析]为什么mapPartition比map更高效
[源码解析]为什么mapPartition比map更高效 目录 [源码解析]为什么mapPartition比map更高效 0x00 摘要 0x01 map vs mapPartition 1.1 ma ...
- 解锁网络编程之NIO的前世今生
个人博客网:https://wushaopei.github.io/ (你想要这里多有) NIO 内容概览: NIO 网络编程模型 NIO 网络编程详解 NIO 网络编程实战 NIO 网络编程缺 ...
- 这才是你需要的最基础的.Net基础面试题(通俗易懂,最基础的.Net)2
51. 委托回调静态方法和实例方法有何区别? 当一个实例方法被调用时,需要通过实例对象来访问,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能 ...
- (Java实现) 最佳调度问题
题目描述 假设有n个任务由k个可并行工作的机器完成.完成任务i需要的时间为ti.试设计一个算法找出完成这n个任务的最佳调度,使得完成全部任务的时间最早. 对任意给定的整数n和k,以及完成任务i需要的时 ...
- Java实现 LeetCode 628 三个数的最大乘积(暴力大法)
628. 三个数的最大乘积 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例 1: 输入: [1,2,3] 输出: 6 示例 2: 输入: [1,2,3,4] 输出: 24 ...
- Java实现 LeetCode 92 反转链表 II
92. 反转链表 II 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5-> ...