1、权限
default:包权限(默认权限)
2、执行过程
——》父类静态域——》子类静态域
——》父类成员初始化——》父类构造块——》父类构造方法
——》子类成员初始化——》子类构造块——》子类构造方法
3、final
4、Array List<泛型>
2,消除强制类型转换。 泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
5、类加载器
- Bootstrap :一般用本地代码实现,负责加载 JVM 基础核心类库( rt.jar );
- Extension :从 java.ext.dirs 系统属性所指定的目录中加载类库,它的父加载器是 Bootstrap ;
- system class loader :又叫应用类加载器,其父类是 Extension 。它是应用最广泛的类加载器。它从环境变量 classpath 或者系统属性 java.class.path 所指定的目录中记载类,是用户自定义加载器的默认父加载器。
- 用户自定义类加载器: java.lang.ClassLoader 的子类
6、关于length
7、下面的switch语句中,x可以是哪些类型的数据:()
switch(x) { default: System.out.println("Hello"); }
byte、short、int、char、String、枚举
8、+=和+
9、HashMap
10、异常分类及处理
oom经典Java error(栈溢出StackOverFlow,内存溢出outOfMemory)
11、DCL
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
12、hashcode 和 equals
hashcode值相同 equals不一定相同
equals 相同 hashcode值应该相同
hashcode不相同 equals一定不相同
equals不相同 hashcode 不一定
hashcode:是一组数据的标识
equals:比较的是具体的内容
13、JDK1.8默认GC 垃圾回收器
JDK1.8中默认使用的是Parallel Scavenge和Parallel Old收集器组合
14、Static关键字
Static是类变量,存放在堆内存中,
Static关键字不可以用在方法中,方法定义在栈上,随方法销毁而消失。
Static变量不惊醒初始化的话会有初始值。
15、接口和抽象类
抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
6,抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰
关键字使用注意:
抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类)
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。
7,接口可以继承接口,用extends
16、synchronized(类锁,对象锁,方法锁,代码块)
修饰非静态方法 锁的是this 对象
修饰静态方法 锁的是class对象
synchronized修饰不加static的方法,锁是加在单个对象上,不同的对象没有竞争关系;
synchronized修饰加了static的方法,锁是加载类上,这个类所有的对象竞争一把锁。
17、三目运算符
public static void main(String[] args) { Object o1 = true ? new Integer(1) : new Double(2.0); Object o2; if (true) { o2 = new Integer(1); } else { o2 = new Double(2.0); } System.out.print(o1); System.out.print(" "); System.out.print(o2); }
输出结果:1.0 1
三目运算符会做转换,向高类型转换
18、Object 常用方法
wait,clone,equals,notify,finalize(GC),hashcode,toString,getClass
19、Mysql 索引
带头大哥不能死,中间兄弟不能断!
20、判断一块内存空间是否符合垃圾回收标准(引用计数,根可达)
21、内部类
22、线程池工作过程
1. 线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面 有任务,线程池也不会马上执行它们。
2. 当调用 execute() 方法添加一个任务时,线程池会做如下判断:
a) 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
b) 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
c) 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要 创建非核心线程立刻运行这个任务;
d) 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池 会抛出异常 RejectExecutionException。
3. 当一个线程完成任务时,它会从队列中取下一个任务来执行。
4. 当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运 行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它 最终会收缩到 corePoolSize 的大小。
23、ABA 问题(CAS)
乐观锁,每次读取都不会认为别人会修改(ABA问题)
悲观锁,每次去拿数据的时候都认为别人会修改
ABA 问题需要加版本号即可解决
24、创建一个Java线程池
=newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
=newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
=newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
=newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
25、如何让10个线程在某一时刻同时执行
26、instanceof (boolean
result = obj
instanceof
Class
)
System.out.println(arrayList
instanceof
List);
//true