一、数据类型
char 占用两个字节,jvm采用Unicode16编码,每个char占用两个字节。
浮点类型数值后面跟f、l 例如 float f1 = 5.1f double d1 = 4.1d long size = 5L
二、运算符
①移位运算符:<< 、>>、 >>>。移位运算符是针对int类型的。如果不是int先强转,然后再移位,最后再强转成之前的类型。 << 左移,低位补0。 >>又移 高位补充符号位,正数补0,负数补1。>>> 右移,高位都补0。
②自增运算符:++i、i++ ,他们只有在参与运算的时候有区别,a = ++i +3; a = i++ +3; 前者先自增再运算,后者先运算再自增。
三、String类
①String对象是不可变的
②String常量池
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串。对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果常量池中存在即返回该对象。
运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
运行时常量池相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用比较多的就是String类的intern()方法。
③String、StringBuffer和StringBuilder的区别
StringBuffer 线程安全,增删方法添加了synchronized,StringBuilder没有同步修饰。在非多线程的情况下,StringBuilder效率要高一点。
四、枚举Enum
enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum。EnumTest 经过反编译(javap com.hmw.test.EnumTest 命令)之后得到的内容如下:
public class com.hmw.test.EnumTest extends java.lang.Enum{
public static final com.hmw.test.EnumTest MON;
public static final com.hmw.test.EnumTest TUE;
public static final com.hmw.test.EnumTest WED;
public static final com.hmw.test.EnumTest THU;
public static final com.hmw.test.EnumTest FRI;
public static final com.hmw.test.EnumTest SAT;
public static final com.hmw.test.EnumTest SUN;
static {};
public int getValue();
public boolean isRest();
public static com.hmw.test.EnumTest[] values();
public static com.hmw.test.EnumTest valueOf(java.lang.String);
com.hmw.test.EnumTest(java.lang.String, int, int, com.hmw.test.EnumTest);
}
所以,实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已。
五、泛型
-
1.泛型通配符:?表示,通常用于操作任意参数类型的泛型。强调的是通用性。
-
2.泛型的界限:其目的是在一定范围内扩大可以操作的参数类型。分为上界限,和下界限。
泛型上界:表现形式:<? extends A> 表示的含义是:可以操作的参数类型可以是,A类型以及A的子类。通常这种
在集合中取出元素的时候常常使用,通常用A类型来接收取出的元素。<=A
泛型下界:表现形式:<? super A> 表示的含义是:可以操作的参数类型是:A类型及其父类型。通常这种在接收元素
做比较的时候使用,可以使用自己的比较器,也可以使用父类的比较器。泛型下限的使用不多 。>=A
六、异常
所有异常的父类都是Throwable。Throwable(可抛的)主要分为三类:受检测异常(checked exception)、运行时异常(runtime Exception)和错误(error)。
对于可恢复的情况,要抛出受检查异常;对于程序错误,要抛出运行时异常。
七、注解+反射
八、动态代理
动态代理有两种:JDK提供的api、CGLib字节码生成库实现。
JDK动态代理:基于接口的。生成代理类比较快,运行方法比较慢。
CGLib:继承,生成子类。生成代理类比较慢,运行方法比较快。
九、内部类
成员内部类、 静态内部类、 局部内部类、 匿名内部类。