JAVA 数据类型
https://zhuanlan.zhihu.com/p/91798456
基本数据类型直接存放在 Java 虚拟机栈中的局部变量表中,而包装类型属于对象类型,我们知道对象实例都存在于堆中。相比于对象类型, 基本数据类型占用的空间非常小
8位:Byte(字节型)
16位:short(短整型)、char(字符型)
32位:int(整型)、float(单精度型/浮点型)
64位:long(长整型)、double(双精度型)
最后一个:boolean(布尔类型)
java浮点型默认为double型,所以要声明一个变量为float型时,需要在数字后面加F或者f:
整数字面量默认都是int类型,所以在定义的long类型后面要加上L或l。小于32位的变量都是按照int结果去计算的。
String 转其他类型
全用 valueOf()
String s = "133"; int n = Integer.valueOf(s); System.out.println(n + 10); String p = String.valueOf(n); System.out.println(p + 23); String ss = "133.056"; double nn = Double.valueOf(ss); System.out.println(nn + 1.1); String pu = String.valueOf(nn); System.out.println(pu + "rgr");
143
13323
134.156
133.056rgr
包装类型的常量池技术
Java 基本类型的包装类的大部分都实现了常量池技术。
Byte
,Short
,Integer
,Long
这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character
创建了数值在 [0,127] 范围的缓存数据,Boolean
直接返回 True
or False
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
import java.util.*; class Main { public static void main(String[] args) { //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 List<Integer>list = new ArrayList<>(); // list.add(128); // list.add(128); // System.out.println(list.get(0)==list.get(1));// 堆中创建对象 地址不同 false // System.out.println(list.get(0).getClass()); list.add(127); list.add(127); System.out.println(list.get(0)==list.get(1));//都在常量池中 ==即可比较 System.out.println(list.get(0).getClass()); // System.out.println(list.get(0).equals(list.get(1))); } }
两种浮点数类型的包装类 Float
,Double
并没有实现常量池技术。
类型转换
自动类型转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。
public class Demo3 { public static void main(String[] args) { double num=10; System.out.println(num); } }
10.0
强制类型转换
强制类型转换是大范围的数据类型转为小范围的数据类型时进行强制类型转换,需要自己去操作,这时系统就不会帮助我们去完成这个操作了。
目标数据类型 变量名 = (目标数据类型)值或者变量;
long n =1L; 不加L默认int
int x =(int)n;
int n = Integer.MAX_VALUE; long x = n * (n - 1); System.out.println(x); System.out.println(n * (long) (n - 1));
-2147483646
4611686011984936962
获取数据类型
private static String getType(Object a) { return a.getClass().toString(); }
int num1 = 56; System.out.println(getType(num1)); double num2 = 23.06; System.out.println(getType(num2)); boolean f = true; System.out.println(getType(f)); class java.lang.Integer class java.lang.Double class java.lang.Boolean
什么是自动拆装箱?
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
原理
Integer i = 10
等价于Integer i = Integer.valueOf(10)
int n = i
等价于int n = i.intValue()
;
为什么要设计出包装类?
第一:如果你想在方法体内更新primitive类型的值,必须要使用primitive对应的object,因为前者使用的值传递,后者使用的是引用传递。
第二:java.util内操作的都是对象,如果没有PWC,会让程序员在使用这些工具类操作primitive类型时编写额外的代码。
第三:Java提供的集合框架中的数据结构,比如ArrayList和Vector,也是只能操作对象,理由跟第二点相似。
第四:多线程中也必须使用对象来完成各种同步操作。
第五:从设计理念上,在Java中,万物皆对象,为primitive类型设计出与之匹配的对象类型,更能让编程体验与设计理念融为一体!
基本数据类型 和引用数据类型区别
基本:
指向具体数值
存在 java虚拟机栈的局部变量表
值传递 不影响
占用空间小
==!=相等
引用:
指向地址
存在堆
指向同一地址 对形参修改会影响实参
equals 判断
坑点
int a = 95527; System.out.println(a * a);//535473137 错的 long b = 95527l; System.out.println(b * b);//9125407729 对的
不要随意设置
Integer.MAX_VALUE
System.out.println(Integer.MAX_VALUE + 1); -2147483648
System.out.println(Integer.MAX_VALUE); System.out.println(Integer.MIN_VALUE); 2147483647 -2147483648
int a = 2147483647l; int b = -2147483647l; System.out.println(a - b); System.out.println(b - a);
-2
2
显然是错的
long a = 2147483647l; long b = -2147483647l; System.out.println(a - b); System.out.println(b - a);
4294967294
-4294967294
对的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)