网站怎么做搜狗排名,网站运营一个月多少钱,如何让商家建设网站,做网站内容软件大家好#xff0c;我是栗筝i#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验#xff0c;并希望进… 大家好我是栗筝i这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验并希望进一步完善自己对整个 Java 技术体系来充实自己的技术栈的同学。与此同时本专栏的所有文章也都会准备充足的代码示例和完善的知识点梳理因此也十分适合零基础的小白和要准备工作面试的同学学习。当然我也会在必要的时候进行相关技术深度的技术解读相信即使是拥有多年 Java 开发经验的从业者和大佬们也会有所收获并找到乐趣。 – 上一篇文章中我们讨论了 Java 程序的基本结构包括变量、方法、运算符与注释。本篇文章我们将深入了解 Java 的数据类型包括 Java 语言的 8 种基本数据类型、字符串与数组。这些数据类型是 Java 程序设计的基础也是编写高效、可靠代码的关键。 最后在前言的末尾我补充一下如果这篇文章对大家有所帮助或收获一定的乐趣和想法那么非常欢迎大家能够点赞、评论、收藏、订阅。这些也将是我持续更新的最大动力。 文章目录 1、数据类型1.1、整型1.2、浮点型1.3、字符型1.4、布尔型 2、数值类型之间的转换2.1、数值类型之间的转换2.2、强制类型转换 3、大数值4、字符串4.1、String 常见方法4.2、String 不可变 5、数组5.1、数组声明与初始化5.2、数组元素访问与赋值5.3、数组的常用方法5.3.1、Arrays.aslist()方法5.3.2、Arrays.binarySearch()方法5.3.3、Arrays.copyOf()方法5.3.4、Arrays.copyOfRange()方法5.3.5、Arrays.equals()方法5.3.6、Arrays.fill()方法5.3.7、Arrays.sort()方法5.3.8、Arrays.toString()方法 5.4、多维数组 1、数据类型
Java 是一种强类型语言这意味着每个变量都必须声明其数据类型。Java 提供了 8 种基本数据类型包括 4 种整型byte、short、int、long、2 种浮点型float、double、1 种字符类型char用于表示 Unicode 字符和 1 种布尔类型boolean用于表示真假值。
1.1、整型
Java 提供了四种整型数据类型分别是 int、short、long 和 byte它们的存储需求、默认值和取值范围如下 在大多数情况下我们会使用 int 类型。但如果需要表示非常大的数如地球人口数量则需要使用 long 类型。byte 和 short 类型主要用于特定的场景如底层文件处理或大数组。
Java 中的整型范围与运行 Java 代码的机器无关这使得 Java 程序在不同平台上的移植更为容易。
Java 还支持多进制的表示如十六进制0x 或 0X 开头、八进制0 开头和二进制0b 或 0B 开头。从 Java 7 开始还可以在数字中加入下划线以提高可读性如 1_000_000 表示一百万。
1.2、浮点型
Java 提供了两种浮点类型分别是 float 和 double它们的存储需求、默认值和取值范围如下 float 类型的数值有一个后缀 F 或 f如 3.14F。没有 F 后缀的浮点数值如 3.14默认为 double 类型。也可以在浮点数值后面添加后缀 D 或 d如 3.14D。
double 类型的精度是 float 类型的两倍因此在大多数情况下我们会使用 double 类型。只有在特定的场景下如需要单精度数据的库或需要存储大量数据我们才会使用 float 类型。
所有的浮点数值计算都遵循 IEEE 754 规范。在这个规范中定义了一些特殊的浮点数值如正无穷大Infinity、负无穷大-Infinity和非数NaN。
需要注意的是由于浮点数值采用二进制系统表示因此在进行浮点数值计算时可能会出现舍入误差。如果需要进行精确的数值计算应该使用 BigDecimal 类。
1.3、字符型
char 类型原本用于表示单个字符。不过现在情况已经有所变化。如今有些 Unicode 字符可以用一个 char 值描述另外一些 Unicode 字符则需要两个 char 值。
char 类型的字面量值需要用单引号括起来如 A 是编码值为 65 所对应的字符常量。它与 A 不同A 是包含一个字符 A 的字符串。char 类型的值可以表示为十六进制值其范围从 \u0000 到 \uffff。
除了 \u 转义序列还有一些用于表示特殊字符的转义序列如 \b、\t、\n、\r、\、\ 和 \\。 需要注意的是在 Java 中Unicode 转义序列会在解析代码之前得到处理。例如\u0022\u0022 并不是一个由引号 (\u0022) 包围加号构成的字符串而是一个空字符串
public class CharDemo {public static void main(String[] args) {// 初看会输出 实际输出 空字符串System.out.println(\u0022\u0022); // 因为 Unicode 转义序列会在解析代码之前得到处理// 所以上面这行代码实际在解析后相当于System.out.println(); }
}1.4、布尔型
Java 中的 boolean 类型有两个值false 和 true主要用于逻辑判断。
在 Java 中整型和布尔型是不能直接进行转换的。这一点与一些其他编程语言如 C 和 C是不同的在那些语言中整型值 0 表示 false非 0 值表示 true。但在 Java 中必须使用 true 或 false 来表示布尔值。 2、数值类型之间的转换
2.1、数值类型之间的转换
我们经常需要将一种数值转换为另一种数值类型下图给出了数值类型之间的合法转换。 在图中: 有 6 个实心箭头表示无信息丢失的转换有 3 个虚箭头表示可能有精度损失的转换。例如123_456_789 是一个大整数它所包含的位数比 float 类型所能够表达的位数多。当将这个整型数值转换为 float 类型时将会得到同样大小的结果但却失去了一定的精度。
当使用两个数值进行二元操作时例如 n f, n 是整数f 是浮点数先要将两个操作数转换为同一种类型然后再进行计算。
2.2、强制类型转换
在必要的时候int 类型的值将会自动地转换为 double 类型。但另一方面有时也需要将 double 转换成 int。在 Java 中允许进行这种数值之间的类型转换。当然有可能会丢失一些信息。在这种情况下需要通过强制类型转换cast实现这个操作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型后面紧跟待转换的变量名。
例如
double d 100.123;
// 强制类型转换double 强制转换为 int小数部分会被丢弃
int i (int) d; 如果想对浮点数进行舍入运算以便得到最接近的整数在很多情况下这种操作更有用那就需要使用 Math.round 方法
double d 100.123;
// 强制类型转换double 强制转换为 int小数部分会被丢弃
int i (int) Math.round(d); Ps: 如果试图将一个数值从一种类型强制转换为另一种类型而又超出了目标类型的表示范围结果就会截断成一个完全不同的值。 3、大数值
如果基本的整数和浮点数精度不能够满足需求那么可以使用 java.math 包中的两个很有用的类: BigInteger 和 BigDecimal。这两个类可以处理包含任意长度数字序列的数值。BigInteger 类实现了任意精度的整数运算BigDecimal 实现了任意精度的浮点数运算。
使用静态的 valueOf 方法可以将普通的数值转换为大数值:
BigInteger a BigInteger.valueOf(100);遗憾的是大数运算不能使用人们熟悉的算术运算符处理大数。而需要使用大数类中的 add 和 multiply 方法:
public class Main {public static void main(String[] args) {BigInteger a BigInteger.valueOf(100);// b a 200BigInteger b a.add(BigInteger.valueOf(200));// c b * (b 300)BigInteger c b.multiply(b.add(BigInteger.valueOf(300)));System.out.println(a);System.out.println(b);System.out.println(c);}
}4、字符串
从概念上讲Java 字符串实际上是 Unicode 字符序列。例如字符串 “Java\u2122” 由五个 Unicode 字符 ‘J’、‘a’、‘v’、‘a’ 和 ‘™’ 组成。Java 并没有内置的字符串类型而是在标准 Java 类库中提供了一个预定义的类叫做 String。每个用双引号括起来的字符串都是 String 类的一个实例。
4.1、String 常见方法
Java 中的 String 类包含了 50 多个方法。令人惊讶的是绝大多数都很有用可以设想使用的频繁非常高。下面的 API 注释汇总了一部分最常用的方法:
| 方法名 | 方法说明
| --------------------------------------- |----------------------------------------------|
| length() | 返回字符串的长度
| charAt(int index) | 返回指定索引位置的字符
| equals(String s) | 比较此字符串与指定的对象是否相等
| equalsIgnoreCase(String s) | 将此 String 与另一个 String 比较不考虑大小写
| indexOf(String s) | 返回字串第一次出现的位置没出现则返回 -1
| lastIndexOf(String s) | 返回字串最后一次出现的位置没出现返回 -1
| starstWith(String prefix) | 测试此字符串是否以指定的前缀开始
| endsWith(String suffix) | 测试此字符串是否以指定的后缀结束
| toLowerCase() | 返回字符串的小写形式
| toUpperCase() | 返回字符串的大写形式
| substring(int startindex,int endindex) | 返回一个新的字符串它是此字符串的一个子字符串
| contains(String s) | 当且仅当此字符串包含指定的 char 值序列时返回 true
| replaceAll(String oldSrt,String newSrt) | 替换原有字符串中的字串为目标字串
| concat(String s) | 将指定字符串连接到此字符串的结尾
| split(String split) | 根据给定正则表达式的匹配拆分此字符串
| tirm() | 返回字符串的副本忽略前导空白和尾部空白
| getBytes() | 返回字符串的字节数组
| isEmpty() | 判断字符串是否为空
| tocharArray() | 将此字符串转换为一个新的字符数组
| hashCode() | 返回字符串的哈希值 |4.2、String 不可变
在 Java 中String 是不可变的String 类的源码:
public final class String{//用字符数组来存数值private final char value[];}虽然 String 是 final 类型的类且 value 也是 final 类型的数组但这不是 String 不可变的根本原因String 不可变是因为 value 是 private且并没有提供对外的 get 和 set。
由于 String 每次修改都会创建新的对象这在频繁修改时会导致效率低下和内存占用大。而 StringBuffer 和 StringBuilder 是可变的可以进行高效的字符串修改。 StringBuffer 和 StringBuilder 都是 AbstractStringBuilder 的子类使用数组存储字符串内容可以进行字符串内容的修改且不会因为修改而创建新的对象 StringBuffer 的方法使用了 synchronized 关键词因此它是线程安全的但效率略低于 StringBuilder StringBuilder 的方法没有使用 synchronized 关键词因此它在单线程环境下效率更高但在多线程环境下不能保证线程安全。
因此在需要频繁修改字符串的情况下应优先考虑使用 StringBuffer 或 StringBuilder。在多线程环境下应优先使用 StringBuffer 以保证线程安全。在单线程环境下可以使用 StringBuilder 以获得更高的效率。 5、数组
在 Java 中数组是一种数据结构用来存储同一类型值的集合。
5.1、数组声明与初始化
Java 数组需要在正确的声明和初始化后才能正常使用其声明的格式为: 数组类型[] 数组变量名称。而数组初始化是指在定义数组时只指定数组的长度由系统自动为元素赋初值的方式称作动态初始化。
在 Java 中数组的初始化有以下几种方式
// 动态初始化只指定数组的长度由系统自动为元素赋初值
// 在这个例子中arr 是一个长度为 4 的整型数组数组的元素会被自动初始化为 0
int[] arr new int[4];
// 静态初始化在定义数组时就指定数组的元素值
int[] arr new int[]{1, 2, 3, 4};
// 或者
int[] arr {1, 2, 3, 4}5.2、数组元素访问与赋值
通过一个整型下标可以访问数组中的每一个值其访问的格式为: 数组变量名称[下标整数]。例如如果 a 是一个整型数组我们想要访问 a 的下标为 i 的元素那就是: a[i]。
同样的当我们想要为数组下某元素进行赋值的时候也是通过指定整数下标完成的其格式为: 数组变量名称[下标整数] 值。
此外Java 数组还提供了一个 length 字段用以记录数组中的元素个数:
import java.util.Arrays;public class Solution {public static strictfp void main(String[] args) {int[] nums1 {1, 2, 5, 6};// 输出结果为 4System.out.println(nums1.length);}
}5.3、数组的常用方法
在 Java 中数组作为 Java 中的一种引用类型是有父类的java.lang.Object 就是数组的父类这是根据 Java 语言规范中的定义而来的根据规范所有数组类型都直接继承自 Object 类这是因为 Object 类是 Java 中所有类的根类所以所有的类包括数组类型都隐式地继承自 Object 类。
数组的继承关系并不意味着数组类型具有与其他类相同的特性或方法。数组是一种特殊的数据结构其操作和行为在很大程度上由 Java 语言本身定义。虽然数组继承了 Object 类的一些方法但它们也有一些特定于数组的行为和限制。
我们可以使用 java.util.Arrays 类对数组进行一些基本的操作Arrays 类中的方法都是静态方法可以直接使用类名进行调用。
5.3.1、Arrays.aslist()方法
Arrays.asList() 是一个 Java 的静态方法它可以把一个数组或者多个参数转换成一个 java.util.List 集合。这个方法可以作为数组和集合之间的桥梁方便我们使用集合的一些方法和特性。
Arrays.asList() 的语法格式如下以 int 类型为例: /*** 将数组转换为 List 集合** param srcArray 原数组* return 指定类型的 List 集合*/public static T ListT asList(T... srcArray) {...}这个方法接受一个泛型参数 T表示数组或者参数的类型。T 必须是一个引用类型不能是一个基本类型例如 int、double、char 等。
Arrays.asList() 返回的 List 是一个 Arrays 类的内部类它持有一个对原始数组的引用。这意味着对 List 的修改会反映到数组上反之亦然。但是这个 List 的大小是固定的不能进行增加或者删除的操作否则会抛出 java.lang.UnsupportedOperationException 异常。
Arrays.asList() 返回的 List 是可序列化的并且实现了 java.util.RandomAccess 接口表示它支持随机访问。
import java.util.Arrays;
import java.util.List;public class Solution {public static void main(String[] args) {Integer[] nums1 {1, 2, 3, 4};ListInteger list Arrays.asList(nums1);// 输出结果为 [1, 2, 3, 4]System.out.println(list);list.set(0, 0);// 输出结果为 [0, 2, 3, 4]System.out.println(Arrays.toString(nums1));nums1[1] 0;// 输出结果为 [0, 0, 3, 4]System.out.println(list);// 抛出 java.lang.UnsupportedOperationException 异常list.add(5);}
}5.3.2、Arrays.binarySearch()方法
Arrays.binarySearch() 是一个 Java 的静态方法它可以在数组中通过二分查找的方式找到指定元素的在数组中的下标如果没找到就返回 -1。
Arrays.binarySearch() 的格式定义如下以 int 类型为例: /*** 查找元素* param srcArray 源数组* param key 指定查询元素* return 查询元素所在的下标没有则返回 -1*/public static int binarySearch(int[] srcArray, int key){...}/*** 在指定范围内查找元素* param srcArray 源数组* param fromIndex 查找起始索引位置* param toIndex 查找终止索引位置不包括索引值本身* param key 查询元素* return 查询元素所在的下标没有则返回 -1*/public static int binarySearch(int[] srcArray, int fromIndex, int toIndex, int key) {...}5.3.3、Arrays.copyOf()方法
Arrays.copyOf() 是一个 Java 的静态方法它将返回一个新的数组对象。
Arrays.copyOf() 的格式定义如下以 int 类型为例: /*** 数组复制* param srcArray 源数组* param newLength 新数组长度* return 新数组*/public static T T[] copyOf(T[] srcArray, int newLength) {...}使用这种方法复制数组时默认从原数组的第一个元素索引值为 0开始复制目标数组的长度将为 newLength。如果 newLength 大于 srcArray.length则目标数组中采用默认值填充如果 newLength 小于 srcArray.length则复制到第 newLength 个元素索引值为 newLength-1即止。
import java.util.Arrays;public class Solution {public static void main(String[] args) {int[] nums1 {1, 2, 3, 4};int[] arr2 Arrays.copyOf(nums1, 3);// 打印结果为: [1, 2, 3]System.out.println(Arrays.toString(arr2));int[] arr3 Arrays.copyOf(nums1, 5);// 打印结果为 [1, 2, 3, 4, 0]System.out.println(Arrays.toString(arr3));}
}5.3.4、Arrays.copyOfRange()方法
Arrays.copyOfRange() 是一个 Java 的静态方法它是 Arrays 类中除的 Arrays.copyOf() 方法外的另一种复制数组的方法。
Arrays.copyOfRange() 的格式定义如下以 int 类型为例: /*** 数组复制* param srcArray 源数组* param startIndex 开始复制的起始索引* param endIndex 完成复制的结束索引不包括索引值本身* return 新数组*/public static T T[] copyOfRange(T[] srcArray, int startIndex, int endIndex) {...}其中startIndex 必须在 0 到 srcArray.length 之间endIndex 必须大于等于 startIndex可以大于 srcArray.length如果大于 srcArray.length则目标数组中使用默认值填充。
5.3.5、Arrays.equals()方法
Arrays.equals() 是一个 Java 的静态方法用以比较数组内容是否相等如果相等返回 true否则返回 false。
Arrays.equals() 的格式定义如下以 int 类型为例: /*** 比较两个数组是否相等* param a1 数组1* param a2 数组2* return 是否相等 true/false*/public static boolean equals(int[] a1, int[] a2)Java 中的 Arrays.equals 方法设计用于比较一维数组。对于二维数组它会将整个数组对象进行比较而不会逐个比较数组中的元素。如果需要比较二维数组的内容可能需要使用其他方法比如使用嵌套循环逐个比较数组元素。
5.3.6、Arrays.fill()方法
Arrays.fill() 是一个 Java 的静态方法它允许我们填充一个数组的所有元素将它们设置为指定的值。
Arrays.fill() 的格式定义如下以 int 类型为例: /*** 填充数组中的全部元素* param srcArray 源数组* param val 填充的元素值*/public static void fill(int[] srcArray, int val) {...}/*** 填充数组中指定范围的全部元素* param srcArray 源数组* param fromIndex 填充范围的起始索引* param toIndex 填充范围的结束索引不包括索引值本身* param val 填充的元素值*/public static void fill(int[] srcArray, int fromIndex, int toIndex, int val) {...}5.3.7、Arrays.sort()方法
Arrays.sort() 是一个 Java 的静态方法它的作用是给数组排序默认是升序的。
Arrays.sort() 的格式定义如下以 int 类型为例: /*** 数组中的全部元素排序升序* param srcArray 源数组*/public static void sort(int[] srcArray) {...}/*** 数组中指定范围的元素排序升序* param srcArray 源数组* param fromIndex 范围排序的起始索引* param toIndex 范围排序的结束索引不包括索引值本身*/public static void sort(int[] srcArray, int fromIndex, int toIndex){...}5.3.8、Arrays.toString()方法
Arrays.toString() 是一个 Java 的静态方法用于将数组转换为字符串可以快速的输出数组的内容。
Arrays.toString() 的格式定义如下以 int 类型为例: /*** 将数组转换为字符串形式* param srcArray 源数组* return 字符串形式的数组*/public static String toString(int[] srcArray){...}5.4、多维数组
在 Java 中多维数组是使用多个下标来访问数组元素的它适用于表示表格或更复杂的排列形式。
以下是二维数组的定义格式
指定行和列的长度
// 在这个例子中arr 是一个 3x4 的二维数组即二维数组的行数为 3每一行的列数为 4。
int[][] arr new int[3][4];只指定行的长度
// 在这个例子中arr 是一个二维数组二维数组的行数为 3每一行的列数不确定需要单独为每一行分配内存。
int[][] arr new int[3][];直接指定所有元素的值
// 在这个例子中arr 是一个二维数组二维数组中定义了三个元素这三个元素都是数组分别为 {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 个大的内存空间每一个大内存空间里又开辟了连续的两个小的内存空间。