采用FIFO(先进先出)页面置换算法,可能会产生 抖动现象:抖动现象是指频繁地进行页面置换,导致系统资源大部分时间用于页面置换而不是实际的计算工作。FIFO算法由于其简单的先进先出特性,可能会导致频繁的页面置换,从而引发抖动现象。
外碎片:外碎片是指分配给进程的内存空间中未被利用的部分。FIFO算法不涉及内存分配,因此不会产生外碎片。
内碎片:内碎片是指内存分配中未被利用的小部分内存。FIFO算法同样不涉及内存分配,因此不会产生内碎片。
Belady现象:Belady现象是指在采用某种页面置换算法时,增加页面数反而导致页面置换次数增加的现象。FIFO算法不会出现Belady现象,因为随着页面数的增加,页面置换次数会减少或保持不变。
Java命名规则
- 标识符:
-
- 标识符可以包含字母、数字、下划线(
_
)和美元符号($
)。 - 标识符不能以数字开头。
- 标识符可以包含字母、数字、下划线(
- 类名:
-
- 通常使用驼峰命名法(CamelCase),每个单词的首字母大写。
- 类名应该简洁、描述性强,并且通常是名词。
- 示例:
Car
,OrderDetails
,UserProfile
。
- 方法名:
-
- 使用驼峰命名法,第一个单词的首字母小写,后续单词的首字母大写。
- 方法名应该是动词或动词短语。
- 示例:
calculateTax
,getUserName
,initializeData
。
- 变量名:
-
- 变量名也使用驼峰命名法,但与方法名不同,变量名的第一个单词首字母小写。
- 变量名应该是描述性的,表明变量的用途。
- 示例:
firstName
,totalAmount
,activeSessions
。
- 常量名:
-
- 常量名通常全部使用大写字母,单词之间用下划线分隔。
- 示例:
MAX_VALUE
,PI
,TEMPERATURE_CELSIUS
。
- 包名:
-
- 包名通常全部使用小写字母。
- 包名应该反映其在文件系统中的位置。
- 示例:
com.example.project
。
- 接口名:
-
- 接口名的命名规则与类名相似,通常也是名词,使用驼峰命名法,每个单词的首字母大写。
- 接口名有时会以"able"或"ible"结尾,如
Runnable
,Accessible
。
- 枚举名:
-
- 枚举名的命名规则与类名相似,通常也是名词,使用驼峰命名法。
- 示例:
Color
,Weekday
。
- 泛型:
-
- 泛型类型通常使用大写字母缩写作为名称。
- 示例:
T
表示类型,E
表示元素,K
表示键,V
表示值。
- 局部变量:
-
- 局部变量可以使用驼峰命名法,但更倾向于简短和描述性强。
- 示例:
i
,result
,temp
。
- 私有变量:
-
- 有时在类内部使用私有变量时,会在变量名前加一个下划线,以区别于公共变量。
- 示例:
_name
,_total
。
- 避免使用Java关键字和保留字:
-
- 不要使用Java的保留字作为标识符。
例:
String #name="aaa";
-
- 在Java中,标识符不能以井号(#)开头,所以这一行编译不通过。
int $age = 100;
-
- 在Java中,标识符可以包含美元符号($),所以这一行可以编译通过。
Double _height = 20;
-
- 在Java中,类名应该首字母大写,所以正确的类名是
Double
而不是double
。此外,Double
是包装类,用于包装基本数据类型double
的值,但在这里应该使用基本数据类型double
。所以这一行编译不通过。
- 在Java中,类名应该首字母大写,所以正确的类名是
double ~temp = 3.14;
-
- 在Java中,标识符不能以波浪号(~)开头,所以这一行编译不通过。
使用到递归的基本算法:
- 排序算法:
-
- 归并排序(Merge Sort):通过递归地将数组分成两半,然后合并排序好的两半。
- 快速排序(Quick Sort):通过递归地选择一个基准值,将数组分为比基准值小和大的两部分,然后对这两部分递归排序。
- 搜索算法:
-
- 二分查找(Binary Search):在有序数组中递归地查找目标值。
- 深度优先搜索(Depth-First Search, DFS):在图或树中遍历节点,通过递归深入每个分支。
- 图算法:
-
- 深度优先搜索(DFS):在图或树中使用递归来遍历节点。
- 广度优先搜索(Breadth-First Search, BFS):虽然通常使用队列实现,但也可以用递归实现。
- 拓扑排序(Topological Sort):在有向无环图(DAG)中,使用递归选择入度为0的节点。
- 动态规划算法:
-
- 某些动态规划问题,如斐波那契数列、组合问题等,可以使用递归加备忘录(Memoization)技术。
- 分治算法:
-
- 许多分治算法,如归并排序、快速排序、二分查找等,本质上都是递归的。
- 树遍历:
-
- 前序遍历(Pre-order Traversal)
- 中序遍历(In-order Traversal)
- 后序遍历(Post-order Traversal)
- 回溯算法:
-
- 用于解决组合问题、排列问题、划分问题等,通过递归地尝试每一种可能的候选解,并回溯。
- 数学计算:
-
- 阶乘(Factorial)
- 斐波那契数列(Fibonacci Sequence)
- 幂(Power)计算,如 xnx n
- 字符串处理:
-
- 字符串反转
- 检查回文字符串
- 递归下降解析器:
-
- 用于编译器设计,用于语法分析。
端口号:
53 - 这是DNS服务的端口号。
80 - 这是HTTP协议的标准端口号。
21 - 这是FTP协议的端口号。
23 - 这是Telnet协议的端口号。
- final类:
-
final
类不能被继承。一旦你将类声明为final
,它就不能有子类。
- 运行时异常:
-
- 运行时异常(RuntimeException)是Java中那些不是由编译器强制检查的异常。这意味着你可以选择捕获它们或者不捕获。
- try块里的return和finally,执行顺序:
-
- 当
try
块中有一个return
语句时,finally
块将在try
块中的return
执行之前执行。finally
块中的代码无论是否有异常抛出都会被执行。finally
块执行完毕后,try
块中的返回值才会被返回。
- 当
- 垃圾回收线程的优先级最高吗:
-
- 不一定。垃圾回收(GC)线程的优先级取决于具体的JVM实现和垃圾回收策略。在某些JVM中,GC线程可能有较高的优先级,但这并不是一个普遍规则。
- 子类强转为父类的话,执行哪个类的方法:
-
- 当子类对象被强制类型转换为父类时,你只能调用父类中定义的方法和属性。子类特有的方法不能通过父类的引用来调用。
- 子类如何继承父类构造函数:
-
- 子类不能直接继承父类的构造器。但是,子类的构造器可以通过
super
关键字调用父类的构造器。
- 子类不能直接继承父类的构造器。但是,子类的构造器可以通过
- string作为函数参数的话,修改能否传出函数:
-
- 在Java中,
String
是不可变的。即使你在函数内部修改了String
对象,这个修改也不会反映到函数外部。函数外部看到的仍然是原始字符串。
- 在Java中,
- random的nextInt:
-
Random
类的nextInt()
方法返回一个随机的整数。你可以传递一个整数参数给nextInt(int bound)
来限制随机数的范围。
- forward和redirect:
-
forward
是服务器端的重定向,请求从客户端直接转发到服务器的另一个资源。redirect
是客户端的重定向,服务器告诉客户端去请求另一个URL。
- 用例的几种关系,例如聚合、包含:
-
- 在用例图中,用例之间的关系包括包含(include)、扩展(extend)、泛化(generalization)等。
- 包含关系表示一个用例(基础用例)在其执行过程中会调用另一个用例(被包含用例)。
- 扩展关系表示一个用例在某些条件下可以增加额外的行为到另一个用例(被扩展用例)。
- 分布式数据库的CAP原则:
-
- CAP原则指的是分布式系统最多只能同时满足以下三个属性中的两个:一致性(Consistency)、可用性(Availability)和分区容忍性(Partition tolerance)。
- 一致性意味着数据在多个节点间保持同步。
- 可用性意味着系统在任何时候都能响应用户的请求。
- 分区容忍性意味着系统能够容忍网络分区,即网络中的一部分节点无法与其他节点通信。
在操作系统中,程序的装入方式决定了程序在内存中的存储方式。
动态运行时装入:
- 这种方式涉及到在程序执行时动态分配内存,这可能允许程序部分被装入到不连续的内存区域。
绝对装入:
- 绝对装入意味着程序被装入到内存的一个固定位置,通常要求程序在一块连续的内存区域中。
动态链接时装入:
- 动态链接允许程序在运行时链接某些库,但这并不意味着程序会被装入到不连续的内存区域。动态链接通常还是需要一定的内存连续性。
可重定位装入:
- 可重定位装入是指程序可以被装入到内存的任何位置,但这通常也是在连续的内存区域中进行。
在内存只有4KB的ATM机上,对2,000,000笔交易进行排序时,需要考虑排序算法的内存使用效率和数据的特性。考虑到数据量远超过内存容量,需要使用一种能够利用外部存储(如硬盘)的排序算法。(C)
A. 桶排序:
- 桶排序在处理大量数据时非常有效,特别是当数据分布比较均匀时。它通过将数据分散到多个"桶"中,然后对每个桶内的数据进行排序。桶排序适合于内存不足的情况,因为它可以减少对内存的需求。
B. 堆排序:
- 堆排序是一种高效的内部排序算法,它使用数组来维护堆结构。但是,对于大量数据且内存有限的情况,堆排序并不理想,因为它需要较多的内存来维护堆。
C. 归并排序:
- 归并排序是一种高效的外部排序算法,适合于数据量大于内存容量的情况。它通过将数据分成较小的部分进行排序,然后合并这些部分。归并排序适合于内存有限的情况。
D. 插入排序:
- 插入排序是一种简单的内部排序算法,它适合于小数据集或基本有序的数据集。然而,对于大量数据,插入排序效率较低,且内存使用上没有特别优势。
分布式事务的2PC(两阶段提交)模式是一种确保分布式系统中所有节点在提交事务前达成一致的协议。
A. 将事务处理的同步阻塞操作变为异步操作:
- 错误。2PC模式实际上是一个同步阻塞协议。在第一阶段(准备阶段),事务协调者(事务经理)要求所有参与者准备提交或中止事务,所有参与者必须等待所有其他参与者的响应。
B. 以牺牲可用性为代价来保证数据的一致性:
- 正确。2PC确保了事务的原子性,在整个准备阶段,所有参与者都被锁定,这可能导致资源利用率低和性能下降,特别是在网络分区或参与者失败的情况下。
C. 适用于高并发场景:
- 错误。2PC由于其同步阻塞的特性,在高并发场景下可能会导致性能瓶颈。
D. 将分布式事务拆分成本地事务后再进行处理:
- 错误。2PC并不是将分布式事务拆分成本地事务,而是通过协调者来确保所有参与者在同一时间提交或回滚事务。
近日总结:
饮一壶茶,嗅嗅浓郁的兰花香,欣赏澄澈的茶色
思来想去,还是提笔写了下来。
果然,人在情绪低迷的时候最容易变成文艺的支配者。
不过在此之前,还是要说一句,人总是在给自己找罪受。
以前总是听到人生百色这四个字,现在看来,人生确实是百色的。
人生总有各种酸甜苦辣咸,喜怒哀愁。
人这个生物很奇怪,明知道撞上墙会被挡下,还会受伤,可还是会拼了命的去撞。
好像这样撞下去墙真的会被自己撞破一个洞似的。
而养伤的这段时间又是叫苦不迭,又是悔恨,又是追悔莫急,可当再次看到那面墙,还是会义无反顾的撞上去,再次变得头破血流。
仔细品味一下,人生好像真的如此。
最近有些迷茫,不仅是对未来感到迷茫,还对自己感到迷茫。
我觉得自己就像是海上浮浮沉沉的浮标,被一根细细的绳子束缚,头顶上黑云重重的压下来,喘不过气。
我突然不明白了人生的意义在哪里,即便是突然有一天有了一份自己心仪的工作,但是一个人来到陌生的城市,要在这里生活很多年。
那很多年之后呢,是又陷入迷茫还是会有另一番新的感悟。
这些我都不知道,目前的我不知道,我还在处于最开始迷茫的这个阶段。
就好像是人生突然失去了方向,指明方向的灯塔突然坍塌。
我只记得了来的时候的方向与预计奔向的方向,却遗忘了此刻的我最想要的是什么。