为什么要用close()
在 Java 中,使用 close()
方法是为了正确地管理系统资源,尤其是在处理外部资源(如文件、网络连接或数据库连接)时。这个方法的目的是通知系统这些资源不再需要,可以被释放或关闭。以下是使用
close() 的几个关键原因:
释放资源:
打开的文件、网络连接和数据库连接等都是有限的系统资源。不释放这些资源可能会导致资源耗尽,影响程序的稳定性和性能。
避免数据丢失:
对于输出流,例如写入文件或网络套接字的流,close()
方法通常确保所有缓冲的数据被刷新到目标中。这样可以避免在程序结束时数据丢失。
防止内存泄漏:
打开的资源如果没有被关闭,可能会在内存中持续占用空间,导致内存泄漏。
符合好的编程习惯:
使用 close()
方法是一种好的编程实践,有助于维护代码的清晰度和可维护性。
遵守操作系统和数据库限制:
操作系统和数据库通常对可以打开的文件和连接数量有限制。不关闭资源可能导致后续操作因达到限制而失败。
线程安全和多用户操作:
在多线程环境或多用户应用中,正确关闭资源有助于管理并发访问,避免潜在的冲突和错误。
使用
try-with-resourc ...
Java浅拷贝与深拷贝的理解
定义
浅拷贝:只是增加了一个指针指向已存在的内存地址。
深拷贝:增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存。
浅拷贝的方法
在Java中,浅拷贝(Shallow
Copy)是指仅复制对象的顶层结构,而不递归地复制它包含的任何对象引用。浅拷贝创建了一个新对象,但其字段引用的是原始对象中相同的对象和数组。以下是Java中常用的几种浅拷贝方法:
1. 使用 clone() 方法
如果一个类实现了 Cloneable 接口,可以通过覆盖
Object 类的 clone() 方法来实现浅拷贝。
public class MyObject implements Cloneable {
private int data;
public MyObject clone() {
try {
return (MyObject) super.clone();
} catch (CloneNotSupportedException e) {
...
关于链表的几道经典题目
前言
关于链表的基础结构本文不做过多的阐述,介绍可以参考Hello算法
。
设计链表
题目 707.
设计链表
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next
。val 是当前节点的值,next
是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev
以指示链表中的上一个节点。假设链表中的所有节点下标从 0
开始。
实现 MyLinkedList 类:
MyLinkedList() 初始化 MyLinkedList
对象。
int get(int index) 获取链表中下标为 index
的节点的值。如果下标无效,则返回 -1 。
void addAtHead(int val) 将一个值为 val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
void addAtTail(int val) 将一个值为 val
的节点追加到链表中作为链表的最后一个元素。
void addAtIndex(int index, int val) 将一个值为
val 的节点插入到链表中下标为 i ...
数组[2]-滑动窗口-长度最小的子数组
长度最小的子数组
leercode链接
题目描述
给定一个含有 n 个正整数的数组和一个正整数
target 。
找出该数组中满足其总和大于等于 target 的长度最小的
连续子数组
[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回
0 。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4]
输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0
思路
本题的暴力解法思路是两个for循环,时间复杂度是O(\(n^2\))。对于数组的两个for循环问题,我们通常想到的是否能一个for循环解决问题。前一篇博客提到使用快慢指针,其本质是双指针。那么这道题思考一下是否也能用双指针来解决。
本题需要我们找出最小的连续序列,那么可以想到 ...
数组[1]-快慢指针- 移除元素
移除元素
leetcode链接
题目描述
给你一个数组 nums 和一个值 val,你需要
原地
移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并
原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
int len = removeElement(nums, val);
// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
示例 1:
输入:nums = [ ...
如何确定二分查找的边界
关于二分查找的基础知识
使用二分查找的先决条件是,被查找序列必须是单调有序。基本思路如下:
假设查找序列为升序,那么首先计算出中间位置元素的值,并于目标值进行比较,本元素比目标值小,那么继续在本元素的右边序列进行二分查找。
整体思路看起来不难,但重点是考察查找边界的确定。下面我将解释两种二分查找的边界确定思路。
方法一:左闭右闭 [left,
right]
左闭右闭的主要意义在于:
每次查找的时候左右区间下标表示的值都要取到
因为都要取,所以left = right是有意义的
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; //最右值被取,size-1才表示最后一个值
while (left <= right) { //left = right有意义
int middle = le ...
编程思想与游戏音频设计中的回调(Callback)
【开坑未写完】
音频编码格式与游戏音频
前言
音频编码格式顾名思义是对音频编码的方式,需要注意的是与音频文件格式进行区分。音频文件格式可以理解成是一种容器用于存储音频数据,例如".wav"音频文件通常使用PCM音频编码格式,而".mp3"文件则是使用mp3音频编码格式。
音频编码格式基本概念
音频编码格式可以分为三类:
未压缩(uncompression)
无损压缩 (lossless compression)
有损压缩 (lossy compression)
未压缩
定义:
未压缩音频表示音频文件的所有数据都是原始录音捕获的数据,没有任何的数据丢失和减少。
特点:
高质量:保持原始音频录制的质量。
大文件大小:由于没有数据被移除或减少,导致文件体积较大。
广泛兼容:通常与各种播放系统更加通用兼容。
例:如WAV和AIFF格式。
用途:
通常用于专业音频设置中,保持最高质量至关重要,例如在音乐制作、声音设计和录音室中。
无损压缩
定义:
无损压缩涉及减小音频文件的大小,同时不损失任何质量。可以从压缩数据完美重建原始数据。
特点:
质量保持:与有损压缩不同,保持与原始音频相同的质量。
减小文件大小:与未压 ...
音频元数据Metadata
什么是音频元数据(Metadata)
音频元数据(Metadata)用于描述音频文件的信息,这些元数据通常嵌入在音频文件中或与音频文件一起存储,以帮助使用者识别、组织和管理音频内容。数据的种类主要取决于文件的格式。
常见Metadata类型
标题和艺术家信息
专辑信息
时长
音频格式
比特率
采样率
通道数:例如单声道(Mono)、立体声道(Stereo)
风格和流派
歌词
评论和标签
音频元数据的标准格式
Metadata通常以一定的标准格式进行存储,例如ID3标签、APE标签或Vorbis注释等。并且不是所有的格式的音频文件都可以存储Metadata。
能储存metadata的音频文件格式有:
.wav
.mp3
.ogg
.wma
.flac
.aac
如何修改音频文件中的Metadata
音频编辑器导出设置(Reaper)
许多编辑器和DAW在导出音频文件是能对文件的Metadata进行设置,本文以Reaper为例。
依次File->Render..打开reaper导出文件的界面,如图:
image1
默认Metadata选项是关闭的,我们只需要打开即可对 ...
【转载】对数字音频领域中 采样率 比特深度 动态范围 比特率 的理解
对数字音频领域中 采样率 比特深度 动态范围 比特率 的理解 -
卡芙小轩的文章 - 知乎 https://zhuanlan.zhihu.com/p/40828783