java基础-细节-重点

基本数据类型

  • 整数类型:byte、short、int、long (1,2,4,8)
  • 浮点数类型:float、double (4,8)
  • 字符类型:char (2)
  • 布尔类型:boolean (1/8,1bit)

整型

  • byte:-128 ~ 127
  • short: -32768 ~ 32767
  • int: -2147483648 ~ 2147483647
  • long: -9223372036854775808 ~ 9223372036854775807
存储原理

计算机中整数一律采用补码的形式存储,读取时需要将补码转换为原码。

  • 原码:一个数的二进制形式。
  • 反码:正负数区别对待,正数的反码就是原码,负数的反码就是将原码中除符号位以外的所有位(数值位)取反。
  • 补码:正负数区别对待,正数的补码也是原码,负数的补码时其反码加1。
整数运算
  • 溢出:超出范围就会产生溢出,溢出不会报错。
  • 移位运算:<<1 等价于 x2,>>1 等价于 ÷2 。
  • 位运算:与&、或|、非~、异或^。
  • 类型自动提示与强制转型

注意:

  1. long类型需要在数的后面加“L”。
  2. 位数过大的数可用下划线“_”进行分隔,1_000_000_000。
  3. 表示不同进制的整数:0x前缀表示十六进制,0前缀表示八进制,0b前缀表示二进制。

浮点型

  • float的范围为-2^128 ~ +2^127,也即-3.40E+38 ~ +3.40E+38;
  • double的范围为-2^1024 ~ +2^1023,也即-1.79E+308 ~ +1.79E+308。
浮点数的存储原理

s表示符号位,M表示尾数,E表示阶码。
V = ( − 1 ) S ✖ 1. M ✖ 2 E − 127 V = (-1)^S ✖ 1.M ✖ 2^{E-127} V=(1)S1.M2E127

  • 单精度浮点数:32位,最高位保存s,中间8位保存E,最后23位保存M。

  • 双精度浮点数:64位,最高位保存s,中间11位保存E,最后52位保存M。

浮点数运算
  • 溢出:整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错,但会返回几个特殊值:
    • NaN表示Not a Number(0.0/0)
    • Infinity表示无穷大
    • -Infinity表示负无穷大

注意:

  1. float类型需要在后面加上“f”后缀。
  2. 在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。
  3. 强制转型为整数时会截断小数部分。(如果想四舍五入的话可以加上0.5再强制转型)

布尔类型

  • true
  • false

理论上存储布尔类型只需要1bit,但是通常JVM内部会把boolean表示为4字节整数。

布尔运算

关系运算符的优先级从高到低依次是:

  • !
  • >>=<<=
  • ==!=
  • &&
  • ||
短路运算

&& 和 || 在计算第一个表达式时如果没有满足条件就会放弃执行第二个表达式。

字符类型

Java的char类型除了可表示标准的ASCII外,还可以表示Unicode字符。

还可以直接用转义字符\u+Unicode编码来表示一个字符。

  • **Unicode字符集:**Unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

  • utf-8编码规则:UTF-8 就是使用变长字节表示,字节数可变,这个变化与Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从 1 到 4 个不等。

字符串类型

字符串类型是引用类型。一个字符串可以存储0个到任意个字符。

字符串连接:"+"。

多行字符串:Java13开始,可以使用"""……"""表示多行字符串,每行前面共同的空格会被去掉。

不可变特性

字符串的内容不可变,当再次赋值时,字符串变量只是更换一个指向,原来指向的字符串并没有消失。

常见的转义字符包括:

  • \" 表示字符"
  • \' 表示字符'
  • \\ 表示字符\
  • \n 表示换行符
  • \r 表示回车符
  • \t 表示Tab
  • \u#### 表示一个Unicode编码的字符

引用类型

类似C语言的指针,内部存储一个“地址“,指向某个对象在内存的位置。

空值null

引用类型的变量可以指向一个空值null,它表示不存在,即该变量不指向任何对象,空值不是""。

常量

定义变量时,加上final修饰符,该变量就变成了常量,初始化后不能再赋值。

根据习惯,常量名通常全部大写。

var关键字

java10新特性,可以省略变量类型。

不过有三点要求:

  1. 只能用于局部变量上;
  2. 声明时必须初始化;
  3. 不能用作方法参数。

变量的作用域

定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。

数组类型

  • 数组也是引用类型,再次赋值情况与字符串相同。

  • 数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false

  • 数组一旦创建后,大小就不可改变。

输入和输出

格式化输出

通过使用占位符%?printf()可以把后面的参数格式化成指定格式。

System.out.printf("%.2f\n", d); // 显示两位小数3.14

占位符说明
%d格式化输出整数
%x格式化输出十六进制整数
%f格式化输出浮点数
%e格式化输出科学计数法表示的浮点数
%s格式化字符串

连续两个%%表示一个%字符本身。

输入

Java提供Scanner对象来方便输入,读取对应的类型可以使用:scanner.nextLine() / nextInt() / nextDouble()

switch

从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要break语句。

    switch (fruit) {
    case "apple" -> System.out.println("Selected apple");
    case "pear" -> System.out.println("Selected pear");
    case "mango" -> {
        System.out.println("Selected mango");
        System.out.println("Good choice!");
    }
    default -> System.out.println("No fruit selected");
    }

还可以作为表达式直接返回值:

    int opt = switch (fruit) {
        case "apple" -> 1;
        case "pear", "mango" -> 2;
        default -> 0;
    }; // 注意赋值语句要以;结束
yield

如果需要复杂的语句,可以写很多语句,放到{...}里,然后,用yield返回一个值作为switch语句的返回值。(Java14)

default -> {
                int code = fruit.hashCode();
                yield code; // switch语句返回值
            }

for each 循环

访问数组每个元素的值。

    int[] ns = { 1, 4, 9, 16, 25 };
    for (int n : ns) {
        System.out.println(n);
    }

命令行参数

Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。

这个命令行参数由JVM接收用户输入并传给main方法:

比如:

public class Main {
    public static void main(String[] args) {
        for (String arg : args) {
            if ("-version".equals(arg)) {
                System.out.println("v 1.0");
                break;
            }
        }
    }
}
$ javac Main.java
$ java Main -version
v 1.0
<think>好的,用户现在问的是Java入门中的数组基础。我需要先回想一下之前的对话历史,用户之前问过关于IDEA的解释,现在转向Java基础,说明他们可能刚开始学习编程,或者是想巩固基础知识。首先,用户的需求是了解数组的基础知识,作为Java入门的一部分。我需要确保内容结构清晰,符合用户提到的系统级指令,比如行内数学公式用$...$,独立公式用$$...$$,同时用中文回答。 首先,数组是Java中的基本数据结构,必须涵盖定义、声明、初始化、访问元素、遍历、多维数组、常见操作以及注意事项。可能需要分点来讲解,每个部分都要简明扼要,同时确保例子正确,语法无误。比如在声明数组的时候,有两种方式:数据类型[] 数组名 或者 数据类型 数组名[],但推荐前者。初始化部分要分静态和动态,静态初始化是在声明时赋值,动态是使用new关键字,之后赋值。 需要注意Java数组的索引从0开始,越界会抛异常,这点很重要。遍历部分可以用for循环或增强for循环,需要给出例子。多维数组部分,特别是二维数组,需要说明如何声明和初始化,并给出例子,比如二维数组的静态和动态初始化。 常见操作部分,用户可能需要知道如何获取长度,使用Arrays类的方法,比如排序、填充、复制等。注意事项里,数组长度不可变,引用类型的问题,以及性能考虑,比如连续内存分配和随机访问效率高,但增删元素效率低。这些都需要清晰列出。 另外,用户可能作为初学者,需要避免常见的错误,比如数组越界、空指针异常,这些在注意事项里提到会比较有帮助。同时,可能需要强调数组是对象,存储在堆内存中,而数组变量是引用,这点对于理解数组的传递和复制很重要。 还要检查是否有需要使用的数学公式,比如在解释数组长度时,可能用$length = n$,或者在多维数组中的表示,比如二维数组可以看作矩阵,用$array[i][j]$表示元素。不过根据之前的回答例子,可能不需要太多数学公式,但需要确保行内公式正确使用$符号。 最后,确保结构符合用户的要求,分点明确,步骤清晰,例子正确,并且用中文回答。同时,要检查是否有遗漏的部分,比如数组的默认值,当动态初始化时,元素会有默认值,比如int数组初始为0,对象数组为null,这也是需要注意的点。</think>我们将以结构化方式解析Java数组的核心知识点,重点标注$\boxed{关键语法}$和易错点: --- ### 一、数组定义与特性 $$数组 = \text{相同数据类型} \times \text{连续内存空间} \times \text{固定长度}$$ - **核心属性**: 1. 索引系统:$\boxed{下标从0开始}$,访问越界触发`ArrayIndexOutOfBoundsException` 2. 长度固定:$\boxed{array.length}$为最终属性(声明后不可变) 3. 堆内存分配:数组是$\boxed{对象}$,通过引用访问 --- ### 二、声明与初始化 #### 1. 声明方式对比 | 类型 | 语法示例 | 内存状态 | |---------------|---------------------------|-------------| | 声明未初始化 | `int[] arr;` | 仅创建引用 | | 静态初始化 | `int[] arr = {1,3,5};` | 立即分配内存 | | 动态初始化 | `int[] arr = new int[3];` | 分配默认值 | #### 2. 默认值规则 - 数值类型:$\boxed{0}$(int/double等) - 布尔类型:$\boxed{false}$ - 引用类型:$\boxed{null}$ --- ### 三、核心操作 #### 1. 元素访问(时间复杂度$O(1)$) ```java int[] scores = new int[]{90,85,77}; System.out.println(scores[1]); // 输出85 scores[2] = 80; // 修改第三个元素 ``` #### 2. 数组遍历(时间复杂度$O(n)$) ```java // 传统for循环 for(int i=0; i < scores.length; i++){ System.out.println(scores[i]); } // 增强for循环(只读访问) for(int score : scores){ System.out.println(score); } ``` --- ### 四、多维数组 #### 1. 二维数组本质:$\boxed{数组的数组}$ ```java // 静态初始化 int[][] matrix = {{1,2}, {3,4,5}}; // 动态初始化 double[][] data = new double[2][3]; ``` #### 2. 不规则数组 ```java String[][] names = new String[2][]; names[0] = new String[3]; // 第一行3列 names[1] = new String[2]; // 第二行2列 ``` --- ### 五、工具类应用 #### `java.util.Arrays`常用方法 | 方法 | 功能描述 | 示例 | |------------------------|------------------------|--------------------------------| | `sort()` | 数组排序 | `Arrays.sort(arr);` | | `binarySearch()` | 二分查找 | `Arrays.binarySearch(arr,5);` | | `copyOf()` | 数组复制 | `int[] copy = Arrays.copyOf(arr,5);` | | `fill()` | 填充默认值 | `Arrays.fill(arr, 0);` | --- ### 六、典型错误案例 1. **长度混淆**: ```java int[] arr = new int[5]; System.out.println(arr[5]); // 抛出ArrayIndexOutOfBoundsException ``` 2. **空指针异常**: ```java int[][] arr = new int[3][]; System.out.println(arr[0][0]); // 第二维未初始化,触发NullPointerException ``` 3. **引用陷阱**: ```java int[] a = {1,2,3}; int[] b = a; // b与a指向同一数组对象 b[0] = 9; // 修改会影响a[0]的值 ``` --- ### 七、最佳实践建议 1. **内存优化**:优先使用基本类型数组而非包装类数组 2. **防御性编程**:关键操作前检查`array != null && index < array.length` 3. **集合替代**:频繁增删数据时建议使用`ArrayList` 是否需要通过具体代码案例进一步演示数组操作细节
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值