学习笔记之JAVA篇(0724)
p 方法
- 方法声明格式:
[修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){
java语句;......;
}
- 方法调用方式
普通方法 | 对象.方法名(实参列表) |
---|---|
静态方法 | 类名.方法名(实参列表) |
- 方法的详细说明
- 形式参数:在方法声明时用于接收外界传入的数据。(方法定义时)
- 实参:调用方法时实际传给方法的数据。(方法调用时)
- 返回值:执行完毕后,返还给调用它的环境的数据。
- 返回值类型:事先约定的返回值的数据类型,如无返回值,则为void
p 重载
- 重载:一个类中可以定义多个名称相同,但参数列表不同的方法。
重载的方法,实际是完全不同的方法,只是名称相同而已!
- 构成方法重载的条件
- 不同的含义:形参类型,形参个数,形参顺序不同;
- 只有返回值不同不构成方法的重载
- 如:
int a(String str){ }与void a(String str){ }
不构成方法重载
- 如:
- 只有形参的名称不同,不构成方法的重载。
p 递归
- 递归是一种常见的算法思路,在很多算法中都会用到,比如:深度优先搜索(DFS:Depth First Search)
- 递归的基本思想就是“自己调用自己”;
- 递归结构包括两个部分:
- 定义递归头:解决:什么时候不调用自身方法。如果没有头,将陷入死循环,也就是递归的结束条件
- 递归体:解决:什么时候需要调用自身方法。
- 递归的缺陷:算法简单是递归的优点之一,但是递归调用会占用大量的系统堆栈,内存好用多,在递归层次多时速度要比循环慢的多,所以在使用时要慎重。
public class factorial {public static long factorial(int n) {if(n == 1){return 1;}else {return n* factorial(n - 1);}}public static void main(String[] args) {
// 当前时间long startTime = System.currentTimeMillis();System.out.println(factorial(20));
// 结束时间long endTime = System.currentTimeMillis();System.out.println("递归耗时:"+(endTime - startTime)+"ms");}
}
p 面向对象 ——面向过程
- 面向过程和面向对象的区别
- 面向过程(C语言)适合简单、不需要协作的事务,重点关注如何执行。
- 面向对象可以帮助我们宏观上把握、从整体上分析整个系统。但是具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路区处理。
- 二者不是对立的,是相辅相成的,面向对象离不开面向过程。
- 面向对象和面向过程思想总结:
- 都是解决问题的思维方式,都是代码组织的方式。
- 面向过程是一种“执行者思维”,解决简单问题可以使用面向过程;
- 面向对象是一种“设计者思维”,解决复杂。需要协作的问题,可以使用面向对象;
- 面向对象离不开面向过程:
- 宏观上:通过面向对象进行整体设计
- 微观上:执行和处理数据,仍然是面向过程。
p 类
- 类我们叫做class,对象:Object,instance(实例)
- 总结
- 类可以看成一类对象的模版,对象可以看成该类的一个具体实例。
- 类是用于描述同一类型的对象的一个抽象概念,类中定义这一类对象所应具有的共同属性、方法。
- 类的定义方式
//每一个源文件必须有且只有一个
public class{}
//并且类名和文件名保持一致!
public class Car {}
class Tyre {}
// 一个Java文件可以同时定义多个
classclass Engine {}
class Seat{}
对于一个类来说,有三种成员:属性field、方法method、构造器constructor.
- 属性(field成员变量)
**属性用于定义该类或该类对象包含的数据或者静态特征。**属性作用范围是整个类体。在定义成员变量时可以对其初始化,如果不对其初始化,Java使用默认的值对其初始化。
数据类型 | 默认值 |
---|---|
整型 | 0 |
浮点型 | 0.0 |
字符型 | "u0000’ |
布尔型 | false |
所有引用类型 | null |
- 属性定义格式
[修饰符] 属性类型 属性名 = [默认值];
- 方法
**方法用于定义该类或该类实例的行为特征和功能实现。**方法是类和对象行为特征的抽象。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
[修饰符]
方法返回值类型 方法名(形参列表){// n 条语句}
p 简单内存分析
/*** 一个学生类**/
public class Students {int id;int age;String name;public void study(){System.out.println("正在学习,勿扰!");}public void kickball(){System.out.println("踢球中,为我加油!");}public static void main(String[] args) {Students s1 = new Students();System.out.println(s1.id);System.out.println(s1.name);s1.id = 1001;s1.name = "msyy";System.out.println(s1.id);System.out.println(s1.name);s1.study();s1.kickball();}
}
P 构造方法(构造器 constructor)
-
构造器用于对象的初始化,而不是创建对象。
-
创建对象的四步:
- 分配对象空间,并将对象成员变量初始化为0或空(null)
- 执行属性值的显示初始化
- 执行构造方法
- 返回对象的地址给相关的变量
-
声明格式
-
[修饰符] 类名(形参列表){ // n条语句 }
-
-
构造器的4个要点
- 构造器通过
new
关键字调用! - 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用
return
返回某个值。 - 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义则比编译器不会自动添加!
- 构造器的方法名必须和类名一致!
- 构造器通过
-
课堂练习
定义一个“点(Point)类用来表示二维空间中的点(有两个坐标),要求如下:
可以生成具有特定坐标的点对象。
提供可以计算该“点”距另外一点距离的方法。
public class Point {private int x;private int y;public Point(int x, int y) {this.x = x;this.y = y;}public double distance(Point p) {return Math.sqrt(Math.pow(this.x - p.x, 2) + Math.pow(this.y - p.y, 2));}public static void main(String[] args) {Point p1 = new Point(1, 2);Point p2 = new Point(3, 4);System.out.println(p1.distance(p2));}
}
P 构造方法 —— 内存
P JVM虚拟机内存模型
java虚拟机的内存可以分为三个区域:虚拟机栈(stack)、堆(heap)、方法区(method area)
虚拟机栈(简称:栈)的特点如下:
- 栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
- JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
- 栈属于线程私有,不能实现线程间的共享!
- 栈的存储特性是“先进后出,后进先出”
- 栈是系统自动分配,速度快!栈是一个连续的内存空间!
堆的特点如下:
-
堆用于存储创建好的对象和数组(数组也是对象)
-
JVM只是一个堆,被所有线程共享。
-
堆是一个不连续的内存空间,分配灵活,速度慢!
-
堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代、老年代的划分。
方法区(也是堆)特点如下 -
方法区是JAVA虚拟机规范,可以有不同的实现。
- JDK7以前是“永久代”
- JDK7部分去除“永久代”,静态变量、字符串常量池都挪到堆内存中
- JDK8是“元数据空间”和堆结合起来。
-
JVM只有一个方法区,被所有线程共享!
-
方法区实际也是堆,只是用于存储类、常量相关的信息!
-
用来存放程序中永远不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
-
常量池主要存放常量:如文本字符串、final常量值。
p 程序执行过程的内存分析详解
*这里有个动图传不上来啦 >< *
参数传值机制
JAVA中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件“。因此,复印件改变不会影响原件。
- 基本数据类型参数的传值
- 传递的是值的副本。副本改变不会影响原件。
- 引用类型参数的传值
- 传递的是值的副本。但是引用类型指的是“对象的地址”,因此副本和原参数都指向了同一个“地址”,改变了“副本指向地址对象的值”,也意味着原参数指向对象的值夜发生了“改变”。
多个对象指向一个地址
public class Employee {private int id;private String name;private String job;private String baseSalary;private String salary2;private String hiredate;private String address;void Meeting(){System.out.println("1.8:30打卡");System.out.println("2.开会");System.out.println("3.9:00结束");System.out.println("4.集体喊加油");}public static void main(String[] args) {Employee e1 = new Employee();e1.id = 1;e1.name = "abc";Employee e2 = e1;System.out.println(e1.id);System.out.println(e1.name);e2.id = 2;e2.name = "def";System.out.println(e1.id);System.out.println(e1.name);}
}
垃圾回收机制(Garbage Colloction)
垃圾回收原理和算法
- 内存管理
- JAVA的内存管理很大程度就是堆中对象的管理,其中包括对象空间的分配和释放。
- 对象空间的分配:使用new 关键字创建对象即可。
- 对象空间的释放:将对象赋值Null即可。
- 垃圾回收过程
任何一种垃圾回收算法一般都要做两件基本事情:
- 发现无用的对象
- 回收无用对象占用的内存空间
垃圾回收机制保证可以将“无用的对象”进行回收。
无用的对象指的是没有任何变量引用该对象。JAVA的垃圾回收器通过相关算法法相无用对象,并进行清除和整理。
垃圾回收相关算法
1. 引用计数法
堆中的每个对象都对应一个引用计数器,当有引用指向这个对象时,引用计数器加1,而当指向该对象的引l用失效时(引l用变为null),引用计数器减1,最后如果该对象的引用计算器的值为0时,则Java垃圾回收器会认为该对象是无用对象并对其进行回收。优点是算法简单缺点是“循环引用的无用对象无法别识别。
public class Student {String name;Student friend;public static void main(String[] args) {Student s1 = new Student();Student s2 = new Student();s1.friend = s2;s2.friend = s1;s1 = null;s2 = null;}
}
2.引用可达法(根搜索算法)
程序把所有引用关系看作一张图,从一个节点点GC ROOT
开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点则被认为是没有被引I用到的节点,即无用的节点。
通用的分代垃圾回收机制
JVM调优和Full GC
在对JVM调优的过程中,很大一部分工作就是对于 Full GC 的调节。有如下原因可能导致Full GC:
- 年老代(Tenured)被写满
- 永久代(perm)被写满
- System.gc()被显示调用
- 上一次GC之后Heap的各域分配策略动态变换。
内存泄露
含义:指堆内存由于某种原因程序未被释放,造成内存浪费,导致运行速度减慢甚至系统崩溃等。
四种场景:
- 创建大量无用对象:
比如:大量拼接字符串时,使用了String而不是StringBuilder.
String str ="";
for(int i = 0 ; i < 10000 ;i++){str += i; //相当于产生了10000个String对象
}
- 静态集合类的使用
像HashMap、Vector、List
等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象也不能被释放。
- 各种连接对象(IO对象、数据库连接对象、网络连接对象)未关闭
IO流、数据库连接对象、网络连接对象等连接对象属于物理连接,和硬盘或者网络连接,不使用的时候一定要关闭。
- 监听器的使用不当
释放对象时,没有删除相应的监听器。
- 其他要点
- 程序员无权调用垃圾回收器。
- 程序员类可以调用System.gc(),该方法只是通知JVM,并不是运行拦击回收器。尽量少用,会申请Full GC,成本高,影响系统性能。
- Object对象的finalize方法,是JAVA提供给程序员用来释放对象或资源的方法,但是尽量少用。
- 本节作业(答案会在下一期或者评论区哟)
- 垃圾回收过程一般分为两步,是哪两步?
- 垃圾回收常见的两种算法是什么?
- 堆内存划分成:年轻代、年老代、永久代。垃圾回收器划分成:Minor GC、Major GC、Full GC。这三种垃圾收回器都对应哪些区域?
- 对JVM 调优的过程中,很大一部分工作就是对于FuIl GC 的调节。这句话对吗?
- System.gcO的作用是什么?
今天就学到这里吧!~~~
保护眼睛吧
相关文章:

学习笔记之JAVA篇(0724)
p 方法 方法声明格式: [修饰符1 修饰符2 ...] 返回值类型 方法名(形式参数列表){ java语句;......; } 方法调用方式 普通方法对象.方法名(实参列表)静态方法类名.方法名(实参列表) 方法的详…...

【Android】广播机制
【Android】广播机制 前言 广播机制是Android中一种非常重要的通信机制,用于在应用程序之间或应用程序的不同组件之间传递信息。广播可以是系统广播,也可以是自定义广播。广播机制主要包括标准广播和有序广播两种类型。 简介 在Android中,…...
【.NET全栈】ASP.NET开发Web应用——ASP.NET数据绑定技术
文章目录 前言一、绑定技术基础1、单值绑定2、重复值绑定 二、数据源控件1、数据绑定的页面生存周期2、SqlDataSource3、使用参数过滤数据4、更新数据和并发处理5、编程执行SqlDataSource命令6、ObjectDataSource控件介绍7、创建业务对象类8、在ObiectDataSource中使用参数9、使…...

MySQL的账户管理
目录 1 密码策略 1.1 查看数据库当前密码策略: 1.2 查看密码设置策略 1.3 密码强度检查等级解释(validate_password.policy) 2 新建登录账户 3 账户授权 3.1 赋权原则 3.2 常见的用户权限 3.3 查看权限 3.4 赋权语法 4 实例 4.1 示例1&#x…...

FastGPT 源码调试配置
目录 一、添加 launch.json 文件 二、调试 本文简单介绍如何通过 vscode 对 FastGPT 进行调试。 这里假设已经安装 vsocde 和 FastGPT本地部署。 一、添加 launch.json 文件 vscode 打开 FastGPT 项目,点击 调试 -> 显示所有自动调试配置 -> 添加配置 -> Node.j…...
SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南
SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南 在数据管理的世界里,数据迁移是一个常见且复杂的过程。SQL Server提供了一个强大的工具——数据库数据泵(Data Pump),它可以帮助我…...
Android性能优化之OOM
OOM 什么是OOM?为什么会有OOM?APP的内存限制App的内存限制是多少? 为什么Android系统要设定App的内存限制?Android有GC自动回收资源,为什么还会OOM?容易发生OOM的场景及处理方案如何避免OOM? 什么是OOM&am…...

代码随想录算法训练营day7 | 454.四数相加II、383.赎金信、15.三数之和、18.四数之和
文章目录 454.四数相加II思路 383.赎金信思路 15.三数之和思路剪枝去重 18.四数之和思路剪枝去重复习:C中的类型转换方法 总结 今天是哈希表专题的第二天 废话不多说,直接上题目 454.四数相加II 建议:本题是 使用map 巧妙解决的问题&#x…...

Spark实时(三):Structured Streaming入门案例
文章目录 Structured Streaming入门案例 一、Scala代码如下 二、Java 代码如下 三、以上代码注意点如下 Structured Streaming入门案例 我们使用Structured Streaming来监控socket数据统计WordCount。这里我们使用Spark版本为3.4.3版本,首先在Maven pom文件中导…...

《Java初阶数据结构》----4.<线性表---Stack栈和Queue队列>
前言 大家好,我目前在学习java。之前也学了一段时间,但是没有发布博客。时间过的真的很快。我会利用好这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…...
Android SurfaceFlinger——关联EGL三要素(二十七)
通过前面的文章我们得到了 EGL 的三要素——Display、Surface 和 Context。其中,Display 是一个图形显示系统或者硬件屏幕,Surface 代表一个可以被渲染的图像缓冲区,Context 包含了 OpenGL ES 的状态信息和资源,它是执行 OpenGL 命令的环境。下一步就是调用 eglMakeCurrent…...

Unity3D之TCP网络通信(客户端)
文章目录 概述TCP核心类异步机制 Unity中创建TCP客户端Unity中其它脚本获取TCP客户端接受到的数据后续改进 本文将以Unity3D应用项目作为客户端去连接制定的服务器为例进行相关说明。 Unity官网参考资料: https://developer.unity.cn/projects/6572ea1bedbc2a001ef…...
Kotlin 中 标准库函数
在 Kotlin 中,标准库提供了许多实用的函数,这些函数可以帮助简化代码、提高效率,以下是一些常用的标准库函数及其功能: let: let 函数允许你在对象上执行一个操作,并返回结果。它通常与安全调用操作符 ?. 一起使用&a…...

【教学类-69-01】20240721铠甲勇士扑克牌(随机14个数字+字母)涂色(男孩篇)
背景需求: 【教学类-68-01】20240720裙子涂色(女孩篇)-CSDN博客文章浏览阅读250次。【教学类-68-01】20240720裙子涂色(女孩篇)https://blog.csdn.net/reasonsummer/article/details/140578153 前期制作了女孩涂色延…...

Adobe“加速”创意人士开启设计新篇章
近日,Adobe公司宣布了其行业领先的专业设计应用程序——Adobe Illustrator和Adobe Photoshop的突破性创新。这一重大更新不仅为创意专业人士带来了前所未有的设计可能性和工作效率提升,还让不论是插画师、设计师还是摄影师,都能从中受益并创作…...

释疑 803-(1)概述 精炼提纯版
目录 习题 1-01计算机网络可以向用户提供哪些服务? 1-02 试简述分组交换的要点。 1-03 试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。 1-05 互联网基础结构的发展大致分为哪几个阶段?请指出这几个阶段最主要的特点。 1-06 简述互联网标准制定的几个阶段…...

人工智能与机器学习原理精解【6】
文章目录 数值优化基础理论凹凸性定义在国外与国内存在不同国内定义国外定义总结示例与说明注意事项 国内凹凸性二阶定义的例子凹函数例子凸函数例子 凸函数(convex function)的开口方向凸函数的二阶导数凸函数的二阶定义单变量函数的二阶定义多变量函数…...
JDK、JRE、JVM之间的关系
JDK是Java的开发环境,用JDK开发了JAVA程序后,通过JDK中的编译程序(javac)将java文件编译成字节码文件,作为运行环境的JRE,字节码文件在JRE上运行,作为虚拟机的JVM解析这些字节码,映射…...

redis构建集群时,一直Waiting for the cluster to join
redis构建集群时,一直Waiting for the cluster to join 前置条件参考 前置条件 这是我搭建的集群相关信息,三台虚拟机,分别是一主一从。在将所有虚拟机中redis服务器用到的tcp端口都打开之后,进行构建集群。但是出现上面的情况。 …...

C++之类与对象(2)
前言 今天将步入学习类的默认成员函数,本节讲解其中的构造函数和析构函数。 1.类的默认成员函数 在 C 中,如果一个类没有显式定义某些成员函数,编译器会自动为该类生成默认的成员函数。以下是编译器可能会生成的默认成员函数: 默…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...