学习笔记之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 中,如果一个类没有显式定义某些成员函数,编译器会自动为该类生成默认的成员函数。以下是编译器可能会生成的默认成员函数: 默…...

「树形结构」基于 Antd 实现一个动态增加子节点+可拖拽的树
效果 如图所示 实现 import { createRoot } from react-dom/client; import React, { useState } from react; import { Tree, Input, Button } from antd; import { PlusOutlined } from ant-design/icons;const { TreeNode } Tree; const { Search } Input;const ini…...

ubuntu那些ppa源在哪
Ubuntu中的 PPA 终极指南 - UBUNTU粉丝之家 什么是PPA PPA 代表个人包存档。 PPA 允许应用程序开发人员和 Linux 用户创建自己的存储库来分发软件。 使用 PPA,您可以轻松获取较新的软件版本或官方 Ubuntu 存储库无法提供的软件。 为什么使用PPA? 正如…...

20240724-然后用idea创建一个Java项目/配置maven环境/本地仓储配置
1.创建一个java项目 (1)点击页面的create project,然后next (2)不勾选,继续next (3)选择新项目名称,新项目路径,然后Finsh,在新打开的页面选择…...

PaddleOCR-PP-OCRv4推理详解及部署实现(下)
目录 前言1. 检测模型1.1 预处理1.2 后处理1.3 推理 2. 方向分类器模型2.1 预处理2.2 后处理2.3 推理 3. 识别模型3.1 预处理3.2 后处理3.3 推理 4. PP-OCRv4部署4.1 源码下载4.2 环境配置4.2.1 配置CMakeLists.txt4.2.2 配置Makefile 4.3 ONNX导出4.4 engine生成4.4.1 检测模型…...

【Golang 面试基础题】每日 5 题(二)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

状态模式与订单状态机的实现
状态模式 状态模式(State Design Pattern)是一种行为设计模式,用于在对象的内部状态改变时改变其行为。这种模式可以将状态的变化封装在状态对象中,使得对象在状态变化时不会影响到其他代码,提升了代码的灵活性和可维…...

【MSP430】MSP430是什么?与STM32对比哪个性能更佳?
一、MSP430是什么? MSP430F5529LP是一款由德州仪器(TI)推出的16位微控制器单元(MCU)开发板,具有USB功能,内存配置为128KB闪存和8KB RAM,工作频率高达25MHz。 这款MCU以其高性能和多…...

Win11 操作(四)g502鼠标连接电脑不亮灯无反应
罗技鼠标连接电脑不亮灯无反应 前言 罗技技术💩中💩,贴吧技术神中神! 最近买了一个g502,结果买回来直接插上电脑连灯都不亮,问了一下客服。客服简单的让我换接口,又是下载ghub之类的…...

自定义QDialog使用详解
自定义QDialog使用详解 一、创建 QDialog 对象二、QDialog设置布局三、QDialog控制模态行为3.1 模态和非模态区别3.2 QDialog的模态使用四、使用 QDialogButtonBox五、处理对话框的结果六、使用 QDialog 的信号和槽QDialog是Qt框架中用于创建对话框窗口的基本类。对话框窗口通常…...

Pytorch使用教学2-Tensor的维度
在PyTorch使用的过程中,维度转换一定少不了。而PyTorch中有多种维度形变的方法,我们该在什么场景下使用什么方法呢? 本小节我们使用的张量如下: # 一维向量 t1 torch.tensor((1, 2)) # 二维向量 t2 torch.tensor([[1, 2, 3], …...