a) 九种基本数据类型的大小,以及他们的封装类
boolean 取值只有true 和 false,大小为1bit(1字节byte = 8bit) 封装类为Boolean
char char在Java中是2byte(16bit),因为Java用的是Unicode 封装类为Character
byte byte大小为8bit 封装类Byte
short short大小为16bit 封装类Short
int int 大小为32bit 封装类Integer
long long 大小为 64bit 封装类Long
float float 大小为 32bit 封装类Float
double double 大小为 64bit 封装类Double
void Void 类是一个不可实例化的占位符类 封装类Void
b) Switch能否用string做参数,equals与==的区别
开发过程中,java中的switch功能不支持字符串作为条件。使用枚举可以解决这个问题。
import java.util.Scanner; public class switchUseString { @SuppressWarnings("resource") public static void main(String[] args) { Scanner sc = new Scanner(System.in); String day = sc.nextLine(); switch (Day.toDay(day.toUpperCase())) { case SUNDAY: System.out.println("星期天"); break; case MONDAY: System.out.println("星期一"); break; case TUESDAY: System.out.println("星期二"); break; case WEDNESDAY: System.out.println("星期三"); break; case THURSDAY: System.out.println("星期四"); break; case FRIDAY: System.out.println("星期五"); break; case SATURDAY: System.out.println("星期六"); default: break; } } public enum Day{ SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY; public static Day toDay(String str){ return valueOf(str); } } }
基本数据类型的比较,应用双等号(==),比较的是他们的值。
引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
复合数据类型(类)用(==)表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
复合数据类型之间进行equals比较,表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
第三个例子,两个对象均不是new出来的,它们其实指向的是同一个地址
c) Object有哪些公用方法,一些特性,Hashcode的作用
boolean equals(Object obj) //指示其他某个对象是否与此对象“相等”。
Class<?>
getClass() //
返回此
Object
的运行时类。
int hashCode() //返回该对象的哈希码值。非常重要的一个函数,和equals()方法一样重要,建议去看源码。
void notify() //唤醒在此对象监视器上等待的单个线程。
void notifyAll() //唤醒在此对象监视器上等待的所有线程。
String toString() //返回该对象的字符串表示。
void wait() //在其他线程调用此对象的 notify()
方法或 notifyAll()
方法前,导致当前线程等待。
void wait(long timeout) // 在其他线程调用此对象的 notify()
方法或 notifyAll()
方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout, int nanos)//在其他线程调用此对象的 notify()
方法或 notifyAll()
方法,或者其他某个线程中断当前线程,或者已超 过某个实际时间量前,导致当前线程等待。
equals() :默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址 (是不是同一个对象)
要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。。equals方法 用于比较对象的内容是否相等(覆盖以后)
HashCode:hashcode方法一般只有在集合中用到。当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等)。
将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意元素的hashcode值是否相等,如果不相等直接将该对象放入集合中。如果 hashcode值相等,就再通过equals方法判断要放入对象与集合中的任意对象是否相等,如果equals判断不相等,直接将该元素放入到集合中,否则不放入。
d) Java的四种引用,应用场景
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
强引用:是使用最普遍的引用。如果一个对象具有强引用,那就类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
软引用:如果一个对象只具有软引用,那就类似于可有可物的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
弱引用:如果一个对象只具有弱引用,那就类似于可有可物的生活用品。 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
虚引用:"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
e) ArrayList、LinkedList、Vector的区别,各自的应用场景
f) String、StringBuffer与StringBuilder的区别
g) Map、Set、List、Queue、Stack的特点与用法
h) HashMap和HashTable的区别,各种的用法
i) HashMap和ConcurrentHashMap的区别,HashMap的底层源码
j) TreeMap、HashMap、LindedHashMap的区别,应用场景
k) ConcurrentHashMap 和HashTable的区别
l) Collection包结构,与Collections的区别
m) Excption与Error包结构。OOM、SOF中各自遇到过哪些情况
n) Override和Overload的含义去区别
o) Interface与abstract类的区别
p) Static class 与non static class的区别
q) Java中锁的等级:方法锁、对象锁、类锁
r) Concurrent包了解
s) wait()和sleep()的区别,foreach与正常for循环效率对比
t) Java IO与NIO
u) 反射的作用于原理
v) 泛型常用特点,List<String>能否转为List<Object>
w) 解析XML的几种方式的原理与特点:DOM、SAX、PULL
x) Java与C++对比, Java1.7与1.8新特性
y) JNI的使用
z) 面向对象、泛型相关知识