java基础语法整理 -----下

java基础语法整理

  • 一、数组
  • 二、面向对象
  • 三、字符串
    • 1.String常见成员方法
    • 2.使用小案例
      • 用户登录案例
      • 遍历字符串案例
      • 统计字符次数案例
      • 字符串拼接案例
      • 手机号屏蔽
  • 四、集合

链接: java基础语法整理 -----上

一、数组

1.从概念谈起

  1. 概念:指的是一种容器,可以同来存储同种数据类型的多个值。但是数组容器在存储数据的时候,需要结合隐式转换考虑。
  2. 比如
    • 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的,
    • 但是byte类型,short类型,int类型的数据是可以存到这个数组里面的。
  3. 建议:容器的类和存储的数据类型保持一致。
  4. 举例:
    • 整数1 2 3 4 56 就可以使用int类型的数组来存储。
    • 小数1.1 1.2 1.3 1.4 就可以使用double类型的数组来存储。
    • 字符串"aaa" “bbb” “ccc” 就可以使用String类型的数组来存储。

2.数组的静态初始化

  1. 完整格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4…};
    int[] arr = new int[]{11,22,33};double[] arr = new double[]{1.1,1.2,1.3};
    
  2. 格式详解
    • 数据类型: 限定了数组以后能存什么类型的数据
    • 方括号:表示现在定义的是一个数组
    • 数组名:其实就是名字而已,方便以后使用,在起名字的时候遵循小驼峰命名法
    • new:就是给数组在内存中开辟了一个空间
    • 数据类型:限定了数组以后能存什么类型的数据。前面和后面的数据类型一定要保持一致。
    • 方括号:表示现在定义的是一个数组。
    • 大括号:表示数组里面的元素。元素也就是存入到数组中的数据。多个元素之间,一定要用逗号隔开。
  3. 错误写法
int[] arr = new double[]{11,22,33};
  1. 注意点:
    • 等号前后的数据类型必须保持一致
    • 数组一旦创建之后,长度不能发生变化
  2. 简化格式:数据类型[] 数组名 = {元素1,元素2,元素3,元素4…};

3。地址值

int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@6d03e736double[] arr2 = {1.1,2.2,3.3};
System.out.println(arr2);//[D@568db2f2
  • 打印数组的时候,实际出现的是数组的地址值
  • 数组的地址值:就表示数组在内存中的位置
  • 以[I@6d03e736为例:
    • [ :表示现在打印的是一个数组。
    • I:表示现在打印的数组是int类型的。
    • @:仅仅是一个间隔符号而已。
    • 6d03e736:就是数组在内存中真正的地址值。(十六进制的)

4.数组元素的访问

  1. 格式:数组名[索引];
  2. 作用
    • 获取数组中对应索引上的值
    • 修改数组中对应索引上的值
  3. 代码示例
public class ArrDemo {/*数组中元素访问的格式:数组名[索引];作用:1.获取指定索引上对应的元素2.修改指定索引上对应的元素*/public static void main(String[] args) {int[] arr = {1,2,3,4,5};// 需求:获取arr数组中,3索引上的值int number = arr[3];System.out.println(number);System.out.println(arr[3]);// 需求:将arr数组中,3索引上的值修改为10arr[3] = 10;System.out.println("修改之后为:" + arr[3]);}
}

5.索引

  1. 索引也叫角标、下标。就是数组容器中每一个小格子对应的编号。
  2. 索引的特点
    • 索引一定是从0开始的
    • 连续不间断
    • 逐个+1增长

6.数组的遍历

  • 遍历:就是把数组里面所有的内容一个一个全部取出来。
  • 数组的长度:数组名.length;
  • 通用代码
    for(int i = 0; i < arr.length; i++){// 在循环的过程中,i依次表示数组中的每一个索引sout(arr[i]); // 就可以把数组里面的每一个元素都获取出来,并打印在控制台上了。
    }
    

7.数组的动态初始化

  1. 格式:数据类型[] 数组名 = new 数据类型[数组的长度];
  2. 举例
    // 1.定义一个数组,存3个人的年龄,年龄未知
    int[] agesArr = new int[3];// 2 .定义一个数组,存班级10名学生的考试成绩,考试成绩暂时未知,考完才知道。
    int[] scoresArr = new int[10];
    
  3. 数组的默认初始化值:
    • 整数类型:0
    • 小数类型:0.0
    • 布尔类型:false
    • 字符类型:‘\u0000’
    • 引用类型:null

8.数组两种初始化方式的区别

  • 静态初始化:int[] arr = {1,2,3,4,5};

  • 动态初始化:int[] arr = new int[3];

  • 静态初始化:手动指定数组的元素,系统会根据元素的个数,计算出数组的长度。

  • 动态初始化:手动指定数组长度,由系统给出默认初始化值。

  1. 使用场景
    • 只明确元素个数,但是不明确具体的数据,推荐使用动态初始化。
    • 已经明确了要操作的所有数据,推荐使用静态初始化。
  2. 举例
  • 使用数组来存储键盘录入的5个整数。

    nt[] arr = new int[5];
    
  • 将全班的学生成绩存入数组中,已知学生成绩为:66,77,88,99,100

    int[] arr = new int[5];arr[0] = 66;arr[1] = 77;... 虽然可以实现,但是太麻烦了。建议使用静态初始化:int[] arr = {66,77,88,99,100};
    

9.数组常见问题

  • 当访问了数组中不存在的索引,就会引发索引越界异常。
  • 避免:
    ​ + 针对于任意一个数组,索引的范围:
    • 最小索引:0
    • 最大索引:数组的长度 - 1,数组名.length - 1
public class ArrDemo6 {public static void main(String[] args) {int[] arr = {1,2,3,4,5,5,5,5,5};//用索引来访问数组中的元素System.out.println(arr[1]);System.out.println(arr[10]);//ArrayIndexOutOfBoundsException}
}

二、面向对象

  1. 什么是面向对象:面向对象是一种设计思想,当我们在代码中想要做一件事情的时候,我们不会自己做,可以想,谁可以干这件事情,谁能干,就让谁去干,我们忽略过程,只注重结果
  • 举例一:当我们想要获取一个随机数,我们不需要自己写随机算法,我们想Java中已经定义好了一个类Random可以做这件事情,那么就让Random去做,我们不关心他是如何写随机算法的,只关注最终结果即可
  • 举例二:当我们想要获取键盘上输入的数字时,我们不需要去写,发现键盘,配对键盘,连接键盘,组合按键,验证数据,监控键盘,扫描键盘,获取数据这些代码,我们想Java中已经定义好了一个类Scanner可以做这件事情,那么就让Scanner去做,我们不关心他是如何跟键盘之间发生关系的,只关注最终的结果即可

  1. 面向对象到底学什么
    • 学习获取已有对象并使用
    • 学习如何自己设计对象并使用

  1. 面向对象中的两个核心思想
      • 类是对现实生活中一类具有共同属性和行为的事物的抽象
      • 简单理解:类就是对现实事物的一种描述
      • 类的组成
        • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
        • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)
    • 类和对象的关系
      • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
      • 对象:是能够看得到摸的着的真实存在的实体
      • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

  1. 标准JavaBean类

用来描述一类事物的类叫做Javabean类,带有main方法的类叫做测试类

标准类制作:

  • 类名需要见名知意
  • 成员变量使用private修饰
  • 提供至少两个构造方法
    • 无参构造方法
    • 带全部参数的构造方法
  • get和set方法:提供每一个成员变量对应的setXxx()/getXxx()
  • 如果还有其他行为,也需要写上

三、字符串

  1. String的概述:String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!
  2. String类的特点
    • 字符串不可变,它们的值在创建后不能被更改
    • 虽然 String 的值是不可变的,但是它们可以被共享
    • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )
  3. 获取字符串对象的方式
    • 构造方法
    • 直接赋值
方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符串对象
String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc

示例代码:

public class StringDemo {public static void main(String[] args) {// public String():创建一个空白字符串对象,不含有任何内容String s1 = new String();System.out.println("s1:" + s1);// public String(char[] chs):根据字符数组的内容,来创建字符串对象char[] chs = {'a', 'b', 'c'};String s2 = new String(chs);System.out.println("s2:" + s2);// public String(byte[] bys):根据字节数组的内容,来创建字符串对象byte[] bys = {97, 98, 99};String s3 = new String(bys);System.out.println("s3:" + s3);// String s = “abc”;	直接赋值的方式创建字符串对象,内容就是abcString s4 = "abc";System.out.println("s4:" + s4);}
}
  1. 两种方式的区别
    • 通过构造方法创建:通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
    • 直接赋值方式创建:以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

1.String常见成员方法

1.字符串的比较

  1. ==号的作用
    • 比较基本数据类型:比较的是具体的值
    • 比较基本数据类型:比较的是具体的值
  2. equals方法的作用
    • 方法介绍
    // 比较两个字符串内容是否相同、区分大小写
    public boolean equals(String s)     
    
    • 示例代码
    public class StringDemo {public static void main(String[] args) {// 构造方法的方式得到对象char[] chs = {'a', 'b', 'c'};String s1 = new String(chs);String s2 = new String(chs);// 直接赋值的方式得到对象String s3 = "abc";String s4 = "abc";// 比较字符串对象地址是否相同System.out.println(s1 == s2);System.out.println(s1 == s3);System.out.println(s3 == s4);System.out.println("--------");// 比较字符串内容是否相同System.out.println(s1.equals(s2));System.out.println(s1.equals(s3));System.out.println(s3.equals(s4));}
    }
    

2.使用小案例

用户登录案例

需求:已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示

public class Test1 {public static void main(String[] args) {// 1.定义两个变量用来记录正确的用户名和密码String rightUsername = "Andy";String rightPassword = "123456";//2.键盘录入用户名和密码for (int i = 0; i < 3; i++) {//0 1 2Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");String username = sc.next();System.out.println("请输入密码");String password = sc.next();// 3.判断比较if (username.equals(rightUsername) && password.equals(rightPassword)) {System.out.println("登录成功");// 如果正确,循环结束break;} else {// 最后一次机会if(i == 2){System.out.println("账户" + username + "被锁定,请联系管理员");}else{// 不是最后一次机会System.out.println("用户名或密码错误,登录失败,还剩下" + (2 - i) + "次机会");//2 1 0}}}}
}

遍历字符串案例

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

public class Test2 {public static void main(String[] args) {// 1.键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入字符串");String str = sc.next();System.out.println(str);// 2.遍历for (int i = 0; i < str.length(); i++) {// i 依次表示字符串的每一个索引// 索引的范围:0 ~  长度-1// 根据索引获取字符串里面的每一个字符char c = str.charAt(i);System.out.println(c);}}
}

统计字符次数案例

需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

public class Test3 {public static void main(String[] args) {// 1.键盘录入一个字符串Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串");String str = sc.next();// 2.统计 --- 计数器count// 此时我要统计的有3样东西,所以要定义3个计数器分别进行统计int bigCount = 0;int smallCount = 0;int numberCount = 0;//得到这个字符串里面每一个字符for (int i = 0; i < str.length(); i++) {// i 表示字符串中的索引// c 表示字符串中的每一个字符char c = str.charAt(i);// 对c进行判断if (c >= 'a' && c <= 'z') {smallCount++;}else if(c >= 'A' && c <= 'Z'){bigCount++;}else if(c >= '0' && c <= '9'){numberCount++;}}// 3.当循环结束之后,三个变量记录的就是对应的个数System.out.println("大写字符有:" + bigCount + "个");System.out.println("小写字符有:" + smallCount + "个");System.out.println("数字字符有:" + numberCount + "个");}
}    

字符串拼接案例

需求:定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果。例如,数组为 int[] arr = {1,2,3}; ,执行方法后的输出结果为:[1, 2, 3]

public class Test4 {public static void main(String[] args) {// 定义一个方法,把 int 数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,// 并在控制台输出结果。例如,数组为 int[] arr = {1,2,3};// 执行方法后的输出结果为:[1, 2, 3]int[] arr = {1, 2, 3, 4, 5};String str = arrToString(arr);System.out.println(str);}// 作用:把一个数组变成字符串public static String arrToString(int[] arr) {String s = "";// 拼接左括号s = s + "["; // 拼接内容for (int i = 0; i < arr.length; i++) {if(i == arr.length - 1){// 如果是最后一个元素,那么不需要拼接逗号空格s = s + arr[i];}else{// 如果不是最后一个元素,需要拼接元素和逗号空格s = s + arr[i] + ", ";}}// 等循环结束之后,再拼接最后一个右括号s = s + "]";return s;}// 用来遍历数组public static void printArr(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length; i++) {if (i == arr.length - 1) {System.out.print(arr[i]);} else {System.out.print(arr[i] + ", ");}}System.out.println("]");}
}

手机号屏蔽

需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽最终效果为:137****8888

public class Test5 {public static void main(String[] args) {// 1.键盘录入一个手机号码Scanner sc = new Scanner(System.in);System.out.println("请输入手机号码");String phoneNumber = sc.next();// 2.截取手机号码中的前三位String star = phoneNumber.substring(0, 3);// 3.截取手机号码中的最后四位// 此时我用substring方法,是用1个参数的,还是两个参数的?1个参数的会更好// 因为现在我要截取到最后,所以建议使用1个参数的。String end = phoneNumber.substring(7);//4.拼接String result = star + "****" + end;System.out.println(result);}
}

四、集合

  1. 集合和数组的优势对比:
    • 长度可变
    • 添加数据的时候不需要考虑索引,默认将数据添加到末尾
  2. ArrayList类概述
    • 什么是集合:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
    • ArrayList集合的特点:长度可以变化,只能存储引用数据类型
    • 泛型的使用:用于约束集合中存储元素的数据类型
  3. ArrayList的常用构造方法
方法名说明
public ArrayList()创建一个空的集合对象
  1. ArrayList的常用成员方法
方法名说明
public boolean add(要添加的元素)将指定的元素追加到此集合的末尾
public boolean remove(要删除的元素)删除指定元素,返回值表示是否删除成功
public E remove(int index)删除指定索引处的元素,返回被删除的元素
public E set(int index,E element)修改指定索引处的元素,返回被修改的元素
public E get(int index)返回指定索引处的元素
public int size()返回集合中的元素的个数
  1. 示例代码
public class ArrayListDemo {public static void main(String[] args) {// 创建集合ArrayList<String> array = new ArrayList<String>();// 添加元素array.add("hello");array.add("world");array.add("java");// public boolean remove(Object o):删除指定的元素,返回删除是否成功//        System.out.println(array.remove("world"));//        System.out.println(array.remove("javaee"));// public E remove(int index):删除指定索引处的元素,返回被删除的元素//        System.out.println(array.remove(1));// IndexOutOfBoundsException//        System.out.println(array.remove(3));// public E set(int index,E element):修改指定索引处的元素,返回被修改的元素//        System.out.println(array.set(1,"javaee"));// IndexOutOfBoundsException//        System.out.println(array.set(3,"javaee"));// public E get(int index):返回指定索引处的元素//        System.out.println(array.get(0));//        System.out.println(array.get(1));//        System.out.println(array.get(2));// System.out.println(array.get(3)); //?????? 自己测试// public int size():返回集合中的元素的个数System.out.println(array.size());// 输出集合System.out.println("array:" + array);}
}

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

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

相关文章

MySQL与PostgreSQL关键对比四(关联查询性能)

引言&#xff1a;MySQL单表的数据规模一般建议在百万级别&#xff0c;而PostgreSQL的单表级别一般可以到亿级&#xff0c;如果是MPP版本就会更多。从基础数据建议上&#xff0c;不难看出&#xff0c;MySQL在Join的情况下也就是主要查询的情况下性能和PostgreSQL相差还是很大的。…

Vue35-生命周期小结

一、8个&#xff0c;4对生命周期函数 第一对&#xff1a;数据监测、数据代理&#xff0c;创建之前和创建之后。 注意&#xff1a;不是vm的创建&#xff01;&#xff01;&#xff01; 第二队&#xff1a;beforeMount和mounted 第三队&#xff1a;beforeUpdate和update 第四队…

ElasticSearch的桶聚合

桶聚合 在前面几篇博客中介绍的聚合指标是指符合条件的文档字段的聚合,有时还需要根据某些维度进行聚合。例如在搜索酒店时,按照城市、是否满房、标签和创建时间等维度统计酒店的平均价格。这些字段统称为“桶”,在同一维度内有一个或者多个桶。例如城市桶,有“北京”、“天…

input输入框禁止输入小数点方法

使用blur事件&#xff1a; <el-input v-model"number" type"number" placeholder"请输入" blur"numberBlur" /> 第一种&#xff1a; 使用parseInt转为整数&#xff1a; this.number parseInt(this.number);第二种&#xff…

MAC地址详解

一、MAC地址 MAC地址&#xff0c;英文全称为Media Access Control&#xff0c;前面我们就介绍过MAC地址&#xff0c;MAC地址也称为物理地址或者硬件地址&#xff0c;每个网卡都有一个MAC地址&#xff0c;是数据在实际传输过程中所用到的地址。 二、 MAC组成 前面就介绍过&…

vue-element-admin后台集成方案

官网&#xff1a;介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide 1.git环境安装配置及简单操作 1.1git环境安装配置 git软件官网&#xff1a;Git - Downloads (git-scm.com)https://git-scm.com/downloads 下载…

印尼slot游戏pwa做Facebook广告代投推广流程

印尼slot游戏pwa做Facebook广告代投推广流程 随着互联网的普及和移动设备的广泛应用&#xff0c;社交媒体平台如Facebook成为了企业和个人进行品牌推广的重要渠道。在印尼的slot游戏行业中&#xff0c;利用PWA&#xff08;Progressive Web App&#xff09;技术进行Facebook广告…

第N4周:中文文本分类-Pytorch实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 目录 一、准备工作 1.任务说明 文本分类流程图&#xff1a; 2.加载数据 ​编辑 二、…

conda添加镜像源与channels

文章目录 一、conda下添加国内镜像源&#xff08;window下&#xff09;二、pip配置国内镜像源&#xff08;window下&#xff0c;临时修改&#xff09;三、conda源的定义 一、conda下添加国内镜像源&#xff08;window下&#xff09; 1、为【channels】配置清华镜像通道 直接在…

【Pandas】已完美解决:AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 一、问题背景 在Pandas的早期版本中&#xff0c;ix 是一个方便的索引器&#xff0c;允许用户通过标签和整数位置来索引DataFrame的行和列。然而&a…

Flask-Logging

Flask-Logging 教程 概述 flask-logging 是一个用于在 Flask 应用中实现高级日志记录功能的库。它能够帮助开发者轻松地配置和管理日志&#xff0c;适用于开发和生产环境。通过使用 flask-logging&#xff0c;可以更好地监控应用的运行状态和调试问题。 官方文档 Flask-Log…

Pixi.js学习 (四)鼠标跟随、元素组合与图片位控

目录 一、鼠标移动跟随 1.1 获取鼠标坐标 1.2 鼠标跟随 二、锚点、元素组合 2.1 锚点 2.2 元素组合 三、图片图层 四、实战 例题一&#xff1a;完成合金弹头人物交互 例题二&#xff1a;反恐重击瞄准和弹痕 例题一代码&#xff1a; 例题二代码&#xff1a; 总结 前言 为了提高作…

ADS基础教程20 - 电磁仿真(EM)参数化

EM介绍 一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号 四、总结 一、引言 参数化EM仿真&#xff0c;是在Layout环境下创建参数&#xff0c;相当于在原理图中声明变量。 二、参数化设置 1.参数定义 1&#xff09;在Layout视图&#xff0c;菜单栏中选中EM&g…

QMap使用详解

QMap使用详解 1. 实例化 QMap 对象2. 插入数据3. 移除数据4. 遍历数据5. 由键查找对应键值6. 由键值查找键7. 修改键值8. 查找是否包含某个键9. 获取所有的键和键值10.清除数据11.一个键对应多个值12.QMultiMap 遍历数据13.完整示例代码14.使用自定义键类型的 QMap示例&#xf…

大模型出现的不断重复的现象

无论是大语言模型还是多模态模型,都遇到过这个问题,该如何解决呢? 1.调整推理参数 [BUG] 返回重复的内容 Issue #277 QwenLM/Qwen GitHub是否已有关于该错误的issue或讨论? | Is there an existing issue / discussion for this? 我已经搜索过已有的issues和讨论 | I…

【Linux】基础IO——系统文件IO

我之前是讲过c语言的文件操作的&#xff0c;但是说实话我压根就不知道它在干什么&#xff0c;后面c语言/c,数据结构的学习过程中也没用过文件操作&#xff0c;今天我们就来会会这个文件操作 1.回顾c语言文件接口 1.1.fopen r &#xff1a;只读模式打开&#xff0c;文件流指针…

Java程序员英语单词通关:

Java程序员英语单词通关&#xff1a; abstract - 抽象的 boolean - 布尔值 break - 打断 byte - 字节 case - 情况&#xff0c;实例 catch - 捕获 char - 字符 class - 类 continue - 继续 default - 默认&#xff0c;通常 do - 做&#xff0c;运行 double - 双精度…

【LeetCode 92.】 反转链表 II

1.题目 虽然本题很好拆解&#xff0c;但是实现起来还是有一些难度的。 2. 分析 尽可能抽象问题&#xff0c;然后简化代码 我在写本题的时候&#xff0c;遇到了下面这两个问题&#xff1a; 没有把[left,right] 这个区间的链表给断开&#xff0c;所以导致反转起来非常麻烦。…

【iOS】KVO相关总结

目录 1. 什么是KVO&#xff1f;2. KVO的基本使用3. KVO的进阶使用observationInfo属性context 的使用KVO触发监听方法的方式自动触发手动触发 KVO新旧值相等时不触发KVO的从属关系一对一关系一对多关系 4. KVO使用注意5. KVO本质原理分析伪代码保留伪代码下的类并编译运行对比添…

JVM垃圾回收的普遍步骤

JVM&#xff08;Java Virtual Machine&#xff09;进行垃圾回收时&#xff0c;通常遵循以下步骤。不同的垃圾收集器可能会有一些不同的实现细节&#xff0c;但基本步骤和思想大致相同。以下是一般的垃圾回收过程的主要步骤&#xff1a; 1. 标记阶段&#xff08;Marking Phase&…