面试时间: 2019-4-2
一、逻辑题
1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?
答:1
2
3
4
5
6
7
820
20/2 = 10
10/2 = 5
5/2 = 2...1
2/2 = 1
1+1 = 2*
2/2 = 1
20 + 10 + 5 +2 + 1 + 1 = 39
ABC三人都喜欢说谎话,有时候也说真话。某天,A指责B说谎话,B指责C说谎话,C说AB两人都在说谎。
后来上帝通过读心术知道其中至少一个人说的是真话。请问谁在说真话?
答:可以先假设A说真话,那么B是说谎的;根据B是说谎的,那么C说的是真话;而C说,AB都说谎,与A说真话相矛盾。所以A说谎。
据此,那么B说的是真话;C说的是谎话。1,11,21,1211,111221,_,下一个数是什么?
答:312211
- 1 读为: 1个1,提取数字11(即为第二个数);
- 11 读为: 2个1,提取数字21(即为第三个数);
- 21 读为: 1个2、1个1,提取数字1211(即为第四个数);
- 1211 读为:1个1、1个2、2个1;提取数字111221(即为第四个数);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33public class Demo {
public static void main(String[] args) {
int count = 6;
String[] str = new String[count];
str[0] = "1";
str[1] = "11";
int j;
StringBuilder result;
for (int i = 2; i < count; i++) {
char[] pri = str[i - 1].toCharArray();
int n;
result = new StringBuilder();
j = 0;
for (n = 0; n < pri.length - 1; n++) {
if (pri[n] == pri[n + 1]) {
j++;
} else {
j++;
result.append(j);
result.append(pri[n]);
j = 0;
}
}
j++;
result.append(j);
result.append(pri[n]);
str[i] = result.toString();
}
for (int i = 1; i <= count; i++) {
System.out.println(i + "个数: " + str[i-1]);
}
}
}
- 一个家庭有两个小孩,其中有一个是女孩,问另一个也是女孩的概率(假定生男生女的概率一样)?
答:
(1/21/2)/(1-1/21/2)
=(1/4)/(3/4)
=1/3 - 假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。
问题是如何只用这2个水壶从池塘里取得3升的水?
答:
- 将5L桶装满水,倒入6L桶,此时6L桶有5L水;
- 再次将5L桶装满水,倒入6L桶,6L水满,5L桶还剩4L水;
- 将6L桶的水倒空,将5L桶中剩余的4L水倒入6L桶,此时6L桶有4L水;
- 将5L桶再次装满水,将6L桶的水注满,5L桶剩余3L水。
全过程用水15L。二、填空题
- 构造函数Constructor是否可被override?_
答:构造器不能被继承,因此不能被重写,但可以被重载(overload) - 基本数据类型包括_
答:byte short int long boolean char float double - static方法内部是否可以调用非static方法?
答:static 方法是静态方法,是属于类的方法,非 static 方法是属于对象的方法 - Java源文件中最多只能有一个_类,其他类的个数不限。
答:public - 是否可以继承String类?
答:不可以,String类被final修饰,不可以修改 - 从线程安全的角度考虑,HashTable是_,HashMap是_
答:安全,不安全 - 用_方法比较两个类型为String的字符串值是否相等
答:equals() - Tomcat的核心配置文件是_
答:/conf/server.xml - Java是通过_来处理内存分配与释放的底层操作
答:jvm虚拟机(可能是此答案) - final StringBuffer a = new StringBuffer(“immutable”);其中a是否可以被修改?
a.append(“broken!”);是否能够编译通过?是否能执行?
答: 不能被修改,可以编译通过,可以执行
三、选择题
下列说法正确的有(C)
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new时执行
D. 一个class只能定义一个constructor关于用关键字private修饰的成员变量,下列说法正确的是(B)
A. 只能被同一个包中的其他类访问
B. 只能被该类自身所访问或修饰
C. 可以被其他包的类访问
D. 可以被其他包中的该类的子类访问下列关于栈的描述中错误的是(B)
A. 栈是先进后出的线性表
B. 栈只能顺序存储
C. 栈有记忆作用
D. 对栈的插入与删除操作中,不需要改变栈底指针下列说法错误的有(BCD)
A. 数组是一种对象
B. 数组属于一种原生类
C. int number=[]={31,23,33,43,35,61}
D. 数组的大小可以任意改变下列异常处理语句编写正确的是(D)
A. try{ System.out.println(2/0);}
B. try(System.out.println(2/0))catch(Exception e)(System.out.println(e.getMessage());)
C. try { System.out.println(2 / 0); }
D. try { System.out.println(2 / 0); }catch (Exception e){ System.out.println(e.getMessage()); }
6.如下描述正确的是(A)
A. 一个java中只能有一个class是public的
B. 如果一个类的构造方法是私有的,那么实例化此类就需要有一个非私有的方法
C. protected的方法无法被子类访问
D. abstract类不可以直接实例化
下列叙述中,正确的是(A)
A. Java语言的表示度是区分大小写的
B. 源文件与public类名可以不相同
C. 源文件拓展名为.jar
D. 源文件中public类的数目不限下面程序的运行结果是(B)
注意:java虚拟机会优化字符串拼接,String str2 = “he” + “llo”;时为true
String str1 = “hello”;
String str2 = “he” + new String(“llo”);
System.err.println(str1==str2);
A. true
B. false
C. 编译不通过
D. 产生运行时异常下面说法正确的是(D)
注意:接口不能被直接实例化,jdk9中接口中可以定义私有方法
A. 用new关键字实例化接口,必须实现接口中的所有抽象放方法
B. 接口中不可以定义私有方法
C. 接口中可以定义私有属性
D. 类可以实现多个接口按照学生平均成绩(avg_grade)将students表中的数据检索出来,下面SQL语句正确的是(ACD)
注意:分组为ORDER BY,不是GROUP BY
A. SELECT FROM students ORDER BY avg_grade
B. SELECT FROM students GROUP BY avg_grade ASC
C. SELECT FROM students ORDER BY avg_grade DESC
D. SELECT FROM students ORDER by avg_grade asc
四、问答以及编程题
- 简述Overload和Override的区别
Override(重写,覆盖):
- 方法名、参数、返回值相同
- 子类方法不能缩小父类方法的访问权限
- 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)
- 存在于父类和子类之间
- 方法被定义为final不能被重写
Overload(重载,过载): - 参数类型、个数、顺序至少有一个不相同
- 不能重载只有返回值不同的方法名
- 存在于父类和子类、同类中
- 简单描述一下什么是抽象类(abstract class)和接口(interface)
- 一个类可以实现多个接口,但是却只能继承最多一个抽象类;
- 抽象类可以包含具体的方法,接口的所有方法都是抽象的;
- 抽象类可以声明和使用字段;接口则不能,但接口可以创静态的final常量;
- 接口的方法都是public的,抽象类的方法可以使public,private,protecte或者是默认的packag;
- 抽象类可以定义构造函数,但是接口不行。
说出下面程序运行的结果
执行结果:static A
static B
I’m A class
HelloA
I’m B class
HelloB1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31class HelloA {
public HelloA() {
System.out.println("HelloA");
}
{
System.out.println("I'm A class");
}
static {
System.out.println("static A");
}
}
public class HelloB extends HelloA {
public HelloB() {
System.out.println("HelloB");
}
{
System.out.println("I'm B class");
}
static {
System.out.println("static B");
}
public static void main(String[] args) {
new HelloB();
}
}第一个人10岁,第2个比第一个人大2岁,依次递推,请用递归方式计算出第8个人多大?
1
2
3
4
5
6
7
8
9
10
11
12public class Demo {
public static void main(String[] args) {
System.out.println(computeAge(8));
}
private static int computeAge(int i) {
if (i == 1) {
return 10;
}
return computeAge(i - 1) + 2;
}
}请阐述一下为什么会出现以下结果
答:main是主线程的线程名,Thread-1是子线程的线程名,Thread.currentThread().getName()是获得当前线程名,当前是主线程,子线程执行的代码是在run()方法中
执行结果:
Main:main
Thread-11
2
3
4
5
6
7
8
9
10
11
12
13public class MultiThread {
public static void main(String[] args) {
MyThread mt = new MyThread();
mt.start();
System.out.println("Main:"+Thread.currentThread().getName());
}
}
class MyThread extends Thread{
public void run(){
System.out.println(getName());
}
}
五、附加题
- 简述Http的请求格式,以及GET和POST的区别
答:
http请求格式:请求行 + 请求头 + 数据体
请求行包含三个内容 method + request-URI + http-version
method 包含有 post , get, head,delete, put, connect, options, patch, propfind, propatch, mkcol, copy, move, lock, unlock, trace, head
GET和POST的区别:
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
- GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
- GET产生的URL地址可以被Bookmark,而POST不可以。
- GET在浏览器回退时是无害的,而POST会再次提交请求。
其实,GET和POST本质上两者没有任何区别。他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。
上述的所谓区别,只是浏览器厂家根据约定,做得限制而已。
HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。
- OPTIONS 返回服务器所支持的请求方法
- GET 向服务器获取指定资源
- HEAD 与GET一致,只不过响应体不返回,只返回响应头
- POST 向服务器提交数据,数据放在请求体里
- PUT 与POST相似,只是具有幂等特性,一般用于更新
- DELETE 删除服务器指定资源
- TRACE 回显服务器端收到的请求,测试的时候会用到这个
- CONNECT 预留,暂无使用
- 简述一下synchronized同步块和同步方法的原理