一、单选题
1.Java中,String,StringBuilder和StringBuffer的区别,下面说法错误的是(C)
A 可以修改StringBuilder和StringBuffer的内容
B StringBuilder是非线程安全的
C StringBuffer对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向新的String对象
D 效率比较String < StringBuffer <StringBuilder,但是String s1 = "This is only a " + "simple " + "test"时,String效率最高
2.transient变量和下面哪一项有关(B)
A Cloneable
B Serializable
C Runable
D Throwable
E Comparable
3.以下哪一项可以用来修饰构造方法(E)
A final
B static
C synchronized
D native
E 以上都不可以
4.下面哪几个函数是public void method (){}的重载函数(A、D)
A public void method(int m){}
B public int method(){}
C public void method2(){}
D public int method (int m, float f){}
5.下面不是面向对象的基本原则的是(C)
A 单一职责原则(Single-Resposibility Principle)
B 开放封闭原则(Open-Closed principle)
C 抽象类原则(Abstract-Class principle)
D 依赖倒置原则(Dependecy-Inversion Principle)
E 接口隔离原则()
6.下列哪种异常是检查型异常,需要在编写程序时声明(C)
A NullPointerException
B ClassCastException
C FileNotFoundException
D IndexOutOfBoundsException
7.下面有关JVM内存,说法错误的是(CD)
A.程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的
B.虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的
C.方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的
D.原则上讲,所有的对象都在堆区上分配内存,是线程之间隔离的
8.下面有关Java中HashMap的说法错误的是(C)
A HashMap的实例有两个参数影响其性能:“初始容量”和“加载因子”
B HashMap的实现不是同步的,意味着它不是线程安全的
C HashMap通过开放地址法解决哈希冲突
D HashMap中的key-value都是存储在Entry数组中的
注:HashMap是采用链表法解决冲突
9.下面有关SPRING的事务传播特性,说法错误的是(B)
A PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
B PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常
C PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
D PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚
10.以下关于abstract关键字的说法,正确的是(D)
A abstract可以与final并列修饰同一个类
B abstract类中不可以有private的成员
C abstract类中必须全部是abstract方法
D abstract方法必须在abstract类或接口中
11.“先进先出”的容器是(A)
A 堆栈(Stack)
B 队列(Queue)
C 字符串(String)
D 迭代器(Iterator)
12.下列修饰符中,能够使得某个成员变量只能被它所在包访问到和它的子类访问到的是(A)
A protected
B public
C private
D 不加修饰符
13.关于继承和实现说法正确的是(A)
A 类可以实现多个接口,接口可以继承(或扩展)多个接口
B 类可以实现多个接口,接口不能继承(或扩展)多个接口
C 类和接口都可以实现多个接口
D 类和接口都不可以实现多个接口
14.以下哪一个是不正确的字符常量(D)
A.’\n’
B.‘1’
C.“a”
D.’\101’
15.当一个应用程序的所有非守护线程终止运行时,但仍然有守护线程运行,应用程序将(C)
A 运行
B 阻塞
C 终止
D 休眠
16.下面有关java object默认的基本方法,说法错误的是(B)
A.equals(Object obj)指示某个其它对象是否与此对象"相等"
B.copy()创建并返回此对象的一个副本
C.wait()导致当前的线程等待,直到其它线程调用此对象的notify()方法或notifyAll()方法
D.toString()返回该对象的字符串表示
二、多选题
1.有关静态初始化块的说法正确的是(ABC)
A 无法直接调用静态初始化块
B 在创建第一个实例前或引用任何静态成员之前,将自动调用静态初始化块来初始化
C 静态初始化块既没有访问修饰符,也没有参数
D 在程序中,用户可以控制合适执行静态初始化块
2.下面哪些是Thread类的方法(ABD)
A start()
B run()
C exit()
D getPriority
3.关于ThreadLocal类,以下说法正确的是(DE)
A ThreadLocal继承自Thread
B ThreadLocal实现了Runnable接口
C ThreadLocal重要作用在于多线程间的数据共享
D ThreadLocal是采用哈希表的方式来为每个线程都提供一个变量的副本
E ThreadLocal保证各个线程间数据安全,每个线程的数据不会被另外线程访问和破坏
三、简答题
1.列举你了解的设计模式,并列举单例模式的至少四种写法,且写出其中一种实现?
答:总体来说设计模式分为三大类:
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
单例模式的4种写法:
1)饿汉:
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
缺点:不是线程安全的。
2)懒汉:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
优点:在类装载时实例化,避免了多线程不同步的问题。
缺点:可能没有人调用getInstance()方法也会被实例化,浪费了资源。
3)静态内部类(对饿汉模式的改进):
public class Singleton {
private Singleton(){}
public static class SingletonInner {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInner.INSTANCE;
}
}
跟饿汉不同的是,在Singleton类被装载的时候,不会实例化instance
4)双重校验锁(对懒汉模式的改进):
public class Singleton {
private volatile static Singleton instance;
private Singleton () {}
public static Singleton getInstance ()
{
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
这样达到了线程安全的目的。
注:Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
2.如何解决秒杀的性能问题和超卖?
答:https://www.cnblogs.com/billyxp/p/3701124.html
3.写出一种二叉树的前序遍历算法?
// 前序遍历的递归实现
public void preOrderTraverse(TreeNode node) {
if (node == null)
return;
// 先根节点
System.out.println(node.val);
// 再左孩子
preOrderTraverse(node.left);
// 后右孩子
preOrderTraverse(node.right);
}
设及到的知识点:
1.String,StringBuilder和StringBuffer的区别
答:https://blog.youkuaiyun.com/u011247942/article/details/73603721
2.对象的序列化
答:https://blog.youkuaiyun.com/zyhlwzy/article/details/79868138
3.面向对象的基本原则
答:
- 单一职责原则(Single Responsibility Principle)
每一个类应该专注于做一件事情。 - 里氏替换原则(Liskov Substitution Principle)
超类存在的地方,子类是可以替换的。 - 依赖倒置原则(Dependence Inversion Principle)
实现尽量依赖抽象,不依赖具体实现。 - 接口隔离原则(Interface Segregation Principle)
应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。 - 迪米特法则(Law Of Demeter)
又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。 - 开闭原则(Open Close Principle)
面向扩展开放,面向修改关闭。 - 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)
尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
4.检查性异常
即必须处理(try …catch)的异常
5.JVM内存模型
6.SPRING的事务传播特性
https://www.cnblogs.com/zhangqian1031/p/6542037.html
7.Java修饰符访问权限
8.守护线程
守护线程是一类特殊的线程,它和普通线程的区别在于它并不是应用程序的核心部分,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止;反之,只要有一个非守护线程在运行,应用程序就不会终止。守护线程一般被用于在后台为其他线程提供服务。可以通过调用方法isDaemon()来判断一个线程是否是守护线程,也可以调用方法setDaemon()来将一个线程设为守护线程。