Java面试笔试相关琐碎知识点,整理,持续更新。。。直到拿到offer。。。
1. 静态块:用static声明,JVM加载类时执行,仅执行一次
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法
父类静态成员和静态块、子类静态成员和静态块、父类构造方法、子类构造方法
静态块按照声明顺序执行。
2. A.java用来运行一个.class文件,java test(不加.class后缀)
B.javadoc用来生成api文档
C.jar用来生成jar包
D.javac用来把.java文件编译为.class文件,java test.java(加.java后缀)
3. java的垃圾回收机制是对象被赋值NULL,该对象就成为可回收对象。
4. 继承Thread,若不执行start()而是执行run(),则只是方法调用,并不是启动一个线程。
5. 静态变量只能在类主体中定义,不能在方法体中定义。
6. JDK中提供的java、javac、jar等开发工具也是用Java编写的。
7. String类重写了equals方法,类型不同返回false。
8. 一个java文件中包括内部类可以有多个publicclass
9. 单例模式:构造函数私有和唯一实例的特点
10. Servlet的体系结构
11. 构造方法不能被子类继承,final修饰没意义。
12. JVM中一个字节以下的整型数据会在JVM启动的时候加载进内存,除非用new Integer()显示创建对象,否则都是同一个对象。
13. JDBC中,创建Statement是不传参的,PreparedStatement是需要传入SQL语句的。
14. 构造方法不需要同步化,子类可以覆盖父类的同步方法。
15. 方法可以和类同名,和构造方法唯一区别是构造方法没有返回值。
16. vector是线程安全的,所以效率低,ArrayList不是线程安全。线程安全还包括statck、enumeration、hashtable(hashmap不是线程安全),其他基本都是非线程安全的类和接口。
17. j=j++;//相当于temp=j;j=j+1;j=temp;,java用了中间缓存机制。
18. System.out.println(false?10.9:9);输出9.0,后面的9自动类型转换为double。当后两个表达式有一个是常量表达式,另外一个类型是T时,常量表达式可以被T表示时,输出结果仍然是T类型。
19. HashMap,TreeMap 未进行同步考虑,是线程不安全的。
HashTable 和 ConcurrentHashMap 都是线程安全的。区别在于他们对加锁的范围不同,HashTable 对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。
Collections 类提供了synchronizedXxx()方法,可以将指定的集合包装成线程同步的集合。比如,
List list =Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(newHashSet());
20. 实现抽象方法需要有两同两小一大原则:方法名相同,参数类型相同。子类返回类型小于等于父类方法返回类型,子类抛出异常小于等于父类方法抛出异常,子类访问权限大于等于父类方法访问权限。
21. wait()、notify()和notifyAll()是 Object类 中的方法;Condition是在java 1.5中才出现的,它用来替代传统的Object的wait()、notify()实现线程间的协作,相比使用Object的wait()、 notify(),使用Condition1的await()、signal()这种方式实现线程间协作更加安全和高效。
22. 数值型变量在默认情况下为Int型,byte和short型在计算时会自动转换为int型计算,结果也是int 型。所以a1*a2的结果是int 型的。
23. 解决哈希冲突常用的两种方法是:开放定址法和链地址法
开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。
链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。
24. 使用匿名内部类时,必须继承一个类或实现一个接口
匿名内部类由于没有名字,因此不能定义构造函数
匿名内部类中不能含有静态成员变量和静态方法
25. 对于Integer var = ? 在-128 至127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals 方法进行判断。
26. intValue()是把Integer对象类型变成int的基础数据类型;
parseInt()是把String 变成int的基础数据类型;
Valueof()是把String 转化成Integer对象类型;
27. 对于外部类来说,只有两种修饰,public和默认(default),因为外部类放在包中,只有两种可能,包可见和包不可见。
对于内部类来说,可以有所有的修饰,因为内部类放在外部类中,与成员变量的地位一致,所以有四种可能。
28. 静态属性和静态方法只是可以继承没有表现出多态性。因为静态方法和静态属性没有采用动态绑定。具体表现就是,将子类实例向上转型则会调用到基类中的静态方法和属性,不转型就调用子类自身的静态方法和属性。编译器不推荐通过实例去调用静态方法和属性,因为这种调用方式容易造成混淆。实际上,在Java的规范中,Java对于类的方法和属性采用了两种完全不同的处理机制:对于方法,使用重载机制实现了多态性;对于属性,使用的是同名属性隐藏机制。所谓的同名属性隐藏机制是指:在具有父子关系的两个类中,子类中相同名字的属性会使得从父类中继承过来的同名属性变得不可见,不管类型是否一致,名称一致的两个属性就是同名属性。在子类中,无法简单地通过属性名称来获取父类中的属性,而是必须通过父类名称加属性名称(super.变量名)的方法才可以访问父类中的该属性。一般而言,为了代码容易阅读,极其不建议在父类和子类中使用同名属性。
29. 如果想在循环语句中删除集合中某元素,就要用迭代器iterator的remove()方法,它会维护一个标志用来记录目前是否是可删除状态。
30. 数组复制的效率System.arraycopy>clone>Arrays.copyOf>for循环。
31. Boolean flag = false; if (flag= true){…}//JAVA的赋值运算是有返回值的,赋了什么值,就返回什么值。Boolean修饰的变量为包装类型,初始化值为false,进行赋值时会调用Boolean.valueOf(booleanb)方法自动装箱,因此赋值后flag值为true,输出文本true。 如果使用==比较,则输出文本false。if的语句比较,除boolean外的其他类型都不能使用赋值语句,否则会提示无法转成布尔值。
32. 包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱,包装类的equals()方法不处理数据转型。
33. Java中类是单继承,但接口可以多继承,Interfere1 extendsInterface2,Interface3...
34. equals和==的区别 ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
35. toLowerCase 是重新 new String()。
36. 要注意两个问题:
1,字符串在java中存储在字符串常量区中
2,==判断的是对象引用是否是同一个引用,判断字符串相等要用equals方法
首先判断a==MESSAGE 同一份字符串常量在内存中只有一份,因此是同一地址,返回true
再次比较(b+c)==MESSAGE这相当于 newString(b+c)==MESSAGE 这里new了一个String对象,所以返回false。
private static final String MESSAGE="taobao";
public static void main(String[]args){
String a ="tao"+"bao";
String b="tao";
String c="bao";
System.out.println(a==MESSAGE);
System.out.println((b+c)==MESSAGE);
}
37. 子类重写父类方法时,访问权限不能小于原访问权限。两同(方法名、参数列表)两小(返回值类型、异常)一大(子类权限比父类大或相等)
38. 加载驱动方法:1、Class.forName();2、DriverManager.registerDriver();3、System.setProperty(“jdbc.drivers”,”com.mysql.jdbc.Driver”)。
39. HashMap中的key可以为null,但不能是可变对象,因为会导致hashCode改变,除非保证改变成员变量时保证hash值不变(重写hash方法)。
40. equals方法重写通常必须重写hashCode方法。对象相同,hashcode必定相同;hashcode相同,对象不一定相同;hashcode不同,对象必定不同。
41. count++,并非原子性操作,而是读取count值,+1操作,写回count,“读取-修改-写入”的操作序列。
42. Comparable和Comparator接口,对集合对象或者数组对象排序,有两种实现方式:(1)对象实现Comparable接口(自然顺序);(2)定义比较器,实现Comparator接口(比较器)。
43. 持续更新。。。