一、布局管理
1. 流布局管理器: FlowLayout类声明:
public class FlowLayout implements LayoutManger, java.io.Serializable
{
public static final int LEFT=0,CENTER=1,RIGHT=2;
public FlowLayout() //构造方法,默认居中
public FlowLayout(int align) //align参数指定对齐方式,取值为对齐方式
public FlowLayout(int align, int hgap, int vgap) //hgap,vgap指定组件间水平和垂直间距
}
2. 边布局管理器: 分为5个区域,东西南北和中,改变容器大小,四边组件的长度或宽度不变,中间组件长度和大小随着容器大小变化 BorderLayout类声明:
public class BorderLayout implements LayoutManger2, java.io.Serializable
{
public static final String NORTH="North"; //位置常量,字符串首字母大写
public static final String SOUTH="South";
public BorderLayout() //构造方法,组件之间间距为0像素
public BorderLayout(int hgap, int vgap) // 参数指定组件之间的水平和垂直间距
}
Container容器为BorderLayout布局提供以下添加组件的方法: 如:
this.add(new Button("东"), BorderLayout.EAST); //组件添加在框架东边
this.add(new Button("南"), "South");
3.网格布局管理器: 将容器划分为大小相等的若干行乘以若干列网格; GridLayout类声明如下:
public class GridLayout implements LayoutManger, java.io.Serializable
{
public GriLayout(int rows, int cols) //构造方法,参数指定行和列
public GriLayout(int rows, int cols, int hgap, int vgap) // hgap,vgap指定组件水平和垂直间距
}
二、== 与equals的区别
==比较基本数据类型时,值存放在栈中,直接比较它们的值 ==比较引用数据类型时,比较的是它们的地址 Equals是String的方法,比较的是字符串内容是否一致,所以==比较为true时,equals不一定为true 比如比较的为地址时候。
三、this 与super
this() 本类无参构造 super() 父类无参构造 this(10) 本类有参构造 super()与this()都要处于第一行,所有只能有一个 this.name 本类的name属性 super.name 父类的name属性 this.eat() 调用本类的eat()方法 super.eat() 调用父类的eat()方法
四、JAVA顺序
父类静态代码块 –> 子类静态代码块 –> 父类代码块 (或成员变量)从上往下执行 –> 父类构造 –> 子类代码块 (或成员变量)从上往下执行 -> 子类构造
五、内部比较器 外部比较器
内部 :实现Comparable接口 ,重写compareTo方法 ;外部 :重写一个比较器类,实现Comparator接口 ,重写compare方法 。
六、HashSet TreeSet LinkedHashSet
HashSet :哈希表实现,无序,不可重复,可以有空元素,必须重写hashcode方法,先取哈希码进行比较,不重复直接插入;哈希码相同,调用equals方法,比较内容是否一致,不一致插入,保证没有相同的元素。TreeSet :二叉树实现,有序,不可重复,不可有null元素,插入对象需要实现比较器接口。LinkedHashSet :链表+哈希表实现。有序,插入和读取顺序一致。查询比HashSet慢,插入删除快。
七、HashMap TreeMap Hashtable LinkedHashMap
HashMap 哈希表实现,无序,Key不能重复,key和value可为空。TreeMap 红黑树实现,有序,key不能重复不能为空,会根据key排序。Hashtable 哈希表实现,继承Dictionary,不常用,key不能重复,key和value都不能为空,线程安全。LinkedHashMap 链表+哈希表,key不重复,key和value都能为空,查询慢,插入删除快,可以如何存便如何取。
名称 实现方式 key和value的特性 特点 HashMap 哈希表 key不能重复,key和value可以为空 无序 TreeMap 红黑树 key不能重复,不能为空,根据key排序 有序 Hashtable 哈希表 key不能重复,key和value不能为空 继承于Dictionary,不常用,线程安全 LinkedHashMap 链表+哈希表 key不能重复,key和value可以为空 查询慢,插入删除快,如何存就如何取
八、Thread Runnable Callable
Thread: 单继承 Runnable实现类,继承Thread父类所有属性,重写run方法; Runnable: 弥补单继承的局限性,实现多个线程共享一个数据,重写run 方法,必须装载进Thread对象进行启动。 Callable: jdk1.5后新加接口,Runnable升级版,带返回值接口。重写call方法,运行是必须装载进FutureTask中运行,返回值通过future.get()获取。
名称 特性 Thread 单继承,Runnable实现类,重写run方法 Runnable 实现多线程共享同一数据,重写run方法,装进Thread进行启动 Callable Runnable升级,带返回值。重写call方法,必须在FutureTask中运行,future.get()获取返回值
九、synchronized volatile lock
synchronized: 线程同步,重量级锁,可以修饰代码块和方法,保证同一时间只有一个线程可以操作方法和代码块,可以锁对象和类(class),保证线程安全。 volatile: 共享变量,轻量级锁,修饰在属性上。每个线程可以有自己的内存空间,线程将变量读取到自己的空间中进行操作,再刷新到主内存中。volatile修饰变量后,会忽略cache优化,每次直接读值,保证每个线程读取的都是最新值。不能保证绝对的线程安全。 lock: 手动锁,操作灵活,多线程情况下,性能比synchronized高好几倍,但一定要记得解锁。
名称 锁类型 修饰类型 特性 synchronized 重量级锁 方法和代码块 同一时间只能一线程操控,可以锁对象和class volatile 轻量级 属性 忽略cache优化,每次直接读值,保证线程读取最新值,不可以保证线程安全 Lock 手动锁 方法 操作灵活,多线程下比1.高几倍,需要进行解锁
十、sleep wait
sleep: 属于Thread的静态方法,设置休眠时间,会自动唤醒; wait: 属于object的方法,放在synchronized同步代码中,不设置休眠时间,需要使用notify或者notifyAll来唤醒。 都属于休眠,让线程属于等待状态
名称 所属方法 特性 sleep Thread 设置休眠时间,会自动唤醒 wait object 放在synchronized同步代码中,不设置休眠时间,需要使用notify或者notifyAll来唤醒
十一、stop interrupt volatile
Stop:强制中断线程,非常粗暴,已废弃,不推荐使用 Interrupt: 中断线程,主要以设置一个中断信号,提示该线程终止,主要还是要靠人为代码控制(通过interrupted()判断后直接return) Volatile:共享变量,修饰一个停止标识符,忽略cache的优化,每次直接读值
名称 特点 stop 强制中断,不使用 interrupt 设置中断信号,提示线程终止,人为控制(interrupted()判断后返回) volatile 共享变量,修饰停止标识符,忽略cache优化,直接读值
十二、join和yield的区别
Join: 霸占方法,多线程情况下,一个线程调用join方法,会等它执行完再继续执行其他线程。当一个线程依托另外一个线程的处理结果,这时需要执行Join方法。 Yield:让步方法,乐意让其他线程占用自己的位置,只是一个暗示,并不能保证产生影响,也不受优先级影响。
名称 特点 适用情况 join 当线程调用它时,等该线程执行完,在执行其他线程 当一个线程依托另外一个线程处理结果 yield 让其他线程占用自己的位置,不一定产生影响,不受优先级影响 只是暗示,不一定可以产生效果
十三、设计模式
生产者与消费者模式:当生产者与消费者两边速率不一样时,需要堵塞一方,让它排队等待处理。 工厂模式:帮我们创建对象,省去new的过程,根据你传入的条件返回你要的对象,隐藏丑陋的else if或switch之类代码 代理模式:在不修改方法的前提下,拓展这个方法 单例模式:项目中有且只有一个对象,核心是构造私有化,但会对外提供一个获取该对象的静态方法,可分为:懒汉模式和饿汉模式
十四、反射
项目运行时,动态获取类的属性和方法,并可以给属性设值和运行普通和私有方法。
十五、元注解
元注解:用于修饰注解的注解。(用于修饰自定义注解的JDK提供的注解) JDK提供4种元注解: @Retention 用于确定被修饰的自定义注解生命周期 RetentionPolicy.SOURCE 被修饰的注解只能存在源码中,字节码class没有。 用途:提供给编译器使用。 RetentionPolicy.CLASS 被修饰的注解只能存在源码和字节码中,运行时内存中没有。 用途:JVM java虚拟机使用 RetentionPolicy.RUNTIME 被修饰的注解存在源码、字节码、内存(运行时)。 用途:取代xml配置 @Target 用于确定被修饰的自定义注解 使用位置 ElementType.TYPE 修饰 类、接口 ElementType.CONSTRUCTOR 修饰构造 ElementType.METHOD 修饰方法 ElementType.FIELD 修饰字段 @Documented 使用javaDoc生成 api文档时,是否包含此注解 (了解) @Inherited 如果父类使用被修饰的注解,子类是否继承。(了解)
十六、类的生命周期
加载: 将.class文件以二进制流的方法读取到jvm中 验证: 校验你的二进制流是否安全,是否符合Jvm规范,有没有恶意代码 准备: 为静态变量在方法区开辟一块内存,并赋予默认值 解析: 将符号引用转换成直接引用 初始化 : 将程序中的赋值语句变为类变量赋值 运行 : 这个类就可以运行了 卸载 : 没有引用时,gc会回收并卸载它
十七、三种加载器
BootStrapClassLoader: 加载器的最顶层,最先开始加载jre/lib下的rt.jar等jar包 ExtClassLoader : 如果BootStrapClassLoader没有加载成功,那ExtClassLoader会继续加载jre/lib/ext下面的jar包 AppClassLoader:ExtClassLoader也没加载到,会加载用户classpath下面的class文件
十八、 Jdk动态代理与Cglib动态代理的区别
Jdk动态代理,必须基于接口创建代理类 Cglib动态代理,基于Class就可以创建代理类 Jdk动态代理性能比Cglib高,Spring默认先使用jdk动态代理
十九、C3p0 与 dbcp 数据库连接池的区别
C3p0 : 安全稳定,是hibernate框架推荐使用,它提供最大空闲时间,超过空闲时间会自动回收数据库连接 Dbcp : 速度快效率高,是Spring推荐使用,dbcp提供最大连接数