Java数据类型

一个Java对象占用多大内存

Object 占用空间头(8+4)+padding(4)=16字节

Integer长度为:头(8+4)+ int(4) = 16字节

Long长度为:头(8+4)+long(8)+padding(4)=24字节

数组对象占用的内存是 8 + 4 + 4 = 16个字节,不包括数组内成员的内存。

ArrayList: 头部(8+4)+int(4)+int(4)+数组引用(4)=24字节

Map<String,String> map = new HashMap<>(); 
占用空间情况:48+16=64字节,当HashMap初始化的时候,他会开辟一个长度为16的table数组。
然后put进去一条数据:map.put( “100002”, “张明”); 264字节
key(String):56字节
value(String) :48字节
next :因为就只有一个元素,所以next值为null,0字节
entrySet:为空指针,0字节
keySet:空指针,0字节
values:空指针,0字节
综上分析,这个map占用48+216+0+0+0=264字节。加上keySet和entrySet:总大小为 296+16=312字节

原文链接:https://blog.csdn.net/belongtocode/article/details/103377187

char

int i = 0xffff004b;
char b = (char)i;
由于int为4个字节,char为2个字节,强行转换可能会丢失2个高位字节的数据.

JAVA数据类型中的char类型

1、JAVA中,char2字节,16位。可在存放汉字
2char赋值
char a='a'; //任意单个字符,加单引号。
char a='中';//任意单个中文字,加单引号。
char a=111;//整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
注:只能放单个字符。
3char运算
char类型是可以运算的因为char在ASCII等字符编码表中有对应的数值。
在JAVA中,对char类型字符运行时,直接当做ASCII表对应的整数来对待。

示例1char m='a'; //a
char m='a'+'b';//? char类型相加,提升为int类型(a和b分别对应的数值为97和98,相加等于195,其对应的字符为?)
int m='a'+'b'; //195  没有超出int范围,直接输出195。
char m=197; //?  输出字符编码表中对应的字符。
char m='197; //报错,因为有单引号,表示是字符,只允许放单个字符。
char m='a'+1;//b  提升为int,计算结果98对应的字符是b
char m='中'+'国'; //42282
char m='中'+'国'+'国'+'国';//报错,int转char有损失,结果已经超出char类型的范围。
int m='中'+'国'+'国'+'国';//86820
char m='中'+1;//丮  //1是int,结果提升为int,输出对应的字符。
char m='中'+"国";-->报错         //String无法转换为char。
System.out.println('中'+"国");//中国, 没有变量附值的过程。String与任何字符用“+”相连,转换为String。

示例2char a = 97; //为char类型变量 a 赋值常量值 97。
char b = 'a'+3;//d, 97+3=100,ASCII对应的字符为 d。
char c = a+3;//报错, 无法从int类型转换为char类型,接下来让我们了解下为什么会不能这样运算:
首先,我们先知道在jvm内存机制中,char类型数据运算是将字符在ASCII表对应的整数以int类型参与运算(可以认为' a '=97),常量(97)与常量(3)运算得到一个新的常量(100),常量赋值给变量(b),不存在强制转换,只要这个接受变量(b)的类型范围大于这个常量即可。而变量声明时需要定义数据类型(例:char a),内存就为这个变量划分一个char类型大小的空间,其中变量(a)的值是可变的,而常量(3)的值是不变的,两个运算得到的还是一个变量,本例中(a+3)是int类型的变量,而int类型变量(a+3)赋值给char类型变量(c)需要强制转换,因此会报错。

总结
char c=(char)(a+3); //d  char用单引号''标识,只能放单个字符。char+char,char+int的类型均提升为int,附值char变量后,输出字符编码表中对应的字符。

double

double 在计算时精度丢失的问题
https://blog.csdn.net/AD_plus/article/details/90694399

System.out.println(0.1+0.2); //0.30000000000000004

浮点数由两部分组成:指数和尾数,在这个转换的过程中,浮点数参与了计算,那么转换的过程就会变得不可预 知,并且变得不可逆。我们有理由相信,就是在这个过程中,发生了精度的丢失。

bigdecimal构造函数使用不当时,结果仍然异常
BigDecimal a = new BigDecimal(0.1);
BigDecimal b = new BigDecimal(0.2);
System.out.println(a.add(b)); //0.3000000000000000166533453693773481063544750213623046875

请写出下列的运算结果

public class Test{
    public static void main(String[] args) {
        //239.0 integer division in floating-point context
        double vol = Integer.parseInt("23980", 16) / 100;
}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值