当前位置: 首页 > news >正文

30天学习Java第二天——数据类型

Java数据类型

基本数据类型

  • 整数型
    • byte
    • short
    • int
    • long 比它还大的整数用BigInteger
  • 浮点型
    • float 单精度,精度为7位小数
    • double 双精度,精度为15位小数,比它还长用BigDecimal
  • 布尔型
    • boolean
  • 字符型
    • char
      在这里插入图片描述

1. 整数类型

  • 局部变量需要先赋值在使用,但是成员变量没有赋值的话,系统会为其赋默认值。

  • Java中任何一个整数型字面量会被当做int类型处理

    long a = 100;	// = 为赋值操作,从右至左执行,因此100会先被当作in存储,然后执行到左边看到a是个long类型,再进行`自动类型转换`
    
    //如果显式注明字面量类型就不会被当作int类型了
    long b = 100L;
    float c = 100F;
    
    //小容量到大容量可以自动类型转换
    //字面量如果超出int的范围,则会报错
    long = 2147483648;	//报错
    //解决办法是显式注明
    long = 2147483648L;
    
  • 强制类型转换
    大容量转换为小容量,不能自动类型转换,需要强制转换,但是可能会损失精度
    当一个整数型字面量没有超过byte或short的取值范围时,也可以直接赋值给byte和short类型变量,不会报错(char也支持)

    //特殊语法规则
    byte a = 1;		//按规则,1被视为int类型,赋值给byte会报错,但是1没有超过byte的取值范围,因此也是被允许的
    short b = 1;	//short也是同理
    
    
    long x = 100L;
    int y = x;	//大容量转小容量,这样会报错
     //解决办法是强制类型转换
    int y = (int)x;
    
    //下面是损失精度的例子
    int k = 128;
    byte f = (byte)k; // f = -128
    原理就是先将int 128转换为补码00000000 00000000 00000000 100000000
    再转换为一字节的byte10000000
    然后转换为原码输出 10000000,这个值表示的是有符号整数-128
    
    //再来一个强转精度损失的例子
    int m = 129;
    byte n = (byte)m;  //结果 n = -127
    过程:
    int m = 129在底层存储形式为补码:00000000 00000000 00000000 10000001
    转换为一字节的byte补码为:100000001
    再转换为原码输出n:11111111,这个值表示的是有符号整数-127
    
  • 两个int类型运算后,结果还是int类型

    int a = 10;
    int b = 3;	
    int x = a/b;	//a/b 的结果是3,而不是3.33333333333
    
  • 多个数据类型混合运算时,先转换为容量最大的再运算。byte与short在进行运算时(不管是混合还是自己与自己运算),各自先转换为int再运算

  • 字面量运算在编译时就直接计算了,存在字节码文件中的是计算后的值

    int x = 10/3;	//编译过后的.class文件中,直接就是int x = 3了。
    
    //下面是一个错误例子
    byte a = 10;
    byte b = 3;
    byte x = a/b;	//会报错,因为编译时不知道 x 的值,而byte在运算时会被转换为int,编译器只知道a/b是一个int类型,但是却赋值给一个byte类型的x,因此报错
    

2. 浮点数

  • 浮点型字面量默认作为double处理
    float  x = 3.14;//这样会报错,3.14被视为double类型,无法赋值给小容量的float
    //解决办法两种
    float  x = 3.14F;	//标明类型F/f
    float  x = (float)3.14;	//强转
    
  • 浮点两种表示形式
    • 十进制
      double x = 1.23;
      double y = 0.23;
      double z = .23;
    • 科学计数法
      double a = 1.23E2; 表示1.23* 1 0 2 10^2 102=123.0
      double b = 123.1E-2; 表示123.1/ 1 0 2 10^2 102=1.231
一旦有浮点型数据参与运算得出的结果,一定不要使用==与其他数字进行相等比较。

因为任何浮点型数据在计算机底层存储的都是它的近似值

double a = 9.9;
double b = 3;
double m = a/b;
System.out.println(m); //结果为3.3000000000000003,不是我们想象中的3.3

if(m == 3.3){ //这样没有输出
	System.out.println("相等");
}
//正确的一般做法是
if(m-3.3 < 0.00000001){
	System.out.println("相等");
}

3. char类型

  • Java中,char采用Unicode编码
  • char中不允许空白,可以是空格
  • '\u0000’是char的默认值,但它不是空格,空格的unicode码是\u0020
  • 转义字符
    • \t:制表符,相当于Tab
    • \n:换行符
    • \'':双引号
    • \':单引号
    • \\:反斜线\本身
    • \u:后面是一个十六进制数字,表示这个十六进制数字对应的Unicode码

4. 字符编码

  • ‘A’: 65
  • ‘a’ :97
    ASCII编码表
  • 编码是将字符转换为二进制数据,解码是将二进制数据转换为字符。发生乱码的原因是编码与解码没有使用同一套编码字符集
  • ASCII:采用一个字节编码
  • Unicode编码:十六进制表示,占2或者4字节。
  • UTF-8:可变长度的编码,使用1-4个字节表示一个字符
  • GB2312:2个字节表示一个汉字
  • GBK:国标,内地汉字,2个字节
  • Big5(大五码):繁体中文字符集,2个字节
  • char定义方式
    • char c =‘a’;
    • char c ='\u0097';
    • char c = 97
    • Java中允许将一个整数赋值给char类型变量,这个整数会被当作ASCII码值处理
  • char运算规则:char、byte、short混合运算时,会先转换为int再做运算
    System.out.println('a' + 1); //98
    char c = 'a' + 1;	//输出字符 b(98被作为ASCII码转为b赋值给c)
    
  1. 基本数据类型转换规则
  • 除了boolean外,其他七种类型都是可以相互转换的
  • 小容量可以自动转换成大容量,称为自动类型转换,容量从小到大排序:
    byte < short < int < long < float < double < char

为什么占4字节的float要比占8字节的long表示范围还要大呢?
这是由于float的存储机制导致的,float的32位存储中,第一位是符号位,后面八位存指数,底是2;最后面的23位存的是尾数。
就是指数位导致了float的表示范围更大,这里只是一个大概解释,float的计算有一个复杂的算法
在这里插入图片描述

  • 大容量不能转换为小容量,必须强制类型转换,但是可能会损失精度
  • 整数型字面量没有超出byte、short、char的取值范围时,允许直接赋值(只能是整数型字面量,运算出来的结果不行)
  • byte、short、char混合运算时,各自先转换为int再运算
  • 多种数据类型混合运算时,各自先转换为最大容量的类型再运算

注:本文章源于学习动力节点老杜的java教程视频后的笔记整理,方便自己复习的同时,也希望能给csdn的朋友们提供一点帮助。

相关文章:

  • 代码随想录|二叉树|21合并二叉树
  • 《GitHub网路访问不稳定:解决办法》:此文为AI自动生成
  • MCU详解:嵌入式系统的“智慧之心”
  • 代码随想录-回溯
  • 通过qemu仿真树莓派系统调试IoT固件和程序
  • C++ STL 深度解析:vector 的全面指南与进阶技巧
  • 【linux指令】一文掌握 Grep 的指令的详细用法
  • 微服务全局ID方案汇总
  • 《Java对象“比武场“:Comparable与Comparator的巅峰对决》
  • 如何筛选能实现共享自助健身房“灵活性”的物联网框架?
  • 深入理解Tomcat:Java Web服务器的安装与配置
  • ClickHouse合并任务与查询延迟专项测试
  • 优化GreatSQL日志文件空间占用
  • Git 克隆问题排查与解决方案
  • 【VSCODE 插件 可视化】:SVG 编辑插件 SVG Editor
  • 浅谈Linux中的Shell及其原理
  • 多线程(超详细) (ε≡٩(๑>₃<)۶ 一心向学)
  • JS内置构造函数有哪些???
  • Spring、Spring Boot、Spring Cloud 的区别与联系
  • 人工智能时代教育行业该如何转型:迎接挑战,塑造未来教育生态
  • 马上评|家长抱婴儿值护学岗,如何避免“被自愿”?
  • 阿里上财年营收增6%,蒋凡:会积极投资,把更多淘宝用户转变成即时零售用户
  • 临港新片区将新设5亿元启航基金:专门投向在临港发展的种子期、初创型企业
  • 前四个月人民币贷款增加10.06万亿元,4月末M2余额同比增长8%
  • 江西贵溪:铜板上雕出的国潮美学
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结