1.值传递和引用传递的区别
答:(1)值传递仅仅是传递的值;(2)引用传递,传递的是地址值;(3)Java 语言的方法调用只支持参数的值传递。
2.eqauls 方法和 hashCode 方法的区别
答:(1)如果两个对象相同(equals 方法返回true),那么它们的 hashCode 值一定要相同;(2)如果两个对象的 hashCode 相同,它们并不一定相同。
3.String类是final类,因此不能继承。
4.Java 平台提供了两种类型的字符串
答:String 和 StringBuffer/StringBuilder,它们可以储存和操作字符串。其中 String 是只读字符串,也就意味着 String 引用的字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象可以直接进行修改。在线程安全上,StringBuilder适用于单线程,线程不安全的,而StringBuffer适用于多线程,线程安全的。
5.栈 堆 常量池的区别
答:栈:由JVM分配区域,用于保存线程执行的动作和数据引用。堆:由JVM分配的,用于存储对象等数据的区域。常量池constant pool :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。
6.final关键字的用法
答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
7.sleep()和wait()的区别
答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态,请参考第 66 题中的线程状态转换图)。wait()是 Object 类的方法,调用对象的 wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的 notify()方法(或 notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。
8.实现多线程有两种实现方法:
答:一种是继承 Thread 类;另一种是实现 Runnable 接口。两种方式都要通过重写 run()方法来定义线程的行为,推荐使用后者,因为 Java 中的继承是单继承,一个类有一个父类,如果继承了 Thread 类就无法再继承其他类了,显然使用 Runnable接口更为灵活。
9.事务的 ACID:
答:原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;一致性(Consistent):事务结束后系统状态是一致的;隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
10.获取一个类对象的方法
答:方法 1:类型.class,例如:String.class,方法 2:对象.getClass(),例如:"hello".getClass(),方法 3:Class.forName(),例如:Class.forName("java.lang.String"
11.HashMap 的工作原理
答:HashMap map = new HashMap();底层创建了长度为 16 的 Entry 数组向 HashMap 中添加 entry1(key,value),需要首先计算 entry1 中 key 的哈希值(根据 key 所在类的 hashCode()计算得到),此哈希值经过处理以后,得到在底层 Entry[]数组中要存储的位置 i.如果位置 i 上没有元素,则 entry1直接添加成功。如果位置 i 上已经存在 entry2(或还有链表存在的 entry3,entry4),则需要通过循环的方法,依次比较 entry1 中 key 和其他的 entry 是否 equals.如果返回值为 true.则使用 entry1 的 value 去替换 equals 为 true的 entry 的 value.如果遍历一遍以后,发现所有的 equals 返回都为 false,则 entry1 仍可添加成功。entry1 指向原有的 entry 元素。
12.ArrayList Vector 和LinkedListed的区别
答:都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 中的方法由于添加了 synchronized 修饰,因此 Vector是线程安全的容器,但性能上较 ArrayList 差,因此已经是 Java 中的遗留容器。LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector 属于遗留容器(Java 早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties 都是遗留容器),已经不推荐使用,但是由于 ArrayList和 LinkedListed 都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类 Collections 中的 synchronizedList 方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。
13.HashMap:
答:①作为 Map 的主要实现类②线程不安全的③可以存储 null 的 key 和 value;Hashtable:②Map 的古老实现类②线程安全的③不可以存储 null 的 key 和 value
14.list的三个子类:
答:ArrayList:是 List 的主要实现类;线程不安全,效率高;底层使用 Object[]存储;Vector:是 List 的古老实现类;线程安全,效率低;底层使用 Object[]存储;LinkedList:底层使用双向链表存储,线程不安全;对于频繁的插入、删除操作,使用此类效率高。