Java——数据类型

基本类型概述

  • boolean 布尔
  • byte 字节
  • short/int/long 短整数/整数/长整数
  • float/double 浮点数
  • char 字符

1、布尔类型 boolean:
只有true,或者false两种值,默认是false

2、字节类型 byte:
byte 字节,1 byte = 8 bits (8位)
存储有符号的,以二进制补码表示的整数
最小值-128,最大值127,默认值0
byte 类型用在大型数组中可以显著节约空间,主要代替小整数,因为 byte 变量占用的空间只有 int 类型的四分之一
byte 在二进制文件读写中使用较多

3、整数类型:
short,16位,2个字节,有符号的以二进制补码表示的整数
int, 32位,4个字节,有符号的以二进制补码表示的整数
long, 64位,8个字节,有符号的以二进制补码表示的整数

4、浮点数类型:
float,单精度,32位,4个字节
double,双精度,64位,8个字节

5、字符类型 char:
单一的 16 位 Unicode 字符
最小值是 \u0000(即为0)
最大值是 \uffff(即为65,535)
char 数据类型可以储存任何字符

一、基本类型

1.1整型

在Java中,整型的范围与运行Java代码的机器无关,这就解决了软件从一个平台移植到另一个平台,或者在同一个平台的不同操作系统之间进行移植给程序员带来的诸多问题

  • 最常用类型是 int 类型
  • 长整型数值有一个后缀 L 或 l,如 4000000000L
  • 十六进制数值有一个前缀 0x 或 0X,如 0xCAFE。八进制数值有一个前缀 0,如 017
  • 从Java7开始,加上前缀 0b 或 0B可以表示二进制,如 0b1001;还可以为数字字面量加下划线,如 1_000_000,表示一百万

1.2浮点型

double 类型的数值精度是 float 的两倍,因此很少情况使用 float 类型,如需要单精度数据的库,需要存储大量数据等

  • 浮点数值不适用于无法接受舍入误差的金融计算,若在数值计算中不允许有任何舍入误差应该使用 BigDecimal 类
  • 可以使用十六进制表示浮点数据,如 0.125=2^(-3) 可以表示成 0x1.0p-3。在十六进制表示法中,用 p 表示指数,而不用 e;尾数采用十六进制,指数采用十进制;指数的基数是2,不是10
  • 用于表示溢出和出错情况的三个特殊的浮点数值是:正无穷大,负无穷大,NaN(非数值),分别用常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN(Float.NaN)表示,例如一个正整数除以0结果为正无穷大,0/0或复数的平方根结果为NaN

特别说明:

  1. 不能这样检测一个特定值是否等于 Double.NaN:if(x == Double.NaN) // is never true
  2. 所有"非数值"的值都认为是不相同的,但可以使用 Double.isNaN方法:if(Double.isNaN(x)) // check whether x is "not a number"

1.3char类型

char类型的字面量值要用单引号括起来;其值可以表示为十六进制值,范围从 \u0000 到 \Uffff

警告!

  1. Unicode转义序列会在解析代码之前得到处理,如 "\u0022+\u0022" 是由引号包围加号构成的字符串,实际上, \u0022 会在解析之前转换为 " ,这会得到 " "+" ",即一个空串
  2. 当心注释中的 \u:
  • 注释 // \u00A0 is a newline 会产生一个语法错误,因为读程序时 \u00A0 会替换成换行符
  • 注释 // Look inside c:\users 会产生一个语法错误,因为 \u 后并未跟着4个十六进制数

强烈建议:

  1. 不要在程序中使用char类型(因为它已经不能满足描述所有Unicode字符的需要),除非确实需要处理UTF-16代码单元
  2. 最好将字符串作为抽象数据类型处理

1.4枚举类型

有时候,变量的取值只在 有限集合 中。如果分别对其编码存在一定隐患,变量中很可能保存的是一个错误的值,因此设置枚举类型
例如,披萨的尺寸有小,中,大,超大4种,可自定义枚举类型:
enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };
声明这种类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能存放这个类型中给定的某个枚举值,或者 null 值(null 表示该变量没有设置任何值)

1.5大数值

如果基本的整数和浮点数精度不能满足需求,可以使用 Java.math 包中的 BigInteger 类和 BigDecimal 类,处理包含任意长度数字序列的数值
特别注意,大数值的计算中不再使用简单运算符,而是使用方法

import java.util.*;
import java.math.*;
 
/**
 * This program discribes big number that is about luck draw
 * @version 11:27 2019-09-29
 * @auther xxwang1018
 */
 
public class BigNumberTest{
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        System.out.println("总共几个数?");
        int total=in.nextInt();
        System.out.println("要抽几个数?");
        int number=in.nextInt();
 
        BigInteger lotteryOdds=BigInteger.valueOf(1);
        for(int i=1; i<=number; ++i)
            lotteryOdds=lotteryOdds.multiply(BigInteger.valueOf(total-i+1)).divide(BigInteger.valueOf(i));
        /**
         * 中奖概率 n*(n-1)*(n-2)*...*(n-k+1)/(1*2*3*...*k)
         */
        System.out.println("你的中奖率为1/"+lotteryOdds);
    }
}

/*
测试结果:
总共几个数?
490
要抽几个数?
60
你的中奖率为1/716395843461995557415116222540092933411717612789263493493351013459481104668848

1.6数据运算

1.6.1数据类型转换

1、隐式类型转换
当两个不同数据类型的数值进行二元操作时,先转换为同一数据类型再进行运算

  • 若两个操作数有一个是 double 类型,另一个就会转换成 double 类型
  • 否则,若其中一个操作数是 float 类型,另一个就会转换成 float 类型
  • 否则,若其中一个操作数是 long 类型,另一个就会转换成 long 类型
  • 否则,两个操作数都将转换为 int 类型

2、强制类型转换
浮点类型转换为整型通过截断小数部分实现
如果试图讲一个数值从一种类型强制转换为另一种类型,又超出了目标类型的表示范围,结果会大不相同,如 (byte)300 的实际值是44

1.6.2位运算

处理整型类型时,可以直接对组成整型数值的各个位进行操作;可以使用掩码技术得到整数中的各个位
位运算符包括:

  • &运算符:对应位都为1,结果值对应位才为1,如:0110 & 1011=0010
  • |运算符:对应位都为0,结果值对应位才为0,如:0110 | 1011=1111

应用在布尔值上时,& 和 | 运算符也会得到一个布尔值
它们与 && 与 || 运算符类似,但前者不采用 "短路" 方式求值,即运算符两侧的操作数都需要计算

  • ^运算符:对应位相同结果值对应位为0,对应位不同结果值对应位为1,如:0110 ^ 1011=1101
  • ~运算符:结果值与初始值正好相反,如:~ 1011=0100
  • <<运算符:左移,N << S 的值是将 N 左移 S 位,右边空出来的位填充0,相当于乘以2的 S 次方,如:11111000 << 1=11110000
  • >>运算符:右移,N >> S 的值是将 N 右移 S 位,左边空出来的位如果是正数则填充0,如果是负数则填充1,相当于除以2的 S 次方,如:00010111 >> 2=00000101,11110110 >> 3=1111110
  • >>>运算符:无符号右移,无论正数还是负数,无符号右移后左边空出来的位都填充0,如:11111000 >>> 2=00111110

移位运算符的右操作数要完成模32的运算(除非左操作数是 long 类型,此时需要对右操作数模64),如1 << 32的值等于1 << 3或8

二、字符串

Java没有内置的字符串类型,而是在标准Java库中提供了一个预定义类String

2.1拼接

与绝大多数程序设计语言一样,Java语言允许使用 + 号连接两个字符串
当一个字符串与一个非字符串的值拼接时,后者被转换成字符串(任何一个Java对象都可以转换成字符串)

2.2空串与 null串

空串是一个Java对象,有自己的串长度(0)和内容(空)
String变量可以存放一个特殊值,名为NULL,表示目前没有任何变量与该变量关联
若要检查一个字符串既不是null也不是空串,需要使用语句 if(str != 0 && str.length() != 0),首先要检查 str 不为 null

三、数组

声明数组有两种方式,int[] a或int a[],多数人喜欢使用第一种,它将类型 int[](整型数组)与变量名分开

Java中,数组长度可以是变量:new int[n] 表示创建一个长度为 n 的数组;还可以是0,但与null不同

  1. 创建数字数组时,所有元素默认初始化为0
  2. 创建 boolean 数组时,所有元素默认初始化为 false
  3. 创建对象数组时,所有元素默认初始化为 null,表示这些元素未存放任何对象

3.1for each 循环

1、一维数组

for(value: collection)
    //do something with value

collection 集合表达式必须是一个数组或者是一个实现 Iterable 接口的类对象
2、二维数组

for(double[] row : a)
    for(double value : row)
        //do something with value

for each 语句不能自动处理二维数组的每一个元素,它是按照行,也就是一维数组处理的

3.2一维数组

3.2.1初始化

1、静态初始化:初始化时显式指定每个数组元素的初始值,系统决定数组长度arrayName = new type[]{ element1, element2, element3... };

int[] intArr;
intArr = new int[]{1,2,3,4,5,9};

2、简化的静态初始化type[] arrayName =  {element1, element2, element3... };

String[] strArr = {"张三","李四","王二麻子"};

3、动态初始化:初始化时指定数组的长度,由系统初始化每个数组元素的默认值arrayName = new type[length];

int[] price = new int[4];

注意:不要同时使用静态初始化和动态初始化,即不要在进行数组初始化时,既指定数组的长度,又为每个数组元素分配初始值

3.2.2拷贝

Java中允许将一个数组变量拷贝给另一个数组变量,这时两个变量引用同一个数组

int[] luckNumber=intArr; //接上面的数组
luckNumber[5]=12; //now kakaka[5] is also 12

若想把一个数组的所有值拷贝到新的数组,可使用 Arrays 类的 copyOf 方法,该方法通常用来增加数组大小

int[] copyLuckNumber= Arrays.copyOf(luckNumber, luckNumber.length);

3.3多维数组

import java.util.*;
 
/**
 * This program demonstrates a YanghuiTriangle arrey
 * @version 12:29 2019-09-29
 * @auther xxwang1018
 */
 
public class YanghuiTriangle{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("请输入杨辉三角的行数:");
        int n = in.nextInt();
 
        int[][] triangle = new int[n][];
        for (int i=0; i<triangle.length; i++) {
            triangle[i] = new int[i+1];
 
            for (int j = 0; j < triangle[i].length; j++) {
            if (i == 0 || j == 0 || i == j) {
                    triangle[i][j] = 1;
                } else {
                    triangle[i][j] = triangle[i - 1][j] + triangle[i - 1][j - 1];
                }
                System.out.print(triangle[i][j] + " ");
            }
            System.out.println();
        }
    }
}

/*
测试结果:
请输入杨辉三角的行数:8
1 
1 1 
1 2 1 
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1 
1 6 15 20 15 6 1 
1 7 21 35 35 21 7 1 

猜你喜欢

转载自www.cnblogs.com/xxwang1018/p/11606876.html