java的基础较难知识点总结1

本文详细解析了Java虚拟机(JVM)的运作原理,包括垃圾回收机制、内存模型、引用类型及对象创建方式等内容,帮助读者掌握JVM的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JVM相关

1.说一下Java的垃圾回收机制。
它使得java程序员在编写程序的时候不再考虑内存管理。垃圾回收器通常是作为以一个单独的低级别的线程运行,不可预知的情况下对内存堆中长时间没有使用的对象进行清除和回收,程序员不能实时调用垃圾回收器进行垃圾回收。但可以手动使用System.gc()来让垃圾回收机制(GC)运行,但由于Java的语言规范不一定会让GC运行。
简单来说GC就是Where(在哪里),When(什么时候需要被回收),how(如何被回收的)
2.JVM的内存模型/内存布局
在这里插入图片描述
JVM堆:作用是用于为几乎所有的对象实例和数据实例提供内存空间,即为new关键字所有产生的对象进行空间分配
方法区:主要用于储存已经由JVM加载类的信息,常量,静态变量,即时编译器编译后的代码等数据
虚拟机栈:是随线程的产生而产生的,属于线程的私有区域,生命周期与线程保持一致,故JVM的内存管理器对这部分无需管理;
本地方法栈:本地方法栈是为Java的Native method方法调用的时候服务,与虚拟机栈十分类似
程序计数器:为线程私有,PC中保存了java字节码的命令地址,若为Native方法,则程序计数器内容为空
3.JVM的4种引用和使用场景
由高到低是:
1:强引用:
最普遍的引用,我们使用new关键字创建的所有实体类几乎全为强引用,垃圾回收器绝不会回收强引用所创造的类。
2.软引用
在内存足够时,垃圾回收器不会回收软引用。但如果内存空间不够了就会回收软引用来解决内存不足的问题。软引用可以用来实现内存敏感的高速缓存
3.弱引用
比软引用更短的生命周期,当垃圾回收器在所属内存区域发现只具有弱引用的对象时,就会回收它的内存
4.虚引用
不会决定对象的生命周期,若一个对象只具有虚引用,那么它就和没有引用一样,随时可以被垃圾回收器回收
综上所述是 Java 垃圾回收器会优先清理可达强度低的对象。
4.引用计数法与可达性分析算法。
引用计数法:在对象头处增加一个counter,当增加一次该对象的引用时counter自加,反之自减,当counter为0时表示,但这种方式无法区分JVM的引用类型,而且还会造成死锁,比如两个对象互相引用就始终无法释放counter
可达性分析算法:通过一系列为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明该对象是不可用的。如果对象在进行可行性分析后发现没有与GC Roots相连的引用链,也不会理解死亡。它会暂时被标记上并且进行一次筛选,若还没有新的关联时,就会被垃圾回收器进行回收。(是通过枚举根节点来实现的)
这两个方法也是判断对象是不是垃圾的方法
5.堆里面的分区和各自的特点
年轻代:分为两个存活区,两个存活区交替使用,循环往复,在下一次垃圾回收时,之前清除的存活区又用来放置存活下来的对象了,一般来说,年轻代的区域较小,而且大部分对象是需要清除的,采用“复制算法”进行垃圾回收
年老代:在年老代中,放置的都是生命周期较长的对象。而且垃圾回收器会使用一种称为“标记-清除-压缩”的算法来进行垃圾回收。
6.Minor GC 与 Full GC 分别在什么时候发生?
当每次对象从 Eden 复制到 Survivor Space 或者从 Survivor Space 中的一个复制到另外一个,有一个计数器会自动增加值。 默认情况下如果复制发生超过16次, JVM 会停止复制并把他们移到老年代中.
7.内存分配规则
1.对象优先分配在eden区(年轻代两个存活区中的一个),如果eden区没有足够空间时,虚拟机.Minor GC
2.大对象会直接进入老年代
3.长期存活的对象直接进入老年代
4.动态判断对象的年龄。
5.空间分配担保
8.四种方法创建Java对象
1.使用new语句(最常用的方法)
2.使用clone()克隆方法
A a1=a.clone();
注意:被克隆的类实现Cloneable接口
被克隆的类药重写clone()方法
在这里插入图片描述
3.使用反射手段,使用Class.forName()
A a=(A)Class.forName(“A所在的位置”).newInstance();
4.运用反序列化手段,调用java.io.ObjectInputStream对象readObject()方法;

无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补不足,才能长久的进步!!Java学习更是如此,知识点总结目录如下: 目录 一、 Java概述 3 二、 Java语法基础 5 数据类型 5 运算符号 14 语句 15 函数 15 方法重载(Overloadjing)与重写(Overriding) 16 数组 17 总结 18 三、 常见关键字 20 四、 面向对象★★★★★ 21 五、 封装(面向对象特征之一)★★★★ 23 六、 继承(面向对象特征之一)★★★★ 25 七、 接口(面向对象特征之一)★★★★ 28 八、 多态(面向对象特征之一)★★★★ 30 九、 java.lang.Object 31 十、 异常★★★★ 34 十一、 包(package) 37 十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五、 API 71 String字符串:★★★☆ 71 StringBuffer字符串缓冲区:★★★☆ 73 StringBuilder字符串缓冲区:★★★☆ 74 基本数据类型对象包装类★★★☆ 75 集合框架:★★★★★,用于存储数据的容器。 76 Collection接口 77 Iterator接口 78 List接口 78 Set接口 80 Map接口 81 把map集合转成set的方法 82 使用集合的技巧 83 Collections--集合工具类 83 Arrays—数组对象工具类 84 增强for循环 85 可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 System 89 Runtime 90 Math 90 .Date:日期类,月份从0—11 92 Calendar:日历类 93 十六、 IO流:用于处理设备上数据 ★★★★★ 94 IO流的概念 95 字符流与字节流 98 流对象 101 File类 102 Java.util.Properties 103 介绍IO包中扩展功能的流对象 103 十七、 网络编程 110 网络基础之网络协议篇 111 UDP传输 124 TCP传输 126 十八、 反射技术 127 十九、 Ajax原理及实现步骤★★★★★ 130 Ajax概述 130 Ajax工作原理 130 Ajax实现步骤 130 详解区分请求类型: GET或POST 131 $.ajax标准写法 134 二十、 正则表达式:其实是用来操作字符串的一些规则★★★☆ 135 二十一、 设计模式★★★★★ 136 设计模式简介 136 单例设计模式:★★★★★ 156 工厂模式★★★★★ 159 抽象工厂模式★★★★★ 163 建造者模式 170 原型模式 177 适配器模式 182 桥接模式 188 过滤器模式 192 组合模式 193 装饰器模式★★★★★ 196 外观模式 201 享元模式 204 代理模式★★★★★ 208 责任链模式 212 命令模式 216 解释器模式 219 迭代器模式 222 中介者模式 224 备忘录模式 226 观察者模式 230 状态模式 233 空对象模式 236 策略模式★★★★★ 238 模板模式 240 访问者模式 244 设计模式总结★★★★★ 247 二十二、 Java其他总结 248 Java JVM知识点总结 248 equals()方法和hashCode()方法 270 数据结构 273 Array方法类汇总 304 Java数组与集合小结 305 递归 309 对象的序列化 310 Java两种线程类:Thread和Runnable 315 Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362
### 蓝桥杯 Java 知识点总结与复习资料 #### 基础数据结构操作 在准备蓝桥杯竞赛时,掌握基础的数据结构及其常用方法非常重要。例如 `HashSet` 的基本操作可以用于处理去重、查询等问题。以下是 `HashSet` 的几个重要方法: - 添加元素:通过 `add()` 方法向集合中添加新元素。 - 判空检查:使用 `isEmpty()` 方法来判断集合是否为空。 - 成员检测:利用 `contains()` 方法验证某个特定元素是否存在於集合之中。 - 获取大小:调用 `size()` 函数获取当前集合内的元素数量。 - 删除指定项:借助 `remove()` 来移除给定对象实例。 - 清理全部条目:执行 `clear()` 可一次性清除所有成员。 ```java import java.util.HashSet; public class Main { public static void main(String[] args) { HashSet<String> set = new HashSet<>(); set.add("str1"); set.add("str2"); set.add("str3"); System.out.println(set.isEmpty()); // false System.out.println(set.contains("str1")); // true System.out.println(set.size()); // 3 System.out.println(set.remove("str1")); // true set.clear(); } } ``` #### 数学知识要点 除了编程技巧外,某些数学概念也是不可或缺的一部分。特别是那些涉及算法优化或者问题建模的知识领域,比如素数判定、最大公约数计算等[^2]。 - **素数** 是指大于1且仅能被自己和1整除的自然数;了解如何高效地找出一定范围内的所有质数是非常有用的技能之一。 - **整除关系** 和因式分解同样频繁出现在各类试题当中,能够快速识别并应用这些性质有助于简化复杂度较高的运算过程。 - 对于像完全平方数这样的特殊数值类型也要有所认识,在解决实际问题过程中可能会遇到与此相关的挑战。 #### 练习题推荐 为了更好地巩固所学到的内容以及适应比赛节奏,建议多做历年真题和其他类似的模拟测试案例。这不仅能让考生更加熟悉考试形式,还能提高应对突发状况的能力。可以从简单入手逐步过渡到更难层次的问题,从而建立起完整的解题思路框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值