一、选择题
1、Optional类中有哪些方法?
- 了解Optional类是什么?
答:Optional是Java8引入的新类,为了解决null值判断 的问题。使用Optional类可以避免显示的null值判断。 - 包含哪些方法?
- Optional<T> filter(Predicate<? super T> predicate)
如果存在值,并且改值与给定谓词匹配,则返回描述该值的Optional,否则返回一个空的Optional - T get()
如果值存在,则返回值,否则抛出 NoSuchElementException 。 - static\ Optional <T> of (T value)
返回一个 Optional描述给定的非 null值。 - Optional or(Supplier<? extends Optional<? extends T>> supplier)
如果值存在时,返回一个 Optional描述的值,否则返回一个 Optional通过供给函数产生。 - T orElse(T other)
如果存在值,则返回值,否则返回 other 。
2、守护进程
概念:守护进程是运行在后台的一种特殊的进程,它独立于控制终端并且周期性的进程某种任务或者等待处理某些时间。
守护进程的特点:
- 自成进程组,自成会话,与控制端脱关联
- 守护进程是1号进程,守护进程都是孤儿进程
- 守护进程的命令一般以字符d结尾。
- 守护进程的生命周期是7*24小时不掉线
3、创建守护进程
关键函数调用:setsid(void);
作用:创建一个新的Session
返回结果:1、创建了一个新的Session,当前进程成为Session Leader,当前进程的id就是Session 的id
2、创建了一个新的进程组,该进程称为该进程组的Leader,当前进程的id就是进程组的id
3、失去了控制端的控制权
4、fork两次的原因
第一次:fork作用主要是为了setid服务,因为调用setid的进程不能是进程Leader
第二次:不是必须的,第二次fork是在调用setid之后,目的为了防止进程再打开一个控制终端,打开会话终端的条件是必须是会话Leader,但是如果再fork一下,子进程id就不等于会话id了,这样就不可能打开一个控制终端了。
5、操作系统调度的三个层次
高级调度、中级调度、低级调度
高级调度:外存—>内存(作业调度)
中级调度:外存—>内存,但是这层调度管理的是进程的数据,相当于挂起状态到就绪状态的转换之间的调度。目的是:提高内存的利用率和系统吞吐量。
低级调度:内存—>CPU(进程调度)
6、CIDR概述及其地址块计算
CIDR全称:无分类域间路由选择,CIDR在一定程度上解决了路由表项目过多过大的问题。
CIDR介绍:
例如:已知一个IP地址是:128.14.35.7/20
128.14.35.7/20 = 10000000 00001110 00100011 00000111
最小地址是:128.14.32.0 = 10000000 00001110 00100000 00000000
最大地址是:128.14.47.255 = 10000000 00001110 00101111 11111111
子网掩码是:255.255.240.0 = 11111111 11111111 11110000 00000000
总结就是/后面的就是网络号位数。
7、查看文件内容的命令有哪些
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
8、监听哪些端口号需要root权限
0~1023这1024个端口号是预留端口号,监听是需要root权限
9、Annotation注解
首先Annotation是一个接口,关联一个 RetentionPolicy。就是不同 RetentionPolicy 类型的 Annotation 的作用域不同。关联多个ElementType,意思是可以作用在什么位置上。
常用的内置注解
@Deprecated – @Deprecated 所标注内容,不再被建议使用。
@Override – @Override 只能标注方法,表示该方法覆盖父类中的方法。
@Documented – @Documented 所标注内容,可以出现在javadoc中。
@Inherited – @Inherited只能被用来标注“Annotation类型”,它所标注的Annotation具有继承性。
@Retention – @Retention只能被用来标注“Annotation类型”,而且它被用来指定Annotation的RetentionPolicy属性。
@Target – @Target只能被用来标注“Annotation类型”,而且它被用来指定Annotation的ElementType属性。
@SuppressWarnings – @SuppressWarnings 所标注内容产生的警告,编译器会对这些警告保持静默。
10、构建堆的时间复杂度是O(n)
11、值传递、指针传递、引用传递的区别
- 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
- 指针传递:形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
-引用传递: 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈
中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。
12、Linux的几种内核锁及其作用
- mutex(互斥锁)
- semaphore(信号量)
- rw_semaphore(读写信号量)
- Spanlock(自旋锁)
13、Linux的软硬连接
- 软连接:就像Windows的快捷方式,建立了一个新的node节点,而且软连接的文件大小和源文件不一样。只是维持了到源文件的指向关系,如果删除的源文件,打开软连接文件就会找不到文件,打不开。
- 硬链接:是对源文件做了复制+同步的操作,并且硬链接文件和源文件都指向同一个node节点,如果node节点的指向不为1删除其中一个,只是删除了指向关系,所以删除源文件,硬链接文件还可以打开。
14、((x>4)?99.9:9) 隐式类型转换
(x>4)?99.9:9 编译后可以写成
double x;
if(x > 4) x = 99.9;
else x = 9.0;
因为表达式中有double型的99.9,还有int 型的9。但是运算的时候会向高精度转型。所以x被自动类型转换成double型了。所以输出的是9.0。
二、编程题
第一题:完全背包问题。AC
第二题:全排列问题;给定一个整形数组0~9的序列。例如{1,1,2}。问能整除7的排列有多少种,112和112算两个。
class Solution {
/**
* 返回亲7数个数
* @param digit int整型一维数组 组成亲7数的数字数组
* @return int整型
*/
ArrayList<Integer> list = new ArrayList<>();
public int reletive_7 (int[] digit) {
// write code here
// write code here
//定义一个计数器count
int count = 0;
serch(digit, 0);
for(int n : list) {
if(n % 7 == 0) count++;
}
return count;
}
private void serch(int[] digit, int j) {
if(j == digit.length - 1) {
StringBuilder sb = new StringBuilder();
for(int k = 0; k < digit.length; k++) {
sb.append(digit[k]);
}
list.add(Integer.parseInt(sb.toString()));
} else {
for (int i = j; i < digit.length; i++) {
swap(digit, j, i);
serch(digit, i + 1);
swap(digit, j, i);
}
}
}
private void swap(int[] digit, int i, int j ) {
int temp = digit[i];
digit[i] =digit[j];
digit[j] = temp;
}
}