第一部分是选择题,都不太会做,没印象了。。。
第二部分是填空题,记得一道问了避免线程死锁的四种方法
(1)避免循环等待: 确保线程获取资源的顺序是统一的,这样可以避免多个线程同时持有不同的资源,并试图获取对方已经持有的资源而造成的循环等待。
(2)使用加锁的顺序: 当线程需要获取多个锁时,确保它们以相同的顺序获取锁,可以减少死锁的发生。这样可以避免多个线程因互相持有对方需要的资源而发生死锁。
(3) 设置超时时间: 在获取锁的过程中设置超时时间,在尝试一段时间后没有成功获取锁,则放弃当前的操作,释放已获得的锁,并尝试其他策略,避免长时间等待导致死锁。
(4)死锁检测: 可以定期检测系统中的死锁情况,一旦检测到死锁,可以通过中断或者回滚操作来解除死锁状态。
第三部分是简答题
第一题是翻译题,没法记
第二题是 栈和堆的区别
(1)存储方式:
- 栈(Stack): 栈是一种后进先出(LIFO)的数据结构,用于存储方法调用、局部变量和函数参数等。在程序执行时,每个线程都会有自己的栈空间,其中包含方法调用的参数值、返回地址以及局部变量。
- 堆(Heap): 堆是一种动态分配的内存区域,用来存储程序运行时动态分配的数据。在堆中分配的内存需要手动释放,否则可能导致内存泄漏。
(2)分配方式:
- 栈: 栈上的内存由系统自动分配和释放,是一种自动管理的内存分配机制。
- 堆: 堆上的内存需要手动分配和释放,开发人员需要负责管理堆上的内存分配和释放,否则容易出现内存泄漏或内存溢出问题。
(3)访问速度:
- 栈: 由于栈是连续存储的数据结构,访问速度较快,可以通过指针直接访问。
- 堆: 堆是不连续存储的数据结构,访问速度较慢,需要通过指针间接访问。
(4)生存期:
- 栈: 变量在栈上分配,其生命周期与所在函数的调用关系密切,函数返回时栈上的数据会被自动释放。
- 堆: 堆上分配的数据的生命周期可以比较灵活,需要手动管理内存的分配和释放,因此可以在程序的任何地方使用。
第三题是哈希表,堆排序和快速的时间复杂度,哪种的效率快,什么情况下会导致该排序效率降低
哈希表的时间复杂度为O(n),堆排序的时间复杂度为O(nlogn),快速排序的时间复杂度为O(nlogn)【以上的时间复杂度为平均时间复杂度】。相比较下来哈希表的效率快,当哈希表效率降低的情况包括哈希冲突较多、数据量过大导致哈希表需要重新调整大小等情况。
补充:堆排序效率降低的情况:堆排序的效率并不会因为数据分布的不同而产生较大波动,但堆排序在实现上需要维护堆结构,如果实现不当或者对于大规模数据排序时,可能会占用较多内存空间。
快速排序效率降低的情况:当数据集合已经有序或者接近有序时,快速排序的效率会变差,甚至在最坏情况下时间复杂度为 O(n^2)。此外,快速排序是一种不稳定排序算法,在某些情况下可能会导致效率降低。
第四题是mysql索引的优点和负面影响
优点:
(1)提高查询性能: 索引可以加快数据的检索速度,特别是对于大型数据表而言。通过在列上创建索引,可以减少数据库需要扫描的数据量,从而提高查询效率。
(2)加速数据的排序和分组: 索引不仅可以加快数据的查询速度,还可以加速数据的排序和分组操作。当涉及到排序或分组的操作时,索引可以帮助数据库更快地完成这些操作。
(3)加速表之间的连接: 当多个表之间存在连接操作时,索引可以加速表的连接过程,提高连接查询的效率。
(4)唯一性约束: 索引可以确保某列或某组列的唯一性,可以用于实现主键或唯一键约束,避免出现重复数据。
负面影响:
(1)占用存储空间: 索引需要额外的存储空间来存储索引数据结构,这可能会导致数据库文件变大,占用更多的磁盘空间。
(2)降低写操作性能: 当对表进行插入、更新和删除操作时,除了修改表数据外,还需要更新索引,这会增加写操作的时间和开销。
(3)维护成本高: 随着数据的增删改查,索引需要不断更新和维护,这会增加数据库的维护成本。
(4)可能引发查询优化器选择错误索引: 有时候数据库查询优化器可能会选择错误的索引,导致查询性能下降。
第五部分是编程题
题目:给定一个值sum,在S数组中找到两个值a、b;使得a+b最接近于sum;
思路:
1.将数组中的所有元素两两相加再减去给定的值sum,即a+b-sum
2.将差值添加进ArrayList集合,并对集合进行从小到大排序,此时ArrayList集合的首个元素为最小差值,即a+b与sum最接近
3.遍历数组两两相加减去给定的值sum等于最小差值,此时,相加的两个值即为所求a,b
(备注:如果小伙伴有更好的方法或是优化的代码,可以评论区告诉我一下,让我学习一下,十分感谢!!!)
代码:
package demo;
import java.util.ArrayList;
import java.util.Collections;
public class Demo10 {
public static void main(String[] args){
int[] arr = {1,3, 6,7};
int sum = 10;
int temp;
ArrayList<Integer> chazhis = new ArrayList();
//获取所有差值
for (int i = 0; i < arr.length-2; i++){
int L = i;
int R = arr.length-1;
while (R > L) {
temp = arr[L] + arr[R]-sum;
chazhis.add(Math.abs(temp));
R--;
}
}
//对集合从小到大排序
Collections.sort(chazhis);
//遍历数组,根据最小差值寻找a,b
for (int j = 0; j < arr.length-2; j++){
int L = j;
int R = arr.length-1;
while (R > L) {
temp = arr[L] + arr[R]-sum;
if (Math.abs(temp) == chazhis.get(0)){
System.out.println(arr[L] + "," + arr[R]);
}
R--;
}
}
}
}
自我吐槽:扑街咯,这次笔试也一塌糊涂,对于数据结构还是要多去了解其优缺点,数据库索引得多多了解。笔试代码没写对,说明反应还是慢。