1,hashMap与hashTable区别
使用Entry数组来实现hash表
hashTable是线程安全的,hashMap不是,但是hashTable已基本废弃,如果要使用同步的话可以使用concurrenthashmap或者使用其他方法,这里可以深入探究;
hashMap支持null键和null值
2,JVM启动过程
一:JVM装入环境,JVM提供的方式是操作系统的动态连接文件.
二:装载JVM.dll
三:初始化JVM,获得本地调用接口
四:运行Java程序
这方面需要加深理解
3,怎么避免死锁
1,加锁顺序
2,加锁限时
3,死锁检测
4,synchronized同步方法和同步代码块的区别
同步代码块获取一个对象的监视器,更加灵活;
同步方法相当于在获取this这个对象的监视器;
非静态的同步方法是锁定类的实例,静态的同步方法是锁定类的。
5,java new 一个对象的的过程
分配内存空间;
初始化对象置为0;
设置必要的对象信息(对象头中的一些信息);
Java程序执行init进行初始化赋值。
6,如何判断一个单向链表是不是循环链表(不能更改链表的状态)
用两个指针,一个指针一次跳一步,另一个指针一次跳两步,如果它们能相遇,说明存在环。
如何将一个单向链表反转?
8,排序算法代码实现过程
9,sleep(),wait(),notify(),notifyAll()
sleep()不会释放对象锁,wait()会释放对象锁。
notify()唤醒wait()阻塞住的线程,但并不立即释放对象锁,需要等synchronized代码块执行完或者wait()方法调用来释放对象锁。
notifyAll()唤醒所有等待的线程。
10,StringBuffer和StringBuilder的区别
12,如何书写一个单例模式
public class Singleton4 {//我们通过volatile声明变量来禁止指令重排序
private Singleton4(){}
private static volatile Singleton4 single;
public static Singleton4 getInstance(){
if(single==null){
synchronized (Singleton4.class) {
if(single==null)
single=new Singleton4();
}
}
return single;
}
}
13,ArrayList和LinkedList比较以及适用于什么场景
ArrayList查询更快,LinkedList插入删除更快。
原因:ArrayList是基于索引的数据结构,插入删除需要更新索引,更改数组大小等,尽量给定合适的初始大小,
14,equals()和hashcode()的关系。
equals()方法未重写的话,比较的是两个对象地址是否相等,即是否是同一个对象,和==效果一样。
一般我们覆盖equals()方法,来比较两个对象的内容是否相等。
hashCode(),获取对象hash码,确定对象在散列表中的存储位置,散列表包括hashMap,hashTable,hashSet.
hashCode()只有在对象需要存储在散列表中才起作用。
如果对象不存储在散列表的数据结构中,equals()和hashcode()没有任何关系,
如果需要存储在散列表的数据结构中,重写equals方法,一定也要重写hashcode方法。
原因:在散列表中,hashcode相同的两个对象,equals不一定相同
equals相同,hashcode一定要相同
hashcode相同是equals相同的必要条件,那么在散列表添加的时候先判断一下hashcode是否相同,如果hashcode不相同,equals即使相同也不起作用,例如hashSet中可能存在重复元素。
当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
15,哪些Java集合不允许具有重复元素
Set < E > 是一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。
16,字符串常量池,运行时常量池,class文件常量池,intern()方法,它们之间的关系
直接使用双引号声明出来的String对象会直接存储在字符串常量池中.
API中描述如下:
public String intern()
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。
返回:
一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
注意:jdk7 以后字符常量池不在Perm区域了,这块做了调整。字符串常量池中不需要再存储一份对象了,可以直接存储堆中的引用。
18,java异常分类,RuntimeException和Exception关系
runtimeException(运行时异常):是未检查异常,程序员的错,不需要try..catch...或者throws处理。
19,final关键字的作用及用法
修饰类:该类不能被继承
修饰方法:明确禁止该方法在子类中被覆盖
修饰变量:对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
20,静态代码块,构造代码块,构造函数。
静态代码块在类加载时被执行,只执行一次;构造代码块依托构造函数,但先于构造函数执行。
单个类时:静态代码块>构造代码块>构造函数
父子类使用时:1,new一个父类对象(代码在子类中执行,会加载子类),父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数
2,new一个子类对象,父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数,子类构造代码块,子类构造函数。
3,new一个父类对象,接着new一个子类对象。父类静态代码块,子类静态代码块,父类构造代码块,父类构造函数,父类构造代码块,父类构造函数,子类构造代码块,子类构造函数
网友评论