JAVA中的基本数据类型和包装类

2023-11-02

8大基本数据类型

byte

byte:8位,存放的数据范围是-128~127之间,默认值为0。

short

short:16位,数据范围是-32768~32767之间,默认值为0。

int

int:32位,数据范围是-2^31 ~2^31-1,默认值为0。

long

long:64位, 数据范围为-2^63 ~2^63-1,默认值为0L。

float

float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F,默认值为0.0f。

double

double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加,默认值为0.0。

boolean

boolean:只有true和false两个取值,默认值为false。

char

char:16位,存储Unicode码,用单引号赋值,默认值为\u0000(空字符)。

类型名称 字节 最小值 最大值 默认值 举例 包装类
byte 1 -128(-2^7) 127(2^7-1) 0 byte a=10; Byte
short 2 -32768(-2^15) 32767(2^15 - 1) 0 short b=20; Short
int 4 -2,147,483,648(-2^31) 2,147,483,647(2^31 - 1) 0 int c=200; Integer
long 8 -9,223,372,036,854,775,808(-2^63) 9,223,372,036,854,775,807(2^63-1) 0L long d=10L; Long
float 4 3.4e-45 1.4e38 0.0f float e=10.0f; Float
double 8 4.9e-324 1.8e308 0.0 double f=0.0; Double
char 2 \u0000(即为0) \uffff(即为65,535 0 char c=‘a’; Character
boolean 返回true和false两个值 这种类型只作为一种标志来记录true/false 情况 只有两个取值:true 和 false false boolean flag=true; Boolean

如何选择数据类型

  • 如果要表示整数就使用int,表示小数就使用double;
  • 如果要描述日期时间的毫秒数或者表示文件的大小就用long;
  • 如果要实现内容的传递或者编码的转换使用byte;
  • 如果要实现逻辑控制,可以使用boolean;
  • 如果要使用中文,推荐使用char避免中文乱码问题;

为什么要有包装类

为了让基本类型也具有对象的特征,就出现了包装类型(例如如在使用集合类型Collection类时就一定要使用包装类型而非基本类型)因为容器都是装Object的,这是就需要这些基本类型的包装器类了。

自动装箱和自动拆箱

自动装箱:将基本数据类型自动转换为引用数据类型

int x=2;
Integer i=x;

本质是调用了Integer中的valueOf方法

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)//low=-128,high=127
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
 }

自动拆箱:将引用数据类型自动转换为基本数据类型

Integer i=2;
int x=i;

本质是调用了Integer的intvalue方法

public int intValue() {
    return value;
}

两者的区别

  • 声明方式的不同:基本类型不使用new关键字,而包装类型需要使用new关键字。
  • 存储位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中。
  • 初始值不同:基本类型的初始值如int为0,而包装类型的初始值为null;
  • 使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合时会使用到。

练习1

public class Main {
	public static void main(String[] args) {
		Integer i1 = 124;
		Integer i2 = 124; 
		Integer i3 = 234; 
		Integer i4 = 234;
		System.out.println(i1==i2);
	    System.out.println(i3==i4);
	}
}

运行结果

true
false

原因

  在通过valueOf方法创建对象时,如果数值在[-128,-127]之间则返回Integer中已经存在的对象引用,
否则创建一个新的对象。在Integer中有一个静态内部类IntegerCache,在类中定义了Integer数组cache[],
该数组存储了-128~127里的所有整数。
  上面i1和i2在范围内,所以指向的是同一个对象,而i3和i4不在范围内,新创建了一个对象,即Integer i3 = 234; 
相当于Integer i3=new Integer(234);Integer i4 = 234; 相当于Integer i4=new Integer(234);指向的是不同的对象。

练习2

public class Main {
	public static void main(String[] args) {
		Double i1 = 124.0; 
		Double i2 = 124.0; 
		Double i3 = 234.0; 
		Double i4 = 234.0;
		System.out.println(i1==i2);
		System.out.println(i3==i4);
	}
}

结果

false
false

原因

在某个范围内的整型数值的个数是有限的,而浮点数却不是。所以Double中并没有定义像Integer存储数据的数组。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA中的基本数据类型和包装类 的相关文章

  • Java - 因内存不足错误而关闭

    关于如何最好地处理这个问题 我听到了非常矛盾的事情 并且陷入了以下困境 OOME 会导致一个线程崩溃 但不会导致整个应用程序崩溃 我需要关闭整个应用程序 但不能 因为线程没有剩余内存 我一直认为最佳实践是让它们离开 这样 JVM 就会死掉
  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • 使用 WebDriver 单击新打开的选项卡中的链接

    有人可以在这种情况下帮助我吗 场景是 有一个网页 我仅在新选项卡中打开所有指定的链接 现在我尝试单击新打开的选项卡中的任何一个链接 在下面尝试过 但它仅单击主 第一个选项卡中的一个链接 而不是在新选项卡中 new Actions drive
  • Oracle Java 教程 - 回答问题时可能出现错误

    我是 Java 新手 正在阅读 Oracle 教程 每个部分之后都有问题和答案 我不明白一个答案中的一句话 见下面的粗体线 来源是https docs oracle com javase tutorial java javaOO QandE
  • Reactive Spring 不支持 HttpServletRequest 作为 REST 端点中的参数?

    我创建了一个 RestController 如下所示 RestController public class GreetingController RequestMapping value greetings method RequestM
  • tomcat 7.0.50 java websocket 实现给出 404 错误

    我正在尝试使用 Java Websocket API 1 0 JSR 356 中指定的带注释端点在 tomcat 7 0 50 上实现 websocket 以下是我如何对其进行编码的简要步骤 1 使用 ServerEndpoint注解编写w
  • 为自定义驱动程序创建 GraphicsDevice

    我正在开发一个在嵌入式系统中使用 Java 的项目 我有用于屏幕和触摸输入的驱动程序 以及用于文本输入的虚拟键盘 我的屏幕驱动程序有一个Graphics2D您可以绘制的对象和repaint Rectangle 更新方法 类似地 触摸驱动器能
  • 为什么 MOVE CURSOR 在 OS X Mountain Lion 上不显示?

    我正在做一个项目 想看看 Swing 提供的每个光标是什么样子的 public class Test public static void main String args JFrame frame new JFrame frame set
  • 为什么Iterator接口没有add方法

    In IteratorSun 添加了remove 方法来删 除集合中最后访问的元素 为什么没有add方法来向集合中添加新元素 它可能对集合或迭代器产生什么样的副作用 好的 我们开始吧 设计常见问题解答中明确给出了答案 为什么不提供 Iter
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • Java、Spring:使用 Mockito 测试 DAO 的 DataAccessException

    我正在尝试增加测试覆盖率 所以我想知道 您将如何测试 DAO 中抛出的 DataAccessExceptions 例如在一个简单的 findAll 方法中 该方法仅返回数据源中的所有数据 就我而言 我使用 Spring JdbcTempla
  • 如何停止执行的 Jar 文件

    这感觉像是一个愚蠢的问题 但我似乎无法弄清楚 当我在 Windows 上运行 jar 文件时 它不会出现在任务管理器进程中 我怎样才能终止它 我已经尝试过 TASKKILL 但它对我也不起作用 On Linux ps ef grep jav
  • Java - 从 XML 文件读取注释

    我必须从 XML 文件中提取注释 我找不到使用 JDOM 或其他东西来让它们使用的方法 目前我使用 Regex 和 FileReader 但我不认为这是正确的方法 您可以使用 JDOM 之类的东西从 XML 文件中获取注释吗 或者它仅限于元
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • Hadoop NoSuchMethodError apache.commons.cli

    我在用着hadoop 2 7 2我用 IntelliJ 做了一个 MapReduce 工作 在我的工作中 我正在使用apache commons cli 1 3 1我把库放在罐子里 当我在 Hadoop 集群上使用 MapReduceJob
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有

随机推荐