Java基础:Java数据类型

Java 是一种强类型语言,这就意味着必须为每一个变量声明一种类型。在 Java 中基本数据类型共有 8 种,包括 4 种整型、2 种浮点型、1 种用于表现 Unicode 编码的字符单元的字符类型 char 和一种用于表示真值的 boolean 类型

~

本篇主要记录内容包括:基础数据类型、对象包装器、字符串、数组


  • 上一篇内容:Java基础:Java基本概念
  • 下一篇内容:Java基础:Java数字类型
  • 更多知识学习:全网最全的 Java 技术栈内容梳理(持续更新中)

文章目录

    • 一、基础数据类型
        • 1、整型
        • 2、浮点类型
        • 3、char 类型
        • 4、boolean 类型
        • 5、基础类型间的转换
    • 二、对象包装器
        • 1、包装器类
        • 2、自动拆/装箱
        • 3、大数值
    • 三、字符串
        • 1、String 类常用的 api
        • 2、StringBuffer、StringBuilder
    • 四、数组
        • 1、数组初始化以及匿名数组
        • 2、Arrays类 API
        • 3、多维数组


一、基础数据类型

Java 是一种强类型语言,这就意味着必须为每一个变量声明一种类型。在 Java 中基本数据类型共有 8 种,包括 4 种整型、2 种浮点型、1 种用于表现 Unicode 编码的字符单元的字符类型 char 和一种用于表示真值的 boolean 类型。

1、整型

整型用于表示没有小数部分的数值,它允许是负数。Java 提供了 4 种整形类型。

数据类型存储需求默认值取值范围
int4 字节,32 位0- 2^31 ~ 2^31-1
short2 字节,16 位0- 327,68 ~ 32,767
long8 字节,64 位0L- 2^63 ~ 2^63-1
byte1 字节,8 位0- 128 ~127

在通常情况下,int 类型最常用。但如果表示星球上的居住人数,就需要使用 long 类型了。byte 和 short 类型主要用于特定的应用场合,例如,底层的文件处理或者需要控制占用存储空间量的大数组。

在 Java 中,整型的范围与运行 Java 代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。与此相反,C 和 C++ 程序需要针对不同的处理器选择最为高效的整型,这样就有可能造成一个在 32 位处理器上运行很好的 C 程序在 16 位系统上运行却发生整数溢出。由于 Java 程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。

长整型数值有一个后缀 L 或 l(如4000000000L)。十六进制数值有一个前缀 0x 或 0X(如 0xCAFE)。八进制有一个前缀 0,例如,010 对应八进制中的 8。很显然,八进制表示法比较容易混淆,所以建议最好不要使用八进制常数。

从 Java 7 开始,加上前缀 0b 或 0B 就可以写二进制数。例如,0b1001 就是 9。另外,同样是从 Java 7 开始,还可以为数字字面量加下划线,如用 1_000_00(0或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只是为了让人更易读。Java 编译器会去除这些下划线。

2、浮点类型

浮点类型用于表示有小数部分的数值。在 Java 中有 2 种浮点类型。

数据类型存储需求默认值取值范围
float4 字节,32 位0.0f-2^31 ~ 2^31-1(有效位数6~7)
double8 字节,64 位0.0d-2^63 ~ 2^63-1(有效位数15位)

double 表示这种类型的数值精度是 float 类型的两倍(有人称之为双精度数值)。绝大部分应用程序都采用 double 类型。在很多情况下,float 类型的精度很难满足需求。实际上,只有很少的情况适合使用 float 类型,例如,需要单精度数据的库,或者需要存储大量数据。

float 类型的数值有一个后缀 F 或 f(例如,3.14F)。没有后缀 F 的浮点数值(如3.14)默认为 double 类型。当然,也可以在浮点数值后面添加后缀 D 或 d(例如,3.14D)。

所有的浮点数值计算都遵循 IEEE 754 规范。具体来说,有三个特殊的浮点数值用于表示溢出和出错情况的:● 正无穷大(Infinity)● 负无穷大(-Infinity)● 不是一个数字(NaN)。例如,使用一个正数除以 0 将得到正无穷大,使用一个负数除以 0 将得到负无穷大,0.0 除以 0.0 或对一个负数开方将得到一个非数。正无穷大通过 Double 或 Float 类的 POSITIVE_INFINITY 表示;负无穷大通过 Double 或 Float 类的 NEGATIVE_INFINITY 表示,非数通过 Double 或 Float 类 的NaN 表示。

警告:浮点数值不适用于无法接受舍入误差的金融计算中。例如,命令 System.out.println(2.0-1.1)将打印出 0.8999999999999999,而不是人们想象的 0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3 一样。如果在数值计算中不允许有任何舍入误差,就应该使用 BigDecimal 类。

3、char 类型

char 类型原本用于表示单个字符。不过,现在情况已经有所变化。如今,有些 Unicode 字符可以用一个 char 值描述,另外一些 Unicode 字符则需要两个 char值。

char 类型的字面量值要用单引号括起来。例如:'A’ 是编码值为 65 所对应的字符常量。它与 “A” 不同,“A” 是包含一个字符 A 的字符串。char 类型的值可以表示为十六进制值,其范围从 \u0000 到 \Uffff。例如:\u2122 表示注册符号(TM), \u03C0 表示希腊字母 π。

除了转义序列 \u 之外,还有一些用于表示特殊字符的转义序列。

转译序列名称Unicode 转译序列转译序列名称Unicode 转译序列
\b推格\u0008\"双引号\u0022
\t制表\u0009\’单引号\u0027
\n换行\u0001\\反斜杠\u005c
\r回车\u000b

所有这些转义序列都可以出现在加引号的字符字面量或字符串中。

警告:Unicode 转义序列会在解析代码之前得到处理。例如,“\u0022+\u0022” 并不是一个由引号 (U+0022) 包围加号构成的字符串。实际上,\u0022 会在解析之前转换为 “,这会得到 “”+”",也就是一个空串。

4、boolean 类型

boolean(布尔)类型有两个值:false 和 true,用来判定逻辑条件。整型值和布尔值之间不能进行相互转换。

5、基础类型间的转换

基础类型间的等级低到高:byte < char < short < int < long < float < double,类型的转换分为自动转换与强制转换,自动转换:运算过程中,低级可以自动向高级转换;强制转换:高级需要强制转换为低级,可能会丢失精度规则:

  • = 右边先自动转换成表达式中最高级的数据类型,再进行运算;
  • = 左边数据类型级别 > 右边数据类型级别,右边会自动升级;
  • = 左边数据类型级别 <右边数据类型级别,需要强制转换右边数据类型;
  • 整型常量赋值给 byteshortcharintlong 时,超过类型最大值,超过需要强转。

二、对象包装器

1、包装器类

有时,需要将 int 这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。例如,Integer 类对应基本类型 int。通常,这些类称为包装器(wrapper)。这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character、Void 和 Boolean(前6个类派生于公共的超类Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是 final,因此不能定义它们的子类。

假设想定义一个整型数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成 ArrayList<int>。这里就用到了 Integer 对象包装器类。我们可以声明一个 Integer 对象的数组列表。

警告:由于每个值分别包装在对象中,所以 ArrayList<Integer> 的效率远远低于 int[ ] 数组。因此,应该用它构造小型集合,其原因是此时程序员操作的方便性要比执行效率更加重要。

2、自动拆/装箱

幸运的是,有一个很有用的特性,从而更加便于添加 int 类型的元素到 ArrayList<Integer> 中。这个调用 list.add(3); 将自动变换成 List.add(Integer.valueOf(3));。相反地,当将一个 Integer 对象赋给一个 int 值时,将会自动地拆箱。也就是说,编译器将语句 int n = list.get(i); 翻译成 int n = list.get(i).intValue();。甚至在算术表达式中也能够自动地装箱和拆箱。例如,可以将自增操作符应用于一个包装器引用。

大多数情况下,容易有一种假象,即基本类型与它们的对象包装器是一样的,只是它们的相等性不同。大家知道,== 运算符也可以应用于对象包装器对象,只不过检测的是对象是否指向同一个存储区域,因此,下面的比较通常不会成立:

Integer a = 1000;
Integer b = 1000;
if(a==b){...}

然而,Java 实现却有可能(may)让它成立。如果将经常出现的值包装到同一个对象中,这种比较就有可能成立。这种不确定的结果并不是我们所希望的。解决这个问题的办法是在两个包装器对象比较时调用 equals 方法。

Ps:自动装箱规范要求 boolean、byte、char ≤ 127,介于 -128~127 之间的 short 和 int 被包装到固定的对象中。例如,如果在前面的例子中将 a 和 b 初始化为 100,对它们进行比较的结果一定成立。

关于自动装箱还有几点需要说明:

  • 首先,由于包装器类引用可以为 null,所以自动装箱有可能会抛出一个 NullPointerException 异常;
  • 另外,如果在一个条件表达式中混合使用 Integer 和 Double 类型,Integer 值就会拆箱,提升为 double,再装箱为 Double;
  • 最后,装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。虚拟机只是执行这些字节码。

3、大数值

如果基本的整数和浮点数精度不能够满足需求,那么可以使用 java.math 包中的两个很有用的类:BigInteger 和 BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger 类实现了任意精度的整数运算,BigDecimal 实现了任意精度的浮点数运算。使用静态的 valueOf 方法可以将普通的数值转换为大数值:BigInteger a = BigInteger.valueOf(100);

遗憾的是,不能使用人们熟悉的算术运算符(如:+和*)处理大数值。而需要使用大数值类中的 add 和 multiply 方法。

三、字符串

从概念上讲,Java 字符串就是 Unicode 字符序列。例如,串 Java\u2122 由 5 个 Unicode 字符 J、a、v、a 和 TM。Java 没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义类,很自然地叫做 String。每个用双引号括起来的字符串都是 String 类的一个实例。

1、String 类常用的 api

Java 中的 String 类包含了 50 多个方法。令人惊讶的是绝大多数都很有用,可以设想使用的频繁非常高。下面的汇总了一部分最常用的方法。

方法名方法说明方法名方法说明
length()获取字符串的长度charAt(int index)返回下标所在的cha值(字符)
equals(String s)判断两个字符串内容是否相同equalsIgnoreCase(String s)不区分大小写判断两个字符串内容是否相同
indexOf(String s)返回字串第一次出现的位置,没出现则返回-1lastIndexOf(String s)返回字串最后一次出现的位置,没出现返回-1
starstWith(String prefix)判断字符串是否以prefix为前缀开头endsWith(String suffix)判断字符串是否以suffix为后缀结尾
toLowerCase()返回字符串的小写形式toUpperCase()返回字符串的大写形式
substring(int startindex,int endindex)返回从startindex开始到endindex结束的字串contains(String s)判断是否包含字串s
replaceAll(String oldSrt,String newSrt)替换原有字符串中的字串为目标字串concat(String s)字符串拼接,相当于+
split(String split)以指定字符串分割后返回字符串数组tirm()返回字符串两边消除空格后的字符串
getBytes()返回字符串的字节数组isEmpty()判断字符串是否为空
tocharArray()将此字符串转换为一个新的字符数组compareTo将字符串与另一个对象进行比较
hashCode()返回字符串的哈希值

2、StringBuffer、StringBuilder

String 使用数组存储字符串的内容,数组使用关键词 final 修饰,因此数组内容不可变,使用 String 定义的字符串的值也是不可变的,因此每次对 String 的修改操作都会创建新的 String 对象,导致效率低下且占用大量内存空间。

StringBuffer 和 StringBuilder 都是 AbstractStringBuilder 的子类,同样使用数组存储字符串的内容,由于数组没有使用关键词 final 修饰,因此数组内容可变,StringBuffer 和 StringBuilder 都是可变类型,可以对字符串的内容进行修改,且不会因为修改而创建新的对象。

在需要经常对字符串的内容进行修改的情况下,应使用 StringBuffer 或 StringBuilder,在时间和空间方面都显著优于 String。

StringBuffer 对定义的方法或者调用的方法使用了关键词 synchronized 修饰,而 StringBuilder 的方法没有使用关键词 synchronized 修饰。由于 StringBuffer 对方法加了同步锁,因此其效率略低于 StringBuilder,但是在多线程的环境下,StringBuilder 不能保证线程安全,因此 StringBuffer 是更优的选择。

四、数组

数组是一种数据结构,用来存储同一类型值的集合。通过一个整型下标可以访问数组中的每一个值。例如,如果 a 是一个整型数组,a[i] 就是数组中下标为 i 的整数。在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字,例如:int[] a;

1、数组初始化以及匿名数组

数组初始化:在定义数组时只指定数组的长度,由系统自动为元素 赋初值 的方式称作动态初始化。

格式:

  • 数据类型[] 数组名 = new 数据类型[长度]; int[] arr = new int[4];
  • 类型[] 数组名 = new 类型[]{元素,元素,……}; int[] arr = new int[]{1,2,3,4};
  • 类型[] 数组名 = {元素,元素,元素,……}; int[] arr = { 1, 2, 3, 4 };

2、Arrays类 API

数组的工具类:java.util.Arrays,由于数组对象本身并没有什么方法可以提供我们调用,但是API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。Arrays 类中的方法都是 static 修饰的静态方法,使用的时候可以直接使用类名进行调用,而不用使用对象来调用。例如:Arrays.toString(string);。下面的汇总了一部分最常用的方法。

方法名方法说明方法名方法说明
System.out.println(Arrays.toString(ints));返回数组的字符串格式Arrays.sort(ints);数组按照升序排序
Arrays.sort(ints,0,4);排序其他用法,对指定下标范围进行排序 Arrays.fill(ints,1);给数组元素填充相同的值
Arrays.deepToString(ints)返回多维数组的字符串格式Arrays.equals(ints[0],ints[1]))比较两个数组的元素是否相等

3、多维数组

多维数组将使用多个下标访问数组元素,它适用于表示表格或更加复杂的排列形式。

二维数组定义格式:

//第一种定义格式
//相当于定义了一个3*4的二维数组,即二维数组的长度为3,二维数组中的每个元素又是一个长度为4的数组
- int[][] arr = new int[3][4];//不推荐
//第二种定义格式
//第二种方式和第一种类似,只是数组中每个元素的长度不确定,必须要new:arr[0] = new int[5];...
int[][] arr = new int[3][];
//第三种定义格式
//二维数组中定义了三个元素,这三个元素都是数组,分别为{1,2}、{3,4,5,6}、{7,8,9}
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};

二维数组内存:比如,int[][] arr = new int[3][2];,外层数组长在内存开辟连续的 3 个大的内存空间,每一个内存空间都对应的有地址值,每一个大内存空间里又开辟连续的两个小的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP连接的建立与终止

TCP连接的建立与终止 1.三次握手 TCP是面向连接的&#xff0c;无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接服务&#xff0c;连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方…

日常问题:MySQL排序字段数据相同不能分页问题

【问题日期】 2022-11-14 22:45:12 【问题描述】 MySQL 排序字段数据相同不能分页问题&#xff1a;在分页查询数据时&#xff0c;按创建时间排序&#xff0c;由于数据是批量创建的&#xff0c;导致部分数据创建时间一样&#xff0c;而此时分页查询数据&#xff0c;翻页后出现…

数据缺失值处理

数据缺失值处理 In [1]: import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor,RandomForestClassifier from sklearn.preprocessing import StandardScaler from sklearn.impute import SimpleImputer In [2]: df pd.DataFrame() df[…

Java基础:Java数字类型

Java 中包含多种运算符&#xff1a;算数运算符、关系运算符、逻辑运算符、位运算符。在 Math 类中&#xff0c;包含了各种各样的数学函数。在编写不同类别的程序时&#xff0c;可能需要的函数也不同。要生成一个随机数&#xff0c;可以使用 Random 对象。 &#xff5e; 本篇主要…

Java基础:Java流程控制

块&#xff08;即复合语句&#xff09;是指由一对大括号括起来的若干条简单的 Java 语句。块确定了变量的作用域。一个块可以嵌套在另一个块中。但是&#xff0c;不能在嵌套的两个块中声明同名的变量。使用块&#xff08;有时称为复合语句&#xff09;可以在Java程序结构中原本…

Java基础:Java类与对象

面向对象程序设计&#xff08;简称OOP&#xff09;是当今主流的程序设计范型&#xff0c;它已经取代了20世纪70年代的“结构化”过程化程序设计开发技术。Java是完全面向对象的&#xff0c;必须熟悉OOP才能够编写Java程序。面向对象的程序是由对象组成的&#xff0c;每个对象包…

SVN备份脚本

#!/bin/bash #svn全量备份脚本 wwytcode_path/home/wwytcode/project backup_path/home/bak Datedate %Y%m%d cd $backup_path echo date >> $back_path/svn_backup.log svnversionsvnlook youngest $wwytcode_path svnadmin dump --revision 0:$svnversion $wwytcode_pa…

Java基础:Java面向对象

面向过程的优点是性能比面向对象高&#xff0c;不需要面向对象的实例化&#xff1b;缺点是不容易维护、复用和扩展。面向对象的优点是具有封装、继承、多态的特性&#xff0c;因而容易维护、复用和扩展&#xff0c;可以设计出低耦合的系统&#xff1b;缺点是由于需要实例化对象…

薪资生成

import openpyxl from openpyxl.styles import Font,Alignment,Side,Border#设置字体样式 fontFont(name宋体,size20,boldTrue) font2Font(name宋体,size12,boldTrue) alignmentAlignment(horizontalcenter,verticalcenter,wrap_textTrue) sideSide(stylethin ,color000000) …

Java基础:Java抽象接口

在Java中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而如果一个类中含有抽象方法&#xff0c;则该类必须定义为一个抽象类。接口是功能的集合&#xff0c;同样可看做是一种特殊的数据类型&#xff0c;是比抽象类更为抽象的类&#xff0c;接口只描述所应该…

13 张图带你学懂 Kubernetes Service(转载)

在 Kubernetes 中 Service 主要有4种不同的类型&#xff0c;其中的 ClusterIP 是最基础的&#xff0c;如下图所示&#xff1a; 当我们创建一个 NodePort 的 Service 时&#xff0c;它也会创建一个 ClusterIP&#xff0c;而如果你创建一个 LoadBalancer&#xff0c;它就会创建一…

Java基础:Java异常机制

异常是程序运行过程中出现的错误。Java 把异常当作对象来处理&#xff0c;把异常信息封装成了一个类&#xff0c;并定义一个基类java.lang.Throwable作为所有异常的超类。Throwable : 它是所有错误与异常的超类&#xff08;祖宗类&#xff09;,有两个子类 Error 和 Exception。…

JavaWeb:Servlet的应用及接口介绍

广义的 Servlet 泛指在服务器上运行的 Java 程序&#xff0c;但是这个 Java 程序&#xff0c;并不能独立运行&#xff08;因为 Servlet 没有 main 方法&#xff09;&#xff0c;需要部署在相应的 Servlet 容器中&#xff0c;比如 Tomcat 和 Jetty。Servlet 主要功能在于交互式地…

DOCKERFILE参数注解

Dockerfile由一行行命令语句组成&#xff0c;并且支持以#开头的注释行。 一般的&#xff0c;Dockerfile 分为四部分&#xff1a;基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 Dockerfile的指令是忽略大小写的&#xff0c;建议使用大写&#xff0c;使用 # 作为…

Zookeeper:分布式过程协同技术

Zookeeper 是一个高性能的分布式一致系统&#xff0c;在分布式系统中有着广泛的应用。基于它&#xff0c;可以实现诸如“分布式同步”、“配置管理”、“命名空间管理”等众多功能&#xff0c;是分布式系统中常见的基础系统。Zookeeper 主要用来解决分布式集群中应用系统的一致…

面试题2021-2-24

给某CentOs6虑拟机添加了新的数据盘&#xff0c;设备名为/de/sdd.写命令格式化满加的效的并挂载到指定目录/opt fdisk -l mkfs.ext4 /de/sdd mount /de/sdd /opt 如何查看与RabbtMQ服务器之间的establish状态连接数&#xff1f;netstat -an |grep ESTABLISHED |grep tcp |wc -l…

Zookeeper:在三种模式下的部署

zookeeper 安装模式有三种&#xff1a;单机模式&#xff1a;单机单 server&#xff1b;集群模式&#xff1a;多机多 server&#xff0c;形成集群&#xff1b;伪集群模式&#xff1a;单机多 server&#xff0c;形成伪集群。 ~ 本篇内容包括&#xff1a;Zookeeper 官网下载、Zook…

Linux namespace概述

操作系统通过虚拟内存技术&#xff0c;使得每个用户进程都认为自己拥有所有的物理内存&#xff0c;这是操作系统对内存的虚拟化。操作系统通过分时调度系统&#xff0c;每个进程都能被【公平地】调度执行&#xff0c;即每个进程都能获取到CPU&#xff0c;使得每个进程都认为自己…

Zookeeper:Zookeeper的主从选举机制

ZAB 协议&#xff0c;全称 Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;&#xff0c;是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议&#xff0c;ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源&#xff0c;使得一个宿主机可拥有多个主机名或Domain Name。换句话说&#xff0c;可让不同namespace中的进程看到不同的主机名。 例如&#xff0c;使用unshare命令(较新版本L…