老生常谈
1. Java的八种数据类型以及所占用的字节
byte(1) boolean(1) char(2) short(2)int(4) float(4) double(8) long(8)
String是引用数据类型,是final类,不能被继承;
2. 集合
List是存储单列集合,是有序的,不可重复,;
List常用的实现类分为:ArrayList、LinkedList等;
ArrayList:底层的数据是数组,线程不安全,因为每个元素都具有索引,所以查询快,增删慢;
LinkedList:底层的数据结构是链表,线程不安全,增删快,查询慢;特殊方法如下:
addFirst(),removeFirst(),getFirst()
(1)想要线程安全的集合怎么办?
在集合中Vector和HashTable线程是安全的,因为在源码中这两个集合都有synchronized关键字,Collections工具类提供了方法,可以将集合变成线程安全的,代码如下:
Collections.synchronizedList(list)
Collections.synchronizedMap(m)
Collections.synchronizedSet(s)
3. 线程创建的方式
(1)继承Thread类:线程和线程任务是绑定在一起的,创建了四个线程就等于创建了4份资源;
(2)实现 Runnable接口,重写Run方法:线程和线程任务进行了分离,还可以继承其他类;
线程池可以通过Java中的Semaphore来控制,阻塞多个线程与释放多个线程;线程通过semaphore.acquire()方法获取 permit,如果当前线程有permit,则分配给该线程,如果没有则阻塞该线程,直到semaphore通过release()方法释放permit允许的线程数。
4. 手写单列模式:懒汉线程安全
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
5. HashMap:
源码底层是由哈希表数据结构组成,可以存null键、null值,代替了HashTable。一次存一对元素。
存:put(key,value)
取:get(key,value)
取:get(key,value)
6. 堆内存和栈内存
堆内存:线程共有的。由程序员手动分配释放,存放的是由new创建的对象和数组;
栈内存:每个线程私有的,由编译器自动分配释放,存放的是局部变量的值
7. 垃圾回收机制的两种方式
(1)采用标记计数的方法:
给内存中的对象打上标记,对象被引用一次+1,被释放一次-1,当为0的时候就会被回收。
8. 值传递与引用传递的区别
在Java中只有值传递!经常看到对对象的传递,似乎可以改变对象当中属性的值,但实际上这个传入函数的值是对象引用的
拷贝,所以传递的还是按地址值传递的;
9. 重载与重写的区别
重载:在同一个类中,可以具有相同的方法名,但是参数类型和参数个数至少有一个是不同的;
重写:子类继承父类的方法,返回值类型、数据类型和参数个数必须相同,子类方法不能缩小父类方法的访问权限,只能大 于;子类抛出的异常也不能大于父类; 父类方法被定义为final时,子类不能重写;