1.一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。(正确)
2.在开发中使用泛型取代非泛型的数据类型(比如用ArrayList<String>取代ArrayList),程序的运行时性能会变得更好。(错误)
3.
public class Test{
public static void main(String[] args) {
int count = 0;
for (int i = 0; i <= 100 ; i++) {
//count++的值等于多少?其实第一次循环的时候,还是0,然后又把这个值赋给了count。所以count还是0
count = count++;
}
System.out.println(count);
}
}
输出:0
4.重载就是一句话:同名不同参,返回值无关。
覆盖/重写:同名同参
5.
题目:总是为一个类提供了一个默认的构造函数是Java语言的一个重要特性 。
事实上只有在我们没有显示声明任何构造方法时java才会为我们提供一个默认的无参构造函数。
6.
1)jps:查看本机java进程信息。
2)jstack:打印线程的栈信息,制作线程dump文件。
3)jmap:打印内存映射,制作堆dump文件
4)jstat: jstat命令可以查看堆内存各部分的使用量,以及加载类的数量
5)jhat:jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
7.
7.线程安全的类:
Vector/Hashtable/Stack
8.==和三目 运算符,谁的优先级高。答:==
9.基本的Java语言函数存储在以下哪个java包中?java.lang
10.
Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;最难掌握的是round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11
//向上取整
System.out.println(Math.ceil(11.5));//12.0
System.out.println(Math.ceil(-11.5));//-11.0
//向下取整
System.out.println(Math.floor(11.5));//11.0
System.out.println(Math.floor(-11.5));//-12.0
//+0.5后,向下取整
System.out.println(Math.round(11.5));//12
System.out.println(Math.round(-11.5));//-11
11.
类型
| 默认值 | 存储需求(字节) | 取值范围 | 示例 |
byte | 0 | 1 | -2^7—2^7-1 | byte b=10; |
char | ‘ \u0000′ | 2 | 0—2^16-1 | char c=’c’ ; |
short | 0 | 2 | -2^15—2^15-1 | short s=10; |
int | 0 | 4 | -2^31—2^31-1 | int i=10; |
long | 0 | 8 | -2^63—2^63-1 | long o=10L; |
float | 0.0f | 4 | -2^31—2^31-1 | float f=10.0F |
double | 0.0d | 8 | -2^63—2^63-1 | double d=10.0; |
boolean | false | 1 | true\false | boolean flag=true; |
12.下列哪些操作会使线程释放锁资源?
wait()和join()方法
详细介绍这四种(摘自《牛客网》)
1).sleep()方法
在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。
sleep()使当前线程进入阻塞状态,在指定时间内不会执行。
2.wait()方法
在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。
当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。
唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。
waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。
3.yield方法
暂停当前正在执行的线程对象。
yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。
yield()只能使同优先级或更高优先级的线程有执行的机会。
4.join方法
join()等待该线程终止。
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测
13.
Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记 整理 ,局部采用复制
综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
14.springboot的优缺点
优点:
1、项目的一件构建
2、对主流开发框架的无配置集成。
3、项目可独立运行,内置Tomcat无须外部依赖Servlet容器。
4、提供运行时的应用监控。
5、极大的提高了开发、部署效率。
6、与云计算的天然集成。
15.关于mybatis的二级缓存:
https://www.cnblogs.com/happyflyingpig/p/7739749.html
16.反转单链表
public static Node Reverse2(Node head) {
if (head == null) return head;
Node pre = head;// 上一结点
Node cur = head.getNext();// 当前结点
Node tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)
while (cur != null) {// 当前结点为null,说明位于尾结点
tmp = cur.getNext();
cur.setNext(pre);// 反转指针域的指向
pre = cur; // 指针往下移动
cur = tmp;
}
// 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
head.setNext(null);
return pre;
}
17.数组转List
Arrays.asList(strArray);
18.如何让线程按顺序执行?
https://blog.csdn.net/u010185035/article/details/81172767
join 和single
19.单例模式--双重锁模式
package pandy.test.singleton;
/*
* 双重锁模式
*/
public class Singleton {
private volatile static Singleton instance;
private Singleton() {
System.out.println("SingletonDemo has loaded");
}
public static Singleton getInstance() {
if(instance==null) {
synchronized(Singleton.class) {
if(instance==null) {
instance = new Singleton();
}
}
}
return instance;
}
}
20.获取文件中的第一列:
cat file | awk '{print $1}'
21.linux两台服务器之间传输文件
(1)将本地文件拷贝到远程
scp 文件名 用户名@计算机IP或者计算机名称:远程路径
(2)从远程将文件拷回本地
scp 用户名@计算机IP或者计算机名称:文件名 本地路径
22.
经常碰到这样的面试题目:#{}和${}的区别是什么?
网上的答案是:#{}是预编译处理,$ {}是字符串替换。mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。使用 #{} 可以有效的防止SQL注入,提高系统安全性。
对于这个题目我感觉要抓住两点:
(1)$ 符号一般用来当作占位符,常使用Linux脚本的人应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。
(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。
mybatis中的#和$的区别:
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username="111", 如果传入的值是id,则解析成的sql为where username="id".
2、$将传入的数据直接显示生成在sql中。
如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
4、$方式一般用于传入数据库对象,例如传入表名.
5、一般能用#的就别用$,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
6、在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
【结论】在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。
23.什么是阻塞队列?
https://www.jianshu.com/p/4df275facc15
24.Java字节码
https://www.cnblogs.com/lybb/p/9223613.html