《Java架构筑基》从Java基础讲起——基本数据类型

1. 基本类型有哪些

Java定义了八种基本数据类型:byte,short,int,long,char,float,double,boolean。

  • 基本数据类型也称为简单类型,这些类型可以分为四组:

    • 整型。包括byte,short,int,long。用于表示有符号整数。
    • 浮点型。包括float,double。用于表示带小数位的数字。
    • 字符型。包括char。用于表示字符集中的符号。
    • 布尔型。包括boolean。用于表示true/false值。
  • 开发者可以直接使用这些类型,也可以使用它们来构造数组以及自定义类型。因此,它们形成了所有可以创建的其他类型的基础。Java在其他方面是完全面向对象的,但基本数据类型并不是面向对象的,这样设计的原因是为了效率。将基本数据类型设计为对象会极大地降低性能。
  • 因为Java语言的特色其中一个就是具备可移植性,即不管在哪个平台下运行,一份代码无需修改就可以直接运行。为了确保这一点,基本数据类型被定义为具有明确的范围和数学行为,与C和C++这类语言“允许整数的大小随着执行环境的要求而变化”不同,Java语言的数据类型都具有严格定义的范围。无论在那种平台下,int总是32位的。虽然严格指定基本数据类型的范围在某些环境下会造成性能损失,但这是为了实现可移植性而必须付出的。

Java的八种基本类型说明如下所示,其中每一种都有特定的格式和大小 |基本类型|说明|字节数 |:----:|:----:|:----: |byte|字节长度的整数,八位|1个字节 |short|短整数,十六位|2个字节 |int|整数,三十二位|4个字节 |long|长整数,六十四位|8个字节 |float|单精度浮点数,三十二位|4个字节 |double|双精度浮点数,六十四位|8个字节 |char|Unicode字符|2个字节 |boolean|布尔值|1个字节

2. 字面值有哪些类型

基本类型的字面值有四种子类型:整数字面值,浮点数字面值,字符字面值,布尔字面值

3. 整型数据介绍

3.1 整型数据

Java定义了四种整数类型:byte,short,int,long。所有这些类型都是有符号的、正的整数或者负的整数。Java不支持无符号(正值)的整数。博客 名称|宽度|范围 :--:|:--:|:--:| long|64|-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807 int|32|-2 147 483 648 ~ 2 147 483 647 short|16|-32 768 ~ 32767 byte|8|-128 ~ 127

当中,最常用的整数类型是int。

  • int类型经常用于控制循环变量和索引数组。对于那些不需要更大范围的int类型数值的情况,你可能会认为使用范围更小的byte和short类型效率会更高,然而事实并非如此。因为在表达式中使用byte和short值时,当对表达式求值时它们会被提升为int类型。所以,当需要使用整数时,int通常是最好的选择。

3.2 整数字面值

整数字面值可以写为十进制,十六进制(加前缀0x或0X),八进制(加前缀0),二进制(加前缀0B或0b)

//十进制
int x=10;
//十六进制数,即十进制的32
int y=0x20;
//八进制,即十进制的15
int z=017;
//二进制,即十进制的7
int u=0b0111;

整数字面值用于将值赋给byte,short,int和long类型的变量。所赋值不能超出变量的存储范围

  • 例如,以下代码在IDE中就会提示错误,因为byte的最大值为127
byte b = 250;
  • 要将一个值赋给long类型时,在数字的后面要加上后缀字母L或l。否则,如下代码中的整数值其实是被看做是int类型的
long a = 120;
  • 在以下代码中,就会产生一个错误,因为99999999999超出了int类型的存储能力。为了解决这个问题,需要在数字后加上后缀字母L或l
long a = 99999999999;

如果整数字面值太长,可读性会受到影响。

  • 从Java 7开始,可用在整数字面值中使用下划线将数字分隔开。
//十进制
int x=1_000_000;
//十六进制数,即十进制的32
int y=0x2_0;
//八进制,即十进制的15
int z=0_17;
//二进制,即十进制的7
int u=0b0_111;

4. 浮点型介绍

4.1 浮点型数据

浮点数也称为实数,当计算需要小数精度的表达式时使用。 名称|宽度|范围 :--:|:--:|:--:| float|32|1.4e-045 ~ 3.4e+038 double|64|4.9e-324 ~ 1.8e+308

float

  • float类型表示使用32位存储的单精度数值。在某些处理器上,单精度运行速度更快,并且占用的空间是双精度的一半,但是当数值非常大或者非常小时会变得不精确。如果需要小数部分,且精确度要求不高时,就可以考虑使用float类型。

double

  • double类型表示使用64位存储的双精度数值。在sin()、cos()和sqrt()这类数学函数中,返回值都是double类型。如果需要在很多次迭代运算中保持精度,或是操作非常大的数值时,double类型是最佳选择。

4.2 浮点数字面值

浮点数包含以下四个部分

  • 一个整数部分
  • 一个小数点
  • 一个小数部分
  • 一个可选的指数

例如,在1.7e8中,1是整数部分,7是小数部分,8是指数

  • 在float和double类型中,0的整数部分是可选的
  • 例如,0.5可以写成.5
  • 浮点数字面值加上的后缀字母F或f表明其为float类型,如果没有标明,该浮点数字面值将是double类型

5. 字符介绍

5.1 字符型数据

char是用于存储字符的数据类型。Java的设计初衷是允许程序员编写在世界范围内均可使用的语言,因此采用了Unicode标准来表示字符。Unicode定义了一个完全国际化的字符集,能够表示全部人类语言中的所有字符,为此需要使用十六位宽度来存储。char的范围是0 ~ 65536,没有负的char值。

对于一些语种,例如英语、德语等,可以使用八位宽度来表示这类语言的字符,使用Unicode在一定程度上会降低效率,但这是为了在全球获得可移植性而必须付出的代价。

尽管char被设计为容纳Unicod字符,但也可以用作整数类型,可以对char类型的变量执行算术运算。

5.2 字符字面值

字符字面值是一个Unicode字符,或者是单引号括起来的一个转义序列

例如

‘a‘
‘b‘
‘\b‘ 回退字符
‘\n‘ 换行
‘\r‘ 回车

6. 布尔字面值

布尔类型有两个值,分别为true和false。

例如,声明一个布尔变量bool

boolean bool=true;

7. 基本类型转换

在涉及处理不同数据类型时,常常需要将一个变量的值赋给另一个变量,这就需要进行类型转换

默认转换

  • byte,short,char—int—long—float—double
  • byte,short,char相互之间补转换,他们参与运算首先转换为int类型

强制转换

  • 格式: 目标类型 变量名 = (目标类型)值或变量名
  • int a = (int) 15.7f;

注意要点

!!!!!!!注意!!!!!!!!
1:在java中,任何一个整数默认为 int 类型 (1)
2:在java种,任何一个小数,默认为 double 类型( 1.0)
3:123L 或者 1231 编译器会将该数当成long类型
4:12.345f 或者12.345F 编译器会将该数当成float类型

7.1 加宽转换

当从一种基本类型转换向另一种基本类型时,如果后者的大小和前者相同或者更大,就叫做加宽转换

  • 例如,将int(32位)转为long(64位)。此时不会有信息丢失的风险,且加宽转换是隐式发生的,不需要在代码中任何事情
  • 例如
int a=10;
long b=a;

7.2 收窄转换

收窄转换发生在从一种基本类型转换为另一种更小类型的转换中

  • 例如,从long(64位)到int(32位)。收窄转换需要显示调用,用圆括号指定目标类型
long a=10;
int b=(int)a;
  • 如果被转换的值比目标类型的容量还要大的话,收窄转换将导致信息丢失
  • 例如,9876543210对int类型来说太大了
long a=9876543210L;
int b=(int)a;
//输出值是1286608618
System.out.println(b);

8. 表达式中的自动类型提升

除了赋值外,在表达式中也可能会发生类型转换。在表达式中,中间值要求的精度有时会超出操作数的范围。博客

例如:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

中间部分 a b 很容易超出byte操作数的范围。为了解决这类问题,当对表达式求值时,Java会自动将每个byte,short或char操作数提升为int类型。这意味着使用int类型而不是byte类型执行子表达式a b。因此,即时a和b都被指定为byte类型,中间表达式(50 * 40)的结果2000是合法的。

自动类型提升很有用,但有时候会导致难以理解的编译时错误。例如:

byte b=10;
//错误
b= b*2;

如上代码试图将 10 * 2 的结果(一个完全有效的byte值)保存到byte变量中,但是编译器却提示错误。当计算表达式的值时,操作数被自动提升为int类型,所以结果也被提升为int类型。因此,现在是试图将一个int类型值转为byte变量,如果不使用强制类型转换,就不能将结果赋给byte变量。

Java定义了几个应用于表达式的类型提升规则

  • 对于一元操作符来说,如果操作数的类型是byte,short或char,运算结果提升为int类型
  • 对与二元操作符来说,提升规则是从以下几条依次选择一条执行
  • 如果操作数类型均为byte、short或char,那么两个数均转为int类型,结果数也将为int类型
  • 如果操作数包含double类型,那么另一个操作数也转为double,结果数也将为double类型
  • 如果操作数包含float类型,那么另一个操作数也转为float,结果数也将为float类型
  • 如果操作数包含long类型,那么另一个操作数也转为long,结果数也将为long类型

原文地址:https://blog.51cto.com/14637764/2457560

时间: 2024-10-10 10:49:05

《Java架构筑基》从Java基础讲起——基本数据类型的相关文章

《Java架构筑基》从Java基础讲起——深入理解Static

1. static的作用和特点 可以用来修饰:成员变量,成员方法,代码块,内部类等.具体如下所示 修饰成员变量和成员方法 被 static 修饰的成员属于类,不属于单个这个类的某个对象,被类中所有对象共享,可以并且建议通过类名调用. 被static 声明的成员变量属于静态成员变量,静态变量存放在Java内存区域的方法区. 静态代码块 静态代码块定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块->非静态代码块->构造方法) 该类不管创建多少对象,静态代码块只执行一次. 静态内部类(

《Java架构筑基》从Java基础讲起——泛型基础

一.泛型的概述 1.1 泛型由来 我们的集合可以存储多种数据类型的元素,那么在存储的时候没有任何问题,但是在获取元素,并向下转型的时候,可能会存在一个错误,而这个错误就是ClassCastException . 很显然,集合的这种可以存储多种数据类型的元素的这个特点,不怎么友好 , 程序存在一些安全隐患,那么为了出来这种安全隐患,我们应该限定一个集合存储元素的数据类型,我们只让他存储统一中数据类型的元素,那么在做向下转型的是就不会存在这种安全隐患了. 怎么限定集合只能给我存储同一种数据类型的元素

《Java架构筑基》从Java基础讲起——深入理解Finial

一.final关键字概述 1. 为什么会有final 由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final 2. final概述 final关键字是最终的意思,可以修饰类,变量,成员方法. 3. final修饰特点 修饰类: 被修饰类不能被继承 修饰方法: 被修饰的方法不能被重写 修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量 4. final关键字修饰局部变量 基本类型,是值不能被改变 引用类型,是

《Java架构筑基》从Java基础讲起——泛型的使用

一. 泛型的使用 1. 泛型类的概述及使用 A:泛型类概述: 把泛型定义在类上 B:定义格式: public class 类名<泛型类型1,-> C:注意事项: 泛型类型必须是引用类型 2. 泛型方法的概述和使用 A:泛型方法概述: 把泛型定义在方法上 B:定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名) public <T> void show(T t) { } 所谓泛型方法,就是在声明方法时定义一个或多个类型形参. 泛型方法的用法格式如下

《Java架构筑基》从Java基础讲起——String类深入理解

一. String问题答疑 String字符串是如何设计与实现考量的? String字符串缓存 intern()方法,由永久代移到堆中. String 的演化,Java 9 中底层把 char 数组换成了 byte 数组,占用更少的空间 二. String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池.其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对

《Java架构筑基》从Java基础讲起——关键字汇总

1. 常见的关键字 如果还有没有写上的,麻烦小伙伴告知一声-- 用于定义数据类型的关键字 class interface byte short int long float double char boolean void 用于定义数据类型值的关键字 true false null 用于定义流程控制的关键字 if else switch case default while do for break continue return 用于定义访问权限修饰符的关键字 private protecte

《Java架构筑基》从Java基础讲起——基础类型缓存池概念

以Integer为例 new Integer(123) 与 Integer.valueOf(123) 的区别在于: new Integer(123) 每次都会新建一个对象: Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用. Integer x = new Integer(123); Integer y = new Integer(123); System.out.println(x == y); // false Integer z = Integ

《Java架构筑基》从Java基础讲起——Int和Integer深入分析

1.关于int和Integer的问题区别分析 编译阶段.运行时,自动装箱 / 自动拆箱是发生在什么阶段? 使用静态工厂方法 valueOf 会使用到缓存机制,那么自动装箱的时候,缓存机制起作用吗? 为什么我们需要原始数据类型,Java 的对象似乎也很高效,应用中具体会产生哪些差异? 阅读过 Integer 源码吗?分析下类或某些方法的设计要点? int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而i

《Java架构筑基》从Java基础讲起——常见的API方法

1. Object类 1.1 Object有哪些公用方法? a.方法equals测试的是两个对象是否相等 b.方法clone进行对象拷贝[问题:是浅拷贝还是深拷贝?] c.方法getClass返回和当前对象相关的Class对象 d.方法notify,notifyall,wait都是用来对给定对象进行线程同步的 2. String类 2.1 String类的一些特性 String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它