Java 基础篇--基础知识之数据类型

数据类型

数据类型在计算机语言中,是对内存位置的一个抽象表达式,可以理解为针对内存的一种抽象的表达方式。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java中,本质上将数据类型分为两种:基本数据类型和引用数据类型。Java 数据类型的结构如下图所示:
f345ad9c92870b3373fa0d1a377edf35.png

一、 基本数据类型

基本数据类型分为三大类:布尔类型、数值类型和字符型

1.1 布尔类

boolean类型用于对两个数值通过逻辑运算判断结果是“真”还是“假”,Java中用保留字true和false来代表逻辑运算中的“真”和“假”,所以布尔类型的值只有true和false。

Java没有规范boolean类型变量所占的内存空间,一般boolean类型的变量或值只要1位即可保存。默认值为false。

boolean isable = true;//声明一个boolean类型变量isable,并赋初始值为true

1.2 数值类型

  • 整型

    • 字节型:最小的整数类型。一个byte类型整数占1个字节存储,内存里占8位,范围为-128(-2^7) 到127(2^7-1),默认值为0。byte类型用在大型数组中节约空间,注要用于代替整数,因为byte变量占用空间只有int类型的四分之一。
    • 短整型:short类型限制数据的存储为先高字节,后低字节,这样在某些机器中会出错,因此该类型很少被使用。一个short类型整数占2个字节存储,内存里占16位,范围为-32,768 (-2^15)到32,767 (2^15-1)。默认值为0。一般情况下,因为Java本身转型的原因,可以直接写0。
    • 整型:最常使用的一种整数类型。一个int类型整数占4个字节存储,内存里占32位,范围为-2,147,483,648 (-2^31)到2,147,483,647 (2^31-1)。默认值为0。一般整数默认为int类型。
    • 长整型:对于大型程序常会遇到很大的整数,当超出int类型所表示的范围时就需要使用long类型来进行表示。一个long类型整数占8个字节存储,内存里占64位,范围为-9,223,372,036,854,775,808 (-2^63)到9,223,372,036, 854,775,807 (2^63-1)。默认值为0L,也可以直接写0。
    public static void main(String[] args) { 
    // 声明局部常量 
       byte a = 20; // 声明一个byte类型的变量并赋予初始值为20 
       short b = 10; // 声明一个short类型的变量并赋予初始值为10 
       int c = 30; // 声明一个int类型的变量并赋予初始值为30 
       long d = 40; // 声明一个long类型的变量并赋予初始值为40
       long sum = a + b + c + d; 
       System.out.println("20+10+30+40=" + sum);
       /*
       	整型中,每个类型都有一定的表示范围,超出表示范围,即溢出。
       	发生了溢出,溢出的时候并不会抛异常,也没有任何提示。
       	所以,在程序中,使用同类型的数据进行运算的时候,一定要注意数据溢出的问题。
       */
       int i = Integer.MAX_VALUE;
       int j = Integer.MAX_VALUE;
       int k = i + j;
       System.out.println("i (" + i + ") + j (" + j + ") = k (" + k + ")");
    }
    
  • 浮点型
    浮点类型是带有小数部分的数据类型,也叫实型,是符合IEEE 754标准(为了解决部分小数无法使用二进制精确表示的问题,即出现无限循环情况,例如0.1的二进制表示)的浮点数。浮点型有这固定表数范围和字段长度,且与机器无关。
    浮点数采用二进制数据的科学计数法【只有浮点数才可以使用科学计数法表示,由一般实数和e±n(E±n)组成,如12.3e3、5E-3,它们分别表示12.3乘以10的3次方,5乘以10的-3次方。需注意的是,e或E之前必须有数字,且e或E后面的指数必须为整数。】,可能不能精确表示一个浮点数。此时我们可以使用BigDecimal类来进行精确数据表示
    浮点数有两种类型float和double。Java浮点型默认为double类型。Java提供了三个特殊浮点型:正无穷:POSITIVE INFINITY【正无穷与所有正无穷相等】、负无穷:NEGATIVE INFINITY【负无穷与所有负无穷相等】、非数:NaN【非数不与任何数相等】。

    • 单精度:float,占4个字节,内存里占32位,第1位为符号位【0正1负】,接下来8位表示指数【-2^7 ~ 2^7 -1】,再接下来23位表示尾数【2^23】。单精度浮点数的表示是在数值后面加上f或F,默认值为0.0F。有效小数点只有6~7位。
    • 双精度:double,占8个字节,内存里占64位,第1位为符号位【0正1负】,接下来11位表示指数【-2^10 ~ (2^10 - 1 】,再接下来52位表示尾数【2^52】。双精度浮点数的表示是在数值后面加上d或D,默认值为0.0D。有效小数点只有15~16位。
    float f1 = 234.5F//声明float类型变量f1,并赋初始值为234.5f
    double d1 = 123.4//声明double类型变量d1,并赋初始值为123.4
    double d2 = 123.4D//声明double类型变量d2,并赋初始值为123.4	
    

1.3 字符型

Java语言中的字符类型使用两个字节的Unicode编码(通常用十六进制)表示,它支持世界上所有语言,可以使用单引号字符或者整数对char型赋值。一般计算机语言使用ASCII编码,用一个字节表示一个字符。ASCII码是Unicode码的一个子集,用Unicode表示ASCII码时,其高字节为 0,它是其前255个字符。char类型通常用于表示单个字符,且必须使用单引号(’)括起来,范围为’\u0000’~’\uffff’,(Unicode字符集)。字符值有三种形式:
1)直接通过单个字符来指定字符型值。eg:‘0’,‘a’,‘A’。
备注:【‘0’->‘9’:48->57,‘a’->‘z’:65->90,‘A’->‘Z’:97->122】
2) 通过转义字符来表示特殊字符型值。eg:’\n’,’\r’。
3) 直接通过Unicode值来表示字符型值,格式’\uXXXX’,其中XXXX代表一个十六进制整数。eg:’\u00a’,’\u00d’等。

计算机底层保存字符时,其实是保存该字符的对应编号,所有char类型值也可以直接作为整型来使用,相当一个16位无符号整数,范围0到65536。若将0到65535范围内的一个int类型赋值给char类型变量,系统会自动将int类型当成char类型处理。Java未提供表示字符串的基本数据类型,而是通过String类来表示,由于字符串是由多个字符组成,故字符串要使用双引号(")括起来。默认值为’\u0000’。

char letter = 'A';

二、引用数据类型

引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。引用数据类型是由用户自定义,用来限制其他数据的类型。引用类型还有一种特殊的null类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是Java语言里不再使用指针这个说法。空类型(null type)就是null值的类型,这种类型没有名称。因为null类型没有名称,所以不可能声明一个 null 类型的变量或者转换到null类型。空引用(null)是null类型变量唯一的值。空引用(null)可以转换为任何引用类型。在实际开发中,程序员可以忽略null类型,假定null只是引用类型的一个特殊直接量。

注意:空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个null值赋给基本数据类型的变量。

2.1 类

对共享相同属性、操作方法、行为及关系的一组对象的描述,是创建对象的模板。类是个抽象概念,可以自主创建,默认值为null,包括Object,void,String等。

public class A {
	String message = "hello";
    public static void main(String[] args){
    	System.out.println(message);
    }
}

2.2 接口

抽象方法的集合,是个抽象概念,可以自主创建,默认值为null。

interface A {
      public static final String message = "hello";//全局常量
      public abstract vod print();//抽象方法
}

2.3 数组

同一种类型数据的集合,是个容器,可以自动给数组中的元素从0开始编号,方便操作。

// 一维数组
int[ ] arr = new int[3];
// 二维数组(二维数组中有3个一维数组,一维数组中有4个元素。)
int[ ][ ] darr = new int[3][4];

三、基本数据类型和引用数据类型的区别

两者主要在于基本数据类型分配在栈上的,而引用数据类型是分配在堆上的。
不论是基本数据类型还是引用数据类型,都会先在栈中分配一块内存。对于基本数据类型来说,这块内存包含的是基本数据类型的内容,而对于引用数据类型来说,这块内存包含的是指向对象的地址,实际对象被分配在堆上。

2.1 内存方面

  1. 基本数据类型在被创建时,会在栈上给其划分一块内存,将数值直接存储在栈上;
  2. 引用数据类型在被创建时,首先要在栈上给其引用分配一块内存,而对象的具体信息都存储在堆上,然后由栈上面的引用指向堆中对象的地址。

2.2 概念方面

  1. 基本数据类型:变量名指向具体的数值;
  2. 引用数据类型:变量名指向存储数据对象的内存地址。

2.3 使用方面

  1. 基本数据类型:使用时需要赋具体值,判断相等使用“==”号;
  2. 引用数据类型:使用时可以赋null,判断相等使用equals方法。

四、基本数据类型转换

基本数据类型转换分为两种:自动类型转换和强制类型转换

4.1 自动类型转换

自动类型转换也叫放大转换,在系统中支持将某个基本数据类型的值直接赋值给另一个基本数据类型的变量,其需要满足两个条件:

  1. 两种类型要兼容,例如整型和浮点型;
  2. 目标类型大于源类型,例如int类型数据可以自动转换为double类型,反过来,则会出现问题。
int a = 13;//定义一个整型变量a,并赋初始值为13
double d = a;//将整型变量a的值赋值给浮点型变量d,由int类型自动转换为double类型
// double e = a; // 出现错误提示

自动类型转换图如下:
fc892a47dd18276d9cbcb1efe1a9022f.png

4.2 强制类型转换

强制类型转换也叫缩小转换,强制类型转换时,由于是将大的数据类型转换为小的数据类型,因此会引起溢出或损失精度。
其语法格式:(targetType)value
强制类型转换的运算符是圆括号(())且强制类型转换的数据类型也必须是兼容的。

	 double d = 40.9;
	 int a = (int)d;
	 System.out.println("a="+a);// a=40

五、自动拆箱和装箱

Java为八种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类(Wrapper Class)。包装类均位于java.lang包下,其和基本数据类型的对应关系如下表所示:
packaging.png

5.1 自动装箱

Java自动将基本数据类型转换成对于的包装器对象,都是通过包装类的 valueOf()方法来实现的。

5.2 自动拆箱

Java自动将包装器类型转换位对应的基本数据类型,都是通过包装类对象的 xxxValue()来实现的。

Integer a = 10;//自动装箱
int b = a;//自动拆箱

反编译如下:

Integer a= Integer.valueOf(10);
int b = a.intValue(); 

5.3 Java缓存机制

Java为了在自动装箱时避免每次去创建包装类型,采用了缓存技术。即在类加载时,初始化一定数量的常用数据对象(即常说的热点数据),放入缓存中,等到使用时直接命中缓存,减少资源浪费。Java提供的8种基本数据类型,除了float和double外,都采用了缓存机制。其实原因也很简单,因为浮点型数据,热点数据并不好确定,故并未采用。
各类型缓存范围:
Character:0~127
Byte,Short,Integer,Long:-128 到 127
Boolean:true,false

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值