2019-6-5牛客网刷题易错知识点

Java的体系结构包含Java编程语言、Java类文件格式、Java API、JVM。

构造方法必须满足以下语法规则:

(1)方法名必须与类名相同;

(2)不要声明返回类型;

(3)不能被static、final、synchronized、abstract和native修饰;

(4)构造方法用final和abstract修饰没有意义。

一个类至少有一个构造方法,没有返回值类型,甚至连void也没有;

可见性修饰符方面,使用private也是可以的,能有一些特殊的作用比如在单例模式下。

 

使一个线程进入阻塞状态的方法:

1. sleep() / suspend()

2. 发生IO阻塞

3. 等待同步锁

4. 等待通知

 

解除一个线程的阻塞状态,使之进入就绪态的方法:

1. sleep() 指定的睡眠时间到了

2. IO阻塞解除

3. 获得同步锁

4. 收到通知

5. 调用了 suspend() 的线程阻塞后,再调用 resume() 解除阻塞

 

要写一个线程类,可以继承Thread方法,然后override他的run()方法

另一种方法是实现Runable接口,即为实现run()方法。

 

ConcurrentHashMap使用ReentrantLock来保证线程安全。

HashMap定义规则如下:

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable

HashMap实现的接口有:Serializable, Cloneable, Map ,没有实现connection

 

hibernate核心接口说明:

1、Configuration接口:配置Hibernate,根据其启动Hibernate,创建SessionFactory对象;

2、SessionFactory接口:初始化Hibernate,充当数据存储源的代理,创建session对象,SessionFactory是线程安全的,意味着它的同一个实例可以被应用的多个线程共享,是重量级二级缓存;

3、session接口:负责保存、更新、删除、加载和查询对象,是一个非线程安全的,避免多个线程共享一个session,是轻量级,一级缓存。

4、Transaction接口:管理事务。可以对事务进行提交和回滚;

5、Query和Criteria接口:执行数据库的查询。

 

Java数据库连接库JDBC用到桥接模式

 

子类不可以继承父类的构造方法,只可以调用父类的构造方法。子类中所有的构造函数都会默认访问父类中的空参数构造函数,这是因为子类的构造函数内第一行都有默认的super()语句。super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。一个类都会有默认的空参数的构造函数,若指定了带参构造函数,那么默认的空参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为父类中没有空参数的构造函数。因此,在子类中默认super()语句,在父类中无对应的构造函数,必须在子类的构造函数中通过this或super(参数)指定要访问的父类中的构造函数。

 

抽象类

特点:

1.抽象类中可以构造方法

2.抽象类中可以存在普通属性,方法,静态属性和方法。

3.抽象类中可以存在抽象方法。

4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。

5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。

接口

1.在接口中只有方法的声明,没有方法体。

2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上

public static final 

3.在接口中的方法,永远都被public来修饰。

4.接口中没有构造方法,也不能实例化接口的对象。

5.接口可以实现多继承

6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法

7.则实现类定义为抽象类。

 

并不是程序结束的时候进行GC,GC的时间是不确定的,且GC的过程需要经过可达性分析,一个对象只有被标记两次才会被GC。

 

当我们在为Integer赋值的时候,java编译器会将其翻译成调用valueOf()方法,对于-128到127之间的数,Java会对其进行缓存。而超出这个范围则新建一个对象。

 

在java中,数组是一个对象, 不是一种基本数据类型(原生类),对象所以存放在堆中,又因为数组特性,是连续的,

 

JVM根据两个方面判断两个类是否相同:一是类的全称;另一个是类加载器.

即使类的全称相同,而使用的加载器不同那Class对象也是不同的。

 

JDK中提供了三个ClassLoader,根据层级从高到低为:

  1. Bootstrap ClassLoader,主要加载JVM自身工作需要的类。
  2. Extension ClassLoader,主要加载%JAVA_HOME%\lib\ext目录下的库类。
  3. Application ClassLoader,主要加载Classpath指定的库类,一般情况下这是程序中的默认类加载器,也是ClassLoader.getSystemClassLoader() 的返回值。(这里的Classpath默认指的是环境变量中配置的Classpath,但是可以在执行Java命令的时候使用-cp 参数来修改当前程序使用的Classpath)

JVM加载类的实现方式,我们称为 双亲委托模型:

如果一个类加载器收到了类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委托给自己的父加载器,每一层的类加载器都是如此,因此所有的类加载请求最终都应该传送到顶层的Bootstrap ClassLoader中,只有当父加载器反馈自己无法完成加载请求时,子加载器才会尝试自己加载。

双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。

假设有一个开发者自己编写了一个名为Java.lang.Object的类,想借此欺骗JVM。现在他要使用自定义ClassLoader来加载自己编写的java.lang.Object类。然而幸运的是,双亲委托模型不会让他成功。因为JVM会优先在Bootstrap ClassLoader的路径下找到java.lang.Object类,并载入它。

 

switch结构中没有break的话,匹配完不会跳出,会继续匹配下一个case直到整个结构结束。

ceil:大于等于 x,并且与它最接近的整数。

floor:小于等于 x,且与 x 最接近的整数。

 

Java并发中:

1、CopyOnWriteArrayList适用于写少读多的并发场景

2、ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,

   读与读之间可以并发执行。在读多写少的情况下可以提高效率。

3、ConcurrentHashMap是同步的HashMap,读写都加锁

4、volatile只保证多线程操作的可见性,不保证原子性

 

./表示当前项目的路径

../表示当前目录的父目录路径

盘符:\\name\\file 或者 盘符:/name/file

表示物理路径

你可能感兴趣的:(笔记)