复习

Class文件常量池详解

每一个类存在一个class常量池,在类加载的全过程中,用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。
字面量:就是赋值语句的右半部分。
符号引用: 类和接口的全限定名 ,字段的名称和描述符 ,方法的名称和描述符

字符串常量池

存储在Java堆内存中的字符串池。
创建字符串的方式,以及堆内存储方式
String str = ""用双引号创建一个字符串时,首先在字符串常量池中查找是否有相同值的字符串。
String str =new String():new运算符创建字符串,则会强制String类在堆空间中创建一个新的String对象,可以使用intern()方法将其放入字符串常量池或从字符串常量池中查找具有相同的值字符串对象并返回其引用。

运行时常量池

它是方法区的一部分。运行期间也可能产生新的常量,这些常量被放在运行时常量池中。常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)

Java中复制算法时间比较

System.arraycopy > clone > Arrays.copyOf > for

内部类(高频)

静态内部类 - > 能访问外部类的static属性,方法
内部类 - > 成员变量,无条件访问外部类所有属性
匿名内部类 - > 不存在构造器。匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写。
局部内部类 - > 方法中,不能有访问修饰符。类似局部变量。

接口和抽象类(高频)

  1. 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  3. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

Java关键字

equals 和 ==

== :比较变量在内存中的地址。
equals:在不重写的情况下,调用的时Object的方法,也是比较地址。而String重写了equals方法,比较的是字符串的内容。

final

修饰变量,不可变,在编译期便进入常量池
修饰应用变量,引用不可变,引用的属性可变。
修饰类,类不可继承。
修饰方法,方法不可重载。

Static

修饰的变量是属于类的,类实例对象共享。
静态代码块只执行一次,在类加载时。
当类加载完成后,即使不实例化对象,也可访问静态变量。

This和Spuer

super:它引用当前对象的直接父类中的成员
this:它代表当前对象名
super()在子类中调用父类的构造方法
this()在本类内调用本类的其它构造方法。
this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

构造器和构造方法

构造器是一个没有参数的构造方法。构造器可被重载,不能被继承和被重写。

String常用方法

•indexof();返回指定字符的的索引。
•charAt();返回指定索引处的字符。
•replace();字符串替换。
•trim();去除字符串两端空格。
•splt();字符串分割,返回分割后的字符串数组。
•getBytes();返回字符串byte类型数组。
•length();返回字符串长度。
•toLowerCase();将字符串转换为小写字母。
•toUpperCase();将字符串转换为大写字母。
•substring();字符串截取。
•equals();比较字符串是否相等。

封装继承多态(高频)

多态:多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在程序运行期间才能决定。多态靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。
继承:继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
封装:隐藏对象的属性(private)和实现细节,仅对外公开接口(getter,setter),控制在程序中属性的读和修改的访问级别。
其顺序一定是 封装 ->继承->多态,具有合理性。

字符串的类区别

操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象(final),每次操作都会生成新的 String 对象,再将指针指向新的 String 对象
StringBuffer 、StringBuilder 可以在原有对象的基础上进行操作,可变对象,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,方法由synchronize修饰,而StringBuilder 是非线程安全的,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

HaspMap(重点)

底层实现

jdk1.8中 底层使用数据+链表+红黑树结构:当没有hash冲突的时候,将数据key放入数据中,产生hash冲突后,比较key是否一样,不一样则在数组当前位置延申链表,当链表长度大于8时,链表转成红黑树。

hash冲突(碰撞)

当map的key计算的hash值的位置有数据时,就时hash冲突(碰撞)。
解决办法:
开放定址法 拉链法:生成链表。

hashCode() 和equals()

如果两者equals()相等,则hashCode()相等
如果两者hashCode()相等,则equals()不一定相等。
可违背此规则,但存放效率极大地降低。

Java反射–动态代理
通过反射可以获取Java程序中的类的实例对象。并执行类的方法
Classf.forname

Java过滤器 - Interceptor
针对部分web请求,基于反射实现的。
Spring中通常使用HandlerInterceptor接口自定义实现类注入bean到上下文或继承HandlerInterceptorAdapter抽象类,