面试题整理笔记(一)

(本文的面试题时java高级交流群,群主梅小西提供)
基础:
String类能被继承吗,为什么?
不能被继承,String类是由final关键字修饰的,不能被继承,也是为了防止String被别人小心或者故意继承
String,Stringbuffer,StringBuilder的区别?
String被称之为不可变对象,String的不可变是指value对象的不可变,char[] value对象的不可变。而stringbuffer和stringbuilder的value对象是可变的,但是stringBuffer是线程安全的,stringbuilder不是线程安全的。

ArrayList和LinkedList有什么区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.

类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序
类的装载 -> 链接(验证 -> 准备 -> 解析) -> 初始化 -> 对象实例化。

1父类的静态初始化域,(需要注意的是,类初始化之前,类已经被实例化了)
2子类的静态初始化域,(先进行成员变量初始化再进行自身的初始化,后执行static代码块当中的内容)
3父类的非静态初始化域,(先执行隐式的构造代码,再执行构造方法中的代码 这里隐式的构造代码包括了{}代码块中的代码,以及实例成员变量声明中的初始化代码,以及父类的对应的代码)
4父类的构造函数,
5子类的非静态初始化域,
6子类的构造函数

public class TestList {
public static void main(String[] args){
T t = new T(“init”);
}
}

class T implements Cloneable{
public static int k = 0;
{
System.out.println(“从第一行开始执行到现在”);
}
public final static T t1 = new T(“t1”);

public static T t2 = new T("t2");
public static int i = print("i");
public static int n = 99;

public int j = print("j");
{
    print("构造快");
}

static {
    print("静态块");
}

; public T(String str) {
System.out.println((++k) + “:” + str + ” i=” + i + ” n=” + n);
++n; ++ i;
}

public static int print(String str){
    System.out.println((++k) +":" + str + "   i=" + i + "   n=" + n);
    ++n;
    return ++ i;
}

从第一行开始执行到现在
1:j i=0 n=0
2:构造快 i=1 n=1
3:t1 i=2 n=2
从第一行开始执行到现在
4:j i=3 n=3
5:构造快 i=4 n=4
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
从第一行开始执行到现在
9:j i=8 n=100
10:构造快 i=9 n=101
11:init i=10 n=102

用过哪些Map,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如hashcode,扩容等
HashMap(线程不安全)
Hashtable(线程安全,效率低,建议用使用concurrentHashMap)
TreeMap(有序)
WeakHashMap(用来构建缓存,弱引用)
ConcurrentHashMap(线程安全啊,效率高与hashtablel,volatile和writeLock结合使用的典范,并且将锁得到粒度拆分的足够小)

  1. 什么时候会使用HashMap?他有什么特点?
    是基于Map接口的实现,存储键值对时,它可以接收null的键值,是非同步的,HashMap存储着Entry(hash, key, value, next)对象。
  2. 你知道HashMap的工作原理吗?
    通过hash的方法,通过put和get存储和获取对象。存 储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前 bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调 用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。
  3. 你知道get和put的原理吗?equals()和hashCode()的都有什么作用?
    通过对key的hashCode()进行hashing,并计算下标( n-1 & hash),从而获得buckets的位置。如果产生碰撞,则利用key.equals()方法去链表或树中去查找对应的节点
  4. 你知道hash的实现吗?为什么要这样实现?
    在Java 1.8的实现中,是通过hashCode()的高16位异或低16位实现的:(h = k.hashCode()) ^ (h >>> 16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销。
  5. 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?
    如果超过了负载因子(默认0.75),则会重新resize一个原来长度两倍的HashMap,并且重新调用hash方法。

抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么
抽象类方法可以实现,接口当中的方法只能声明,接口可以继承多个接口,类可以实现多个接口。
什么情况下会发生栈内存溢出
线程栈当中存在递归调用,存在死循环或者大量的循环,全局变量,调用的类数组,list,map过于大;
什么是nio,原理
new io,buffer,channel,selector

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值