基础篇:java基本数据类型
1:java几种基本数据类型大小
关键字 | 类型 | 位数 (8位一字节) | 取值范围(表示范围) |
---|---|---|---|
byte | 整型 | 8 | -2^7 ~ 2^7-1 |
short | 整型 | 16 | -2^15 ~ 2^15-1 |
int | 整型 | 32 | -2^31 ~ 2^31-1 |
long | 整型 | 64 | -2^63 ~ 2^63-1 |
float | 浮点数 | 32 | 3.402823e+38 ~ 1.401298e-45 |
double | 浮点数 | 64 | 1.797693e+308~ 4.9000000e-324 |
char | 文本型 | 16 | 0 ~ 2^16-1 |
boolean | 布尔值 | 32/8 | true/false |
boolean的占用大小是多少,有如下说法
- 1bit: boolean编译后的是使用1和0储存,理论上只需1bit即可储存
- 1byte: 计算机处理数据的最小单位是1byte,用一字节的最低位存储,其他的用0填补。如果值是true则储存二进制为0000 0001,false则是0000 0000
- 4byte or 1btye: java虚拟机没有对boolean类型的专用字节码指令,表达式所操作的boolean在编译之后是使用int数据类型来代替的,而boolean数组则会被编译成byte数组
正解 在java里的正确回答应该是boolean类型单独使用是4个byte,在数组里则是1个byte。但是虚拟机为什么不用byte或short代替boolean而是int,这样不是更节省内存空间?因为int对于32位处理器,一次处理的数据是32位,CPU寻址也是32位的查找,具有高效储存的特点(如果有更好的理解,大家共同交流下)
2:64位的JVM中,int类型长度是多少
32位;int是32位类型,不会随着系统或者jvm的位数而改变
3:char类型变量能不能储存一个中文的汉字,为什么
中文unicode编码方式每个字符占用两个字节,char是16位类型,中文储存需要两个字节,因此可以储存中文字符。
4:浮点数float和双精度浮点数double表示法
浮点数的二进制表示法由三部分组成
- 符号位
- 指数位
- 尾数为
float、double二进制结构
类型 | 符号位 | 指数位(e) | 尾数位(m) |
---|---|---|---|
float | 1 | 8 | 23 |
double | 1 | 11 | 52 |
符号位部分用来储存数字符号,区分正负数,0 正 1 负
指数位储存指数,指数也有正负,指数确定大小范围
- 指数是有符号的,但有符号整数比无符号整数计算麻烦,因此实际储存是将指数转为无符号整数,8bit的范围为0~255,真实的指数需要减去偏移量127。范围在(-126 ~ 128)
尾数位存储小数部分,确定浮点数精度,小数能表示的数越大,精度越大,数值越准确
- float的尾数位是23,2^23=8388608 ,8388608是个7位数的十进制,如果加上忽略的整数位,最多可表示8位的十进制。但是绝对能保证有效是7位左右的十进制数;double尾数位是52,252=4503599627370496,16位的数字,加上整数位253也是个16位数字,因此绝对能保证有效位精确是15位的十进制数
15.625的存储示例:
15.625 换成二进制 1111.101
将1111.101 右移三位,剩小数点前1位: 1.111101 * 2^3
底数位:因为小数点前必是1,因此只需记录小数点后的位数即可,此时底数是 1111 01 ,低位补零:111 1010 0000 0000 0000 0000
指数位:指数为3,加上127(反转时则减去127)得130,指数位二进制为1000 0010
符号位:正数 0
15.625 在内存的二进制形式表示为
符号 指数 尾数 0 1000 0010 111 1010 0000 0000 0000 0000
5:基本类型对应的包装类,区别
基本类型 | 包装类 |
---|---|
boolean | Boolean |
short | Short |
byte | Byte |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
对于万物皆对象的java,为什么会存在基本类型?因为java产生对象,一般是需在堆创建维护,再通过栈的引用来使用,但是对于简单的小的变量,需要在堆创建再使用太麻烦了
为什么会有包装类
- 包装类将基本类型包装起来,使其具有对象的性质,可以添加属性和方法,丰富基本类型的操作
- 对于泛型编程,或使用collection集合,需要包装类。因为ArrayList,HashMap的泛型无法指定基本类型
- 区别,基本类型可以直接声明使用,包装类需要在堆创建,再通过引用使用;基本类型默认初始值,int为0,boolean则是true/false,且无法赋值为null;而包装类默认初始值是null
需要注意的点:Byte、Int、Short、Long直接赋值(或使用valueOf)如Integer x = value(value 在-128 ~ 127)是直接引用常量池里的对象,此时对象比较 == 和 equals 都为true ;Character声明值则在0~127 是引用常量池对象、
6:基本类型的自动转换
自动转换规则有如下几个
布尔类型boolean不存在隐式转换为其他类型(非自动封装类型)
整数类型的自动提升
- byte -> (short/char) -> int -> long (自动提升链)
- 表示范围低的数据类型可隐式自动提升为表示范围高的数据类型(byte b = 1; short s = b; );无编译错误
- short 和 char 都是16位,但是不能隐式转换
字符型数据向整型数据的自动转换
- char是无符号类型,表示范围在(0~2^16-1),可隐式转为int或long类型
整型、字符型数据都可向浮点型的自动转换
- 因为浮点型能保存的有效数字是限制的,需要考虑转换后的有效位问题
浮点型数据的自动提升
- float转double存在精误差问题,double如果强制转float则存在精度丢失问题
7:short s1 = 1; s1 = s1 + 1;有错吗? short s1 = 1; s1 += 1;有错吗?
- s1 = s1+1 中的1默认类型是int,表达式中低范围类型s1会默认转为int来相加,得到int型的结果,最后int型的结果不能隐式转为short,编译报错
- s1 += 1; 存在隐含的强制转化 s1 += 1 -> s1 = (short) s1+ 1; 编译不会报错
8:不同的基本类型强制转换,可能会产生什么问题
- 浮点型转整型,精度丢失、数据溢出
- 取值范围大的整型转取值范围小的整型,数据溢出,高位丢失
9:float f = 3.4; 是否正确?
在java里,不加后缀修饰的浮点数默认是double类型。double类型不能隐式类型转成float,编译会报错
10:表达式3*0.1 == 0.3 将会返回什么?true还是false?
浮点型存在精度问题,3*0.1得到的double数据尾数位 和 0.3 尾数位是不一样的 ,false
11:浮点数和BigDecimal
浮点类型使用二进制存储,无论float(7),double(15),其有效位是有限制的,存在舍入误差,精度容易缺失
十进制小数转为浮点数再计算,严重存在精度问题。那么是否可以把十进制小数扩大N倍化为整数维度来计算,并保留其精度位数,这就是BigDecimal
BigDecimal是基于BigInteger来处理计算,BigInteger内部有一个int[] mag,表示存放正数的原字节数组 BigInteger原理
构造BigDecimal时避免使用浮点类型构造,会出现精度问题。尽量使用字符串来创建BigDecimal,或者使用valueOf方法
BigDecimal data= new BigDecimal(0.1);
System.out.println("data:" + data); result:
data:0.1000000000000000055511151231257827021181583404541015625BigDecimal 进行除法运算不整除时出现无限循环小数,会抛出 ArithmeticException 异常,需要指定精度
指定精度位数,同时需要指定舍入模式
12:switch语句能否作用在 byte 类型变量上,能否作用在long类型变量上,能否作用在 String 类型变量上?
switch(expr) expr 需要时int类型,而byte,char,short 会自动提升为int,因此可以作用在switch关键字。long,float,double不能自动转为int,编译会报错
String 也不能自动转为int,在1.7之前也是不能用在switch。但是1.7之后JDK支持String,通过String.hashCode返回一个int类型,并在case里再次使用String.equals比较
//语法糖反编译
switch(s.hashCode()){
default;
break;
case 3556498:
if(s.equals("test")){
.....
}
break;
}
13:能否在不进行强制转换的情况下将一个double值赋值给long类型的变量
不行,因为double取值范围大于long类型。不强制转换会编译报错。如果使用 += 操作符编译不会报错,但是存在隐含的强制转换
关注公众号,大家一起交流
参考文章
基础篇:java基本数据类型的更多相关文章
- java基础之java基本数据类型
1.Java数据类型基本概念: 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的.简单的,各种数据 ...
- java学习笔记(基础篇)--java关键字与数据类型
java关键字与数据类型 Java语言的关键字是程序代码中的特殊字符.包括: . 类和接口的声明--class, extends, implements, interface . 包引入和包声明--i ...
- 【Java基础】Java基本数据类型与位运算
1.赋值运算符 赋值使用操作符“=”.它的意思是“取右边的值(即右值),把它复制给左边(即左值)”.右值可以是任何 常数.变量或者表达式 (只要它能 生成 一个值就行).但左值必须是一个明确的,已命名 ...
- 基础篇-java开发
开局必知 1.变量 在java中,以{}为作用域,所以就存在成员变量和局部变量之说 由于java是强类型语言,所以在申明变量的时候,必须指定类型 java里,一个变量有声明过程和初始化过程(也就是赋值 ...
- java学习笔记(基础篇)—java数组
一:什么是数组,什么时候使用数组? 数组是用来保存一组数据类型相同的元素的有序集合,数组中的每个数据称为元素.有序集合可以按照顺序或者下标取数组中的元素. 在Java中,数组也是Java对象.数组中的 ...
- C++入门到理解阶段二基础篇(3)——C++数据类型
目录 1.数据类型概述 2.基本的内置类型 整型 实型(浮点型) 字符型 转义字符 字符串型 c风格的字符串 c++风格的字符串 布尔类型bool 1.数据类型概述 使用编程语言进行编程时,需要用到各 ...
- Python学习—基础篇之基本数据类型(二)
Python中重要的数据结构 1.列表 2.元组 3.字典 4.集合 列表 1.创建列表 # 方式一 name = [] print(type(name)) # 执行结果 >>> & ...
- Python学习—基础篇之基本数据类型(一)
数据类型 在python中,能够直接处理的基本数据类型主要有数字类型.字符串类型.字节类型.布尔类型.列表.元组.字典.集合等. 一.数字类型 1.1 数字类型的创建 # 数字类型 a = 10 b ...
- Lua 学习之基础篇二<Lua 数据类型以及函数库 汇总>
引言 前面讲了运算符,这里主要对Lua的数据处理相关的数据类型和函数库进行总结归纳,后面会再接着单独分开讲解具体使用. 首先因为Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值. 值可以存储 ...
- Java学习 (四)基础篇 Java基础语法
注释&标识符&关键字 注释 注释并不会被执行,其主要目的用于解释当前代码 书写注释是一个非常好的习惯,大厂要求之一 public class hello { public static ...
随机推荐
- Entity Framework 6 实体某些字段根据模型状态进行自动更新内容
1.定义基础实体对象 public class BaseEntity { public int Id { get; set; } public DateTime? CreateTime { get; ...
- 为什么网站URL需要设置为静态化
http://www.wocaoseo.com/thread-95-1-1.html 为什么网站URL需要静态化?网站url静态化的好处是什么?现在很多网站的链接都是静态规的链接,但是网站 ...
- nodejs打包成桌面程序(exe)的进阶之路
nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...
- WPF新手快速入门系列 1.布局
[概要] 该系列文章主要描述,新手如何快速上手做wpf开发.看过网上部分的教程,主要讲述的是介绍控件.这并没有问题,但是没有把自己的使用经验也完整的描述出来. 所以特此编写此系列文章希望能帮助到,因为 ...
- synchronized的实现原理——对象头解密
前言 并发编程式Java基础,同时也是Java最难的一部分,因为与底层操作系统和硬件息息相关,并且程序难以调试.本系列就从synchronized原理开始,逐步深入,领会并发编程之美. 正文 基础稍微 ...
- 用IDEA一年了,终于敢说自己会用了
作为Java老兵,我也是用了很多年的eclipse,为了与时俱进,于是切换到了IDEA.刚开始的时候感觉很不适应,感觉这玩意儿不如eclipse好用,影响工作效率,于是又换回eclipse. 但是很多 ...
- Vue事件绑定原理
Vue事件绑定原理 Vue中通过v-on或其语法糖@指令来给元素绑定事件并且提供了事件修饰符,基本流程是进行模板编译生成AST,生成render函数后并执行得到VNode,VNode生成真实DOM节点 ...
- 剑指 Offer 56 - II. 数组中数字出现的次数 II
题目描述 在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次.请找出那个只出现一次的数字. 示例1: 输入:nums = [3,4,3,3] 输出:4 示例2: 输入:nums = ...
- WebApi OAuth2身份认证
一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证). ...
- Q200510-01: 求部门工资最高的员工
问题: 求部门工资最高的员工 Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id. +----+-------+--------+----- ...