黑马Java基础笔记-3
短路逻辑运算符与逻辑运算符
逻辑运算符
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与(且) | 并且,两边都为真,结果才是真 |
| | 逻辑或 | 或者,两边都为假,结果才是假 |
^ | 逻辑异或 | 相同为 false,不同为 true |
! | 逻辑非 | 取反 |
短路逻辑运算符(原来还有这个)
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 结果和 & 相同,但是有短路效果 |
|| | 短路或 | 结果和 | 相同,但是有短路效果 |
相比与逻辑运算符他在执行第一个条件判断如果通过就不会执行后续的判断,可以优化性能
switch新特性
int number = 1;
switch(number){case 1:System.out.println("一”); break;case 2:System.out.println("二");break;
case 3:system.out.println("number的值为2”);break;
default :system.out.println("number的值不是1,10或者20”);// break;}
可以将原样式修改成如下格式来简化书写break;不会造成case穿透
int number = 1;
switch (number) {case 1 -> System.out.println("一");//当执行逻辑只有一行的时候可以省略大括号case 2 -> {System.out.println("二");//这样可以简化书写break}case 3 -> System.out.println("三");default -> System.out.println("没有这种选项");
}
无限循环
// 1. for 循环
for (;;) {System.out.println("学习");
}
// 2. while 循环
while (true) {System.out.println("学习");
}
// 3. do-while 循环
do {System.out.println("学习");
} while (true);
数组
静态初始化
完整格式
int[] arr = new int[]{1,2,3,4}
简化格式
int[] arr = {1,2,3,4}
动态初始化
int[] arr = new int[3];
初始化时只指定数组长度,由系统为数组分配初始值。
整数类型:默认初始化值0
小数类型:默认初始化值0.0
字符类型:默认初始化值’/u0000’空格
布尔类型:默认初始化值false
引用数据类型:默认初始化值null
地址值
doub1e[]arr6={1.93,1.75,1.73,1.81};
system.out.println(arr6);//[D@776ec8df
地址值
扩展:解释一下地址值的格式含义
[D@776ec8df
[ : 表示当前是一个数组
D : 表示当前数组里面的元素都是double类型的
@ : 表示一个间隔符号。(固定格式)
776ec8df : 才是数组真正的地址值,(十六进制)
平时我们习惯性的会把这个整体叫做数组的地址值。
java内存分配
java7及以下内存分配
java8及以上内存分配
- 栈
方法运行时使用的内存,比如 main 方法运行时进入方法栈中执行。 - 堆
存储对象或者数组,用new
创建的对象都存储在堆内存。 - 方法区
存储可运行的 class 文件。 - 本地方法栈
VM 在使用操作系统功能时使用,与我们开发无关。 - 寄存器
给 CPU 使用,与我们开发无关。
栈和堆概览
1. 只要是new出来的一定是在堆里面开辟了一个小空间
2. 如果new了多次,那么在堆里面有多个小空间,每个小空间中都有各自的数据
数组的内存图
普通的变量存储的真是的数据
而数组记录的是一个地址值:
*sout(arr)*打印出来是就是这个数组存在堆内存的地址值
通过数组的索引可以获取到这个数组索引位置的具体值
这两者可以囊括为基本数据类型和引用数据类型
### 总结
- 普通变量(如
int i = 10;
)存储的是实际数据值- 对于 Java 的基本数据类型(int、double、boolean 等),变量本身就是存储在栈中的“值”。
- 数组(以及其他对象)在栈中存储的是引用(Reference),对象本身存储在堆中
int[] arr = new int[2];
中的arr
是一个引用,指向实际的数组对象,这个数组对象分配在堆中。- 当我们
sout(arr)
时,打印的是对象的“类型+哈希值”形式(类似[I@1b6d3586
),它并不是真正的物理内存地址,但可以理解为“引用的字符串形式”。
- 通过
arr[索引]
可以获取到堆中数组对象某个索引位置的真实数据- 也就是说,
arr
本身不直接存放数组内容,它只是一个指针/引用,真正的数据放在堆中的数组对象里。
- 也就是说,
需要注意的几点补充
- Java 中打印的并不是真实物理地址
Java 层面并不会直接暴露物理地址,而是通过对象的哈希值、类型信息等拼接而成的字符串,这只是为了区分不同对象的“标识符”,并不代表内存的真实位置。 - 引用是语言层面的概念
虽然我们常说“在栈里存的是对象的地址”,但更准确地说,这个“地址”是 Java 虚拟机给对象分配的引用(Reference),并不等同于指针在底层的实际内存地址。 - 基本数据类型 VS 引用类型
- 基本数据类型(
int
,double
,boolean
等)变量里直接存储值本身。 - 引用类型(
数组
,String
, 以及自定义类的对象等)变量里存储的是引用,实际对象放在堆内存。
- 基本数据类型(
两个数组指向同一个内存地址
int [] arr2 = arr1;