java面试知识点
1、static不能修饰局部变量。因为static修饰的变量属于类所有但是如果修饰局部变量则和static意义相反
2、如果子类重写父类方法那么调用的值是子类方法,子类重写父类时不能改变方法体(如只继承但未实现重写则调用父类方法)
3、在Servlet处理请求的方式为 以线程方式
4、当对象为null时被回收
5、switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 在Java 5以前,switch(expr)中,expr只能是byte、short、char、int。从Java 5开始,Java中引入了枚举类型,expr也可以是enum类型,从Java 7开始,expr还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
6、short s1 = 1; s1 += 1;可以正确编译 +=是java自带运算所以可以自动转换
7、Integer a = new Integer(3);
Integer b = 3; // 将3自动装箱成Integer类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对象
System.out.println(a == c); // true a自动拆箱成int类型再和c比较
8、 Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2); //true
System.out.println(f3 == f4);//false
简单的说,如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是true,而f3==f4的结果是false。
9、栈:存放一个基本数据类型的变量、一个对象的引用、函数调用的现场 栈很小
堆:存放new的对象、和实例化的对象
静态区:如直接书写的100和new的字符串、常量都放在静态区
String str =new String ("hello");
变量 str放在栈 new的应用放在堆 hello放在静态区
10、Math.round(11.5) 四舍五入的原则是在原数上加0.5
11、构造器不可以被继承、不可以被重写、但可以被重载
12、如果equals的判断值等于true那么他们的hashcode必相等 反正相反
13、java在编译时程序会先查看常量池中是否存在以声明的对象如果没有则自动创建一个,如果有那直接引用该对象
String s1 = "AB";
最多创建一个String对象,最少不创建String对象.
如果在方法区中的常量池中存在”AB”,那么s1直接引用,不需要创建String对象,否则先在常量池中创建”AB”,再引用
String s2 = new String("AB");
最多创建两个String对象,至少创建一个String对象,先看常量池中是否有”AB”,如果没有先创建,然后在堆中创建一个String对象,引用常量池中”AB”的地址,再把自己的地址给s2.
new关键字绝对会在堆空间中创建内存区域,所以至少创建一个对象
14、java使用的编码是unicode 所以char存储一个中文是可以的,一个char占两个字节
15、https://www.cnblogs.com/dangzhenjiuhao/p/4585389.html
17、String srt=new String("123"); //是在堆中存放对象
String str1="123";//是在栈中存放对象
== 比较的是引用。
18、throw用于抛出明确的异常适用于方法体内
throws用于抛出不明确的异常适用与方法名上
19、饿汉式单例可以解决线程安全问题 。
// 饿汉式:线程安全
public class Singleton_饿汉式 {
// 懒汉式没有直接实例化他的原因是,如果不需要用到此类,提前实例化它会浪费内存
// 饿汉式通过提前实例化可以解决线程安全性问题,但是可能存在可浪费内存的问题
private static Singleton_饿汉式 singleton = new Singleton_饿汉式();
private Singleton_饿汉式() {}
public static Singleton_饿汉式 getInstance() {
return singleton;
}
}
public class Singleton_双重校验线程安全 {
private static Singleton_双重校验线程安全 singleton;
private Singleton_双重校验线程安全() {}
// 必须用两个if判断,不然还是会被实例化多次
public static Singleton_双重校验线程安全 getInstance() {
if (singleton == null) {
synchronized (Singleton_双重校验线程安全.class) {
if (singleton == null) {
singleton = new Singleton_双重校验线程安全();
}
}
}
return singleton;
}
}
用 接口来写单例模式
// 接口
public interface MySingleton {
void method();
}
// 实现类
public enum Singleton implements MySingleton {
INSTANCE {
@Override
public void method() {
System.out.println("我是枚举的单例模式");
}
};
public static MySingleton getInstance() {
return Singleton.INSTANCE;
}
}
20、String str = new String("123"); 创建了几个对象?
两个:当常量池里面不存在 “123” 的时候,会在堆、常量池里面都创建一个字符串对象
一个:当常量池里面已经存在了 “123” 的时候,仅仅在堆上面创建
21、hashMap如何判断值重复?1,首先使用hashcode比较如果hashcode不重复则值不重复 2,如果hashcode重复则用equals比较 如果hashcode和equals都相同则值重复
22、基本数据类型的大小
整数:
byte 1 字节
short 2 字节
int 4 字节
long 8 字节
浮点数:
float 32 字节
double 64 字节
布尔类型:
boolean 4 字节
字符类型:
char 2 字节
23.collection是一个集合接口,他是集合的顶级元素,为集合对象提供了基本操作方法
collections是一个集合元素的工具类,提供了对集合元素进行查找、排序、以及线程安全等操作
24、list 、set、map之间的区别?
25、hashset底层是由hashmap实现
hashset的key保存在hashmap的key上
hashmap的value统一是
26、AOP简单来说就是把那些与业务无关,却与系统业务模块共同调用的代码逻辑封装起来,减少了代码的重复,降低了代码的耦合度,有利于未来代码的可操作性和可维护性。
优点/引入的目的是什么:
1、脱开,或者降低类之间的耦合 2、提倡面向接口编程,实施依赖倒换原则 3、提高系统的可插入,可修改,可测试特性。
IOC传统的java开发模式,当我们需要一个对象时需要使用new或者getInstance等方法直接或间接的调用构造方法来获得对象,而下spring中spring使用工厂模式,为我们创建对象,不用我们自己创建,直接调用spring提供的对象就可以了。
AOP的一些应用场景?
权限 Authentication
缓存 Caching
调试 Debugging
日志记录 logging
事务 Transactions
27、递归调用可以导致栈溢出 不断创建对象可以导致堆溢出
28、wait()是ONject的方法 会释放锁 sleep()是Thread的方法不会释放锁
29、悲观锁:认为每次数据更新都会造成问题 再语句后加 for update (类似排他锁 再修改前先尝试数据加锁 如果加锁成功则说明数据可修改,反之说明数据正在被修改)
乐观锁:认为每次数据更新都不会造成问题 可使用数据加版本号 解决 version (类似CAS无锁)
30、java代码编译过程:
首先java源代码--->通过jdk的javac编译--->.class文件--->在通过jvm(java虚拟机)--->编译成机器可执行的二进制机器码