Java 基础学习第一弹

news2024/11/16 18:51:02

1. equels和==的区别

  equals方法用于比较对象的内容是否相等,可以根据自定义的逻辑来定义相等的条件,而==操作符用于比较对象的引用是否相等,即它们是否指向同一块内存地址。equals方法是一个

实例方法,可以被所有的Java对象调用,而==操作符可以用于比较对象的引用或基本数据类型的值。equals方法的行为可以被重写,以适应特定的比较需求,而==操作符的行为不可修改。

2. 垃圾回收机制

  垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者回收掉的机制。所谓使用中的对象,指的是程序中还有引用的对象;而未使用中的对象,指的是程

序中已经没有引用的对象,该对象占用的内存也可以被回收掉。垃圾回收的第一步是标记。垃圾回收器此时会找出内存哪些在使用中,哪些不是。垃圾回收的第二步是清除,这一步会删掉标记

出的未引用对象。内存分配器会保留指向可用内存中的引用,以分配给新的对象。垃圾回收的第三步是压缩,为了提升性能,删除了未引用对象后,还可以将剩下的已引用对象放在一起(压  

缩),这样就能更简单快捷地分配新对象了。逐一标记和压缩  Java 虚拟机中的所有对象非常低效:分配的对象越多,垃圾回收需要的时间就越久。不过,根据统计,大部分的对象,其实用没

多久就不用了。

Java 堆(Java Heap)是 JVM 所管理的内存中最大的一块,堆又是垃圾收集器管理的主要区域,这里我们主要分析一下 Java 堆的结构。

Java 堆主要分为 2 个区域-年轻代与老年代,其中年轻代又分 Eden 区和 Survivor 区,其中 Survivor 区又分 From 和 To 2 个区。可能这时候大家会有疑问,为什么需要 Survivor 区,为什么 Survivor 还要分 2 个区。

大多数情况下,对象会在新生代 Eden 区中进行分配。当 Eden 区没有足够空间进行分配时,虚拟机会发起一次 Minor GC,Minor GC 相比 Major GC 更频繁,回收速度也更快。

通过 Minor GC 之后,Eden 会被清空,Eden 区中绝大部分对象会被回收,而那些无需回收的存活对象,将会进到 Survivor 的 From 区(若 From 区不够,则直接进入 Old 区)。

Survivor 区相当于是 Eden 区和 Old 区的一个缓冲,类似于我们交通灯中的黄灯。Survivor 又分为 2 个区,一个是 From 区,一个是 To 区。每次执行 Minor GC,会将 Eden 区和 From 存活的对象放到 Survivor 的 To 区(如果 To 区不够,则直接进入 Old 区)。

之所以有 Survivor 区是因为如果没有 Survivor 区,Eden 区每进行一次 Minor GC,存活的对象就会被送到老年代,老年代很快就会被填满。而有很多对象虽然一次 Minor GC 没有消灭,但其实也并不会蹦跶多久,或许第二次,第三次就需要被清除。这时候移入老年区,很明显不是一个明智的决定。

所以,Survivor 的存在意义就是减少被送到老年代的对象,进而减少 Major GC 的发生。Survivor 的预筛选保证,只有经历 16 次 Minor GC 还能在新生代中存活的对象,才会被送到老年代。

设置两个 Survivor 区最大的好处就是解决内存碎片化。

我们先假设一下,Survivor 如果只有一个区域会怎样。Minor GC 执行后,Eden 区被清空了,存活的对象放到了 Survivor 区,而之前 Survivor 区中的对象,可能也有一些是需要被清除的。问题来了,这时候我们怎么清除它们?在这种场景下,我们只能标记清除,而我们知道标记清除最大的问题就是内存碎片,在新生代这种经常会消亡的区域,采用标记清除必然会让内存产生严重的碎片化。因为 Survivor 有 2 个区域,所以每次 Minor GC,会将之前 Eden 区和 From 区中的存活对象复制到 To 区域。第二次 Minor GC 时,From 与 To 职责互换,这时候会将 Eden 区和 To 区中的存活对象再复制到 From 区域,以此反复。

这种机制最大的好处就是,整个过程中,永远有一个 Survivor space 是空的,另一个非空的 Survivor space 是无碎片的。那么,Survivor 为什么不分更多块呢?比方说分成三个、四个、五个?显然,如果 Survivor 区再细分下去,每一块的空间就会比较小,容易导致 Survivor 区满,两块 Survivor 区可能是经过权衡之后的最佳方案。

老年代占据着 2/3 的堆内存空间,只有在 Major GC 的时候才会进行清理,每次 GC 都会触发“Stop-The-World”。内存越大,STW 的时间也越长,所以内存也不仅仅是越大就越好。在内存担保机制下,无法安置的对象会直接进到老年代,以下几种情况也会进入老年代。

1)大对象,指需要大量连续内存空间的对象,这部分对象不管是不是“朝生夕死”,都会直接进到老年代。这样做主要是为了避免在 Eden 区及 2 个 Survivor 区之间发生大量的内存复制。

2)长期存活对象,虚拟机给每个对象定义了一个对象年龄(Age)计数器。正常情况下对象会不断的在 Survivor 的 From 区与 To 区之间移动,对象在 Survivor 区中每经历一次 Minor GC,年龄就增加 1 岁。当年龄增加到 15 岁时,这时候就会被转移到老年代。当然,这里的 15,JVM 也支持进行特殊设置。

3)动态对象年龄,虚拟机并不重视要求对象年龄必须到 15 岁,才会放入老年区,如果 Survivor 空间中相同年龄所有对象大小的总合大于 Survivor 空间的一半,年龄大于等于该年龄的对象就可以直接进去老年区,无需等你“成年”。

这其实有点类似于负载均衡,轮询是负载均衡的一种,保证每台机器都分得同样的请求。看似很均衡,但每台机的硬件不通,健康状况不同,我们还可以基于每台机接受的请求数,或每台机的响应时间等,来调整我们的负载均衡算法。

3. String、StringBuffer、StringBuilder的区别

在Java中,StringStringBufferStringBuilder都是用于处理字符串的类,但它们在性能、线程安全性和可变性方面存在一些区别。

String(字符串)String是Java中最常用的字符串类,它是不可变的(immutable)。这意味着一旦创建了一个String对象,它的值就不能被修改。每次对String的操作(例如连接、替换等)都会创建一个新的String对象。这种不可变性使得String具有线程安全性,适合在多线程环境下使用。然而,频繁的字符串操作可能会导致内存开销较大,因为每次操作都会创建新的对象。

1

2

3

String str = "Hello";

str += " World"// 创建了一个新的String对象

```

StringBuffer(字符串缓冲区)StringBuffer是可变的(mutable)字符串类,它可以进行多次修改而无需创建新的对象。StringBuffer是线程安全的,适用于多线程环境下的字符串操作。它提供了多个方法用于对字符串进行修改、连接、插入和删除等操作。

1

2

3

4

5

StringBuffer sb = new StringBuffer("Hello");

sb.append(" World"); // 在原对象上进行修改,无需创建新对象

```

由于`StringBuffer`是线程安全的,它的执行速度相对较慢。因此,如果在单线程环境下进行字符串操作,推荐使用`StringBuilder`,因为它的执行速度更快。

StringBuilder(字符串构建器)StringBuilder也是可变的字符串类,类似于StringBuffer,它可以进行多次修改而无需创建新的对象。StringBuilder不是线程安全的,因此在多线程环境下使用时需要进行外部同步。由于不需要额外的线程安全检查,StringBuilder的执行速度相对较快。

1

2

3

StringBuilder sb = new StringBuilder("Hello");

sb.append(" World"); // 在原对象上进行修改,无需创建新对象

```

总结:

  • 如果需要频繁操作字符串,并且在多线程环境下使用,应该使用StringBuffer
  • 如果需要频繁操作字符串,但在单线程环境下使用,应该使用StringBuilder,因为它的执行速度更快。
  • 如果不需要频繁操作字符串,或者字符串是不可变的,可以使用String

4. 操作字符串常见的类及方法

String类:String是Java中最常用的字符串类,它提供了许多方法来处理字符串。以下是一些示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

String str1 = "Hello";

String str2 = "World";

// 连接字符串

String result1 = str1 + str2; // 结果为 "HelloWorld"

// 获取字符串长度

int length = str1.length(); // 结果为 5

// 检查字符串是否为空

boolean isEmpty = str1.isEmpty(); // 结果为 false

// 检查字符串是否包含指定字符

boolean contains = str1.contains("H"); // 结果为 true

// 提取子字符串

String subStr = str1.substring(14); // 结果为 "ell"

// 替换字符

String replacedStr = str1.replace("H""J"); // 结果为 "Jello"

// 拆分字符串

String[] parts = str1.split("l"); // 结果为 ["He", "", "o"]

// 转换为大写或小写

String upperCase = str1.toUpperCase(); // 结果为 "HELLO"

String lowerCase = str1.toLowerCase(); // 结果为 "hello"

StringBuilder类:StringBuilder用于构建可变字符串,它提供了一系列方法来进行字符串的拼接和修改。以下是一些示例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

StringBuilder sb = new StringBuilder();

// 追加字符串

sb.append("Hello");

sb.append("World");

// 插入字符串

sb.insert(5" ");

// 替换字符串

sb.replace(611"Java");

// 删除字符

sb.deleteCharAt(5);

// 反转字符串

sb.reverse();

String result2 = sb.toString(); // 结果为 "avaJdlroW"

StringBuffer类:StringBufferStringBuilder类似,也用于构建可变字符串。不同的是,StringBuffer是线程安全的,适用于多线程环境下的字符串操作。以下是一个示例:

1

2

3

4

5

6

StringBuffer buffer = new StringBuffer();

buffer.append("Hello");

buffer.append("World");

String result3 = buffer.toString(); // 结果为 "HelloWorld"

5. Static的用法和作用

static 是Java中的一个关键字,可以应用于变量、方法和代码块。它具有以下几种用法和作用:

静态变量(Static Variables):使用 static 关键字声明的变量称为静态变量,也称为类变量。静态变量属于类而不是实例,它在类加载时被初始化,并且在整个程序执行期间保持不变。静态变量可以通过类名直接访问,无需创建类的实例。静态变量常用于表示在类的所有实例之间共享的数据。

1

2

3

4

5

6

7

public class MyClass {

    static int count = 0// 静态变量

    public MyClass() {

        count++// 每次创建实例时,静态变量 count 自增

    }

}

静态方法(Static Methods):使用 static 关键字声明的方法称为静态方法。静态方法属于类而不是实例,它可以在类加载时直接调用,无需创建类的实例。静态方法只能访问静态变量和调用其他静态方法,不能直接访问实例变量或调用实例方法。

1

2

3

4

5

public class MathUtils {

    public static int add(int a, int b) { // 静态方法

        return + b;

    }

}

静态代码块(Static Initialization Blocks):静态代码块用于在类加载时执行一些初始化操作。它使用 static 关键字定义,并用花括号括起来的代码块。静态代码块只执行一次,且在类的第一次使用时执行。

1

2

3

4

5

6

public class MyClass {

    static {

        // 静态代码块

        // 执行一些初始化操作

    }

}

静态代码块通常用于初始化静态变量或执行其他与类相关的初始化操作。

静态导入(Static Import):静态导入用于在代码中直接使用静态成员(变量或方法),而无需使用类名限定符。通过使用 import static 语法,可以导入静态成员,使其在代码中可直接访问。

1

2

3

4

5

6

7

import static java.lang.Math.PI;

public class MyClass {

    public double calculateArea(double radius) {

        return PI * radius * radius; // 直接使用静态变量 PI,无需使用 Math.PI

    }

}

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

文章解读与完整程序——《考虑“源-荷-储”协同互动的主动配电网优化调度研究》

摘要:伴随智能电网的建设和清洁能源的开发利用,配电网中的负荷类型呈现多元化发展,分布式电源、可控负荷、储能等资源的增加让单向潮流的传统配电网逐渐向双向潮流的主动配电网结构转变。在能源结构转变的同时,清洁能源自身的随机性和波动性给配电网带来了更大的调峰…

再获认可!棱镜七彩荣获ISC2023数字安全创新能力百强

12月27日,由北京经济和信息化局、通州区政府指导,中关村科技园区通州园管理委员会、ISC 平台主办,北京通州发展集团有限公司、赛迪顾问协办的数字安全技术创新论坛暨ISC 2023数字安全创新能力百强颁奖典礼在北京阳光国际会议中心成功举办&…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

实习知识整理10: 渲染默认地址以及实现渲染并选择其他地址

1. 渲染默认地址思路分析 (1)如果我们需要获取到默认地址可以通过userId从地址表中查找,因为从商品详情页点击购买按钮时,只传递商品的相关信息,所以我们就需要从session中获取用户的信息userId (2&#…

INS量测更新

基础知识 1、ZK H X V 2、V ZK -HX 3、K Pk/k-1HT/(HPk/k-1HT R) 主要更新以下两个方程 4、Xk/k Xk/k-1 KV () 5、Pk/k Pk/k-1 - KHPk/k-1 (I -KH)Pk/k-1; 剖析4和5两个方程,Xk/k-1,Pk/k-1时间更新已经更新完了&#x…

【软件工程大题】PAD图

常见题型:流程图转换为PAD图,伪代码转换为PAD图 PAD图基本要素 图解: (1) 选择分支,在P1和P2的左边标记 T or F (2) 如果只有if 没有else 省略即可(如不画P2),其余不变 (3) while C 的意思是 C为假的时候,跳出循环 until C 的意思是 C为真的时候,跳出循环 真题实战 题目…

高压放大器的使用方法是什么

高压放大器是一种重要的电子设备,其主要功能是放大输入信号的电压,并输出更高电压的信号。它在各种工业、实验室和研究领域都有着广泛的应用。下面安泰电子官网将详细介绍高压放大器的使用方法以及相关注意事项。 高压放大器是一种专门用于将低电压信号转…

C语言操作符逻辑与,逻辑或面试真题(2)

各位少年&#xff1a; 今天给大家分享几个代码示例&#xff0c;希望能帮助能从学习的方面&#xff0c;帮助大家。 #include<stdio.h> int main() { int i0,a0,b2,c3,d4; ia&&b&&d; printf("a%d\n b%d\n c%d\nd%d",a,b,c,d); return 0; } 大…

经验分享:构建知识库管理系统只需要这几步

导语&#xff1a; 在当今信息爆炸的时代&#xff0c;构建一个高效的知识库管理系统对于企业来说至关重要。一个好的知识库管理系统可以帮助企业集中管理和共享知识和信息&#xff0c;提高团队的协作效率和创新能力。本文将分享构建知识库管理系统的几个关键步骤&#xff0c;帮…

Spring之提前编译:AOT

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

git将分支代码传到Master上

先把更改的代码commit、push到github自己的分支上&#xff0c;在github上Heart&#xff08;自己&#xff09;分支上能看到提交后再进行下面操作。git checkout Master &#xff0c;切换到Master主干道git pull ,把Master上最新代码pull下来git merge Heart&#xff0c;合并到自…

【小黑嵌入式系统第十三课】PSoC 5LP第二个实验——中断控制实验

上一课&#xff1a; 【小黑嵌入式系统第十二课】μC/OS-III程序设计基础&#xff08;二&#xff09;——系统函数使用场合、时间管理、临界区管理、使用规则、互斥信号量 文章目录 1 实验目的2 实验要求3 实验设备4 实验原理4.1 中断(1) 中断机制概述(2) 中断源(3) 中断系统的功…

[Ray Tracing: The Next Week] 笔记

前言 本篇博客参照自《Ray Tracing: The Next Week》教程&#xff0c;地址为&#xff1a;https://raytracing.github.io/books/RayTracingTheNextWeek.html 该教程在ray tracing in one weekend的基础上&#xff0c;增加了运动模糊、BVH树、Texture映射、柏林噪声、光照、体积…

前端文件在虚拟机,后端在本机,两个如何通信

前端文件在虚拟机&#xff0c;后端在本机&#xff0c;两个如何通信 如果前端的文件放在虚拟机里面&#xff0c;但是调用接口的后端在本地调试&#xff0c;如何做到在虚拟机中也能访问到本地的接口内容。 其实这个问题很简单&#xff0c;只要讲本地的IP和虚拟机中的IP结合就可…

在wps里导入Mathtype、改变字体

1 在wps里导入Mathtype 开发工具--加载项 2. 在“模板和加载项”窗口中再点击“添加” 3.找到mathtype安装路径下面的“OfficeSupprot”&#xff0c;这时会看到有“32”和“64”两个文件夹&#xff0c;分别对应WPS软件的系统&#xff08;任务管理器可以直接查看wps版本&#x…

k8s搭建(二、k8s组件安装)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

MySQL日期查询 今天、明天、本月、下月、星期、本周第一天、本周最后一天、本周七天日期

文章目录 今天日期明天日期本月第一天本月最后一天下个月第一天当前月已过几天当前月天数当前月所有日期获取星期本周第一天本周最后一天获取本周的七天日期 今天日期 select curdate()明天日期 select DATE_SUB(curdate(),INTERVAL -1 DAY) AS tomorrow本月第一天 select d…

c 语言,指针,指针的指针

c 语言&#xff0c;指针&#xff0c;指针的指针 指针就是指向变量地址的东西。 比如&#xff1a; 定义了一个 int 变量 p&#xff0c;值为 1 。定义了 int 指针 pInt 指向了变量 p&#xff0c; 它的名字前面有个 * &#xff0c;此时 pInt 就是 p 的地址&#xff0c;当前面加…

vue+element实现动态表格:根据后台返回的属性名和字段动态生成可变表格

现有一个胡萝卜厂生产不同品种的胡萝卜&#xff0c;为了便于客户了解产品&#xff0c;现需在官网展示胡萝卜信息。现有的萝卜信息&#xff1a;编号&#xff08;id&#xff09;、名称&#xff08;name&#xff09;、保质期&#xff08;age&#xff09;、特点&#xff08;remark&…

Python编程:计算当前日期是一年中的第几天

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;计算当前日期是一年中的第几天可以通过内置的datetime模块来实现。这个任务涉及到日期处理和一些基本的数学计算。在本文中&#xff0c;将详细介绍如何使用Python编写代码来完成这个任务&…