java

1.java是一种什么类型的语言

解释型、编译型、面向对象的

2.final和static

final:
	final修饰的类不能被继承
	findl修饰的方法不能被重写
	final修饰的变量不能被改变
static:
	不需要new对象就能直接使用,只需要类被加载,属于类
	static变量能被所有对象共享
	static修饰的代码块,在类加载时时最先被加载,且只被加载一次

3.对象中的拷贝

1.使用clone拷贝(浅拷贝)
2.重新定义clone方法(深拷贝)
3.序列化克隆(深拷贝)
4.BeanUtils.copyProperties()函数

4.接口和抽象类

接口:
	1.制定标准
	2.提供可扩展性
	3.面向接口编程
# 设计
抽象类:
构造方法:有构造方法,用于子类实例化使用。
成员变量:可以是变量,也可以是常量。
成员方法:可以是抽象的,也可以是非抽象的。

接口:
构造方法:没有构造方法
成员变量:只能是常量。默认修饰符:public static final
成员方法:jdk1.7只能是抽象的。默认修饰符:public abstract (推荐:默认修饰符请自己永远手动给出)
jdk1.8可以写以default和static开头的具体方法

	
# 解释
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

5.内部类

成员内部类
	成员内部类:类比成员方法,不能拥有静态域但是可以访问外部类的静态域
	私有属性的互相访问,内部类可以直接访问外部类,而外部类访问内部类需要内部类的对象来访问
静态内部类
	定义在外部类的内部,使用static修饰,类比静态方法,静态内部类不需要外部类对象产生就能使用,不能访问外部类的成员域,但能访问静态域
局部内部类
	定义在方法内部:类比局部变量
	a.对外部完全隐藏,因此方法内部类不能有任何访问修饰符
	b.方法内部类没有访问形参,这个形参是可以在方法中随意修改的,一旦方法内部类中使用了形参,这个形参必须被声明为final。
匿名内部类
	a.必须继承一个抽象类或者实现一个接口
	b.没有构造方法
// 成员内部类
package com.xqm.pojo.test01_inner_class;

/**
 * 成员内部类
 */
public class InnerClass01 {


    private String name = "hello";

    class Inner {
        private String name = "ketty";
        public void test() {
            // ketty
            System.out.println(name);
            // ketty
            System.out.println(this.name);
            // hello
            System.out.println(InnerClass01.this.name);
        }
    }

    public void test() {
        Inner inner = new Inner();
        inner.test();
    }

    public static void main(String[] args) {
        InnerClass01 innerClass01 = new InnerClass01();
        innerClass01.test();
    }
}
// 静态内部类
package com.xqm.pojo.test01_inner_class;

/**
 * 静态内部类
 */
public class InnerClass02 {
    private static String name="hello";
    private  String name01="hello";
    static class Inner02{
        private String name="ketty";
        public void test(){
            // 不能访问name01
            System.out.println(name);
        }
    }

}

6.java数据类型

基本数据类型
byte:1 short:2 int:4 long:8 boolean float:4 double:8 char:2
引用数据类型
BigDecimal:可变的
java是跨平台的,因此在各个操作系统上占据的字节数没区别

7.java容器

list map
arrayList vector linkedList 
set hashSet Treeset
hashMap hashTable LinkedHashMap
# 集合的框架体系(单列集合collection和双列集合map)
Iterable
	Collection
		List
			ArrayList:
				排序有序,可重复,底层使用数组,增删慢,getter和setter快,线程不安全,容量初始为0,第一次扩容为10,如果指定容量则初始化为指定容量,扩容为当前容量+当前容量*0.5
			LinkedList:
				排列有序,可重复,底层使用双向循环链表,查询慢,增删快,线程不安全
			Vector:
				排序有序,可重复,底层使用数组,增删慢,getter和setter快,线程安全,容量初始为0,第一次扩容为10,如果指定容量则初始化为指定容量,扩容为当前容量*2
		Set
			HashSet:
				排列无序,不可重复,底层使用Hash表实现,存取速度快,内部其实是HashMap
			LinkedHashSet:
				采用hash表存储,并用双向链表记录插入顺序,内部是LinkedHashMap
			TreeSet:
				排列无序,不可重复,底层用二叉树实现,排序存储,内部是TreeMap的SortedSet
		Queue:两端出入的list,可以用数组或链表来实现
Map
	HashMap:
		键不能重复,值能重复,底层为hash表,线程不安全,允许key为null,value也为null.扩容为2倍
		LinkedHashMap
	TreeMap:键不可以重复,值可以重复,底层hash表
	HashTable:
		键不能重复,值能重复,底层为hash表,线程安全,key和value都不允许为null
		Properties
		
想要list和map线程安全,Collections.synchronizedMap(new HashMap)、synchronizedList(new ArrayList())或ConcurrentHashMap或CopyOnWriteArrayList(读大于写的时候)
普通队列
双端队列
阻塞队列

8.java怎么创建对象

1.使用new关键字
2.使用class类的newInstance()方法
3.使用clone
4.使用反序列化的readObject()方法
	将对象序列化,存储到一个文件中。从文件中反序列化,得到类对象

9.java不想序列化怎么办

transient关键字

10.notify和notifyAll区别

1.notify可能会导致死锁,notifyAll不会
2.notify唤醒一个线程,notifyAll唤醒所有线程进行抢夺资源

11.sleep和wait区别

1.sleep属于Thread类,wait属于Object
2.sleep不会释放资源,wait会释放资源

12.SynchronizedMap和ConcurrentHashMap

Collections.synchronizedMap(new HashMap)只是有条件的线程安全,给每个方法都加了同步机制。多个map同时操作结果会不可预知,因此应该少用。

ConcurrentHashMap通过segment分段方式进行同步操作,线程安全的

spring

1.spring IOC的理解,原理和实现?

总:
1.控制反转
IOC的意思是控制反转,原来的对象是由使用者来进行控制,有了spring之后,将创建和管理对象交给spring容器来进行管理。
DI:依赖注入,把对应属性的值注入到具体的对象中。可以通过@Autowired,populateBean完成属性值的注入。
2.容器
容器用来存储对象,使用map结构来存储,在spring中一般存在三级缓存,singletonObjects存放完整的bean对象.整个bean的生命周期,从创建到使用到销毁的全部过程都是由容器来管理。

分:
1.一般聊IOC容器的时候要涉及到容器的创建过程(beanFactory,DefaultListableBeanFactory),像bean工厂中设置一些参数(BeanPostProcessor,Aware接口的子类)等属性。
2.加载解析bean对象,创建bean对象的定义对象BeanDefinition(xml或者注解的解析过程)
3.beanFactoryPostProcessor----beanDefinition,处理占位符
4.BeanPostProcessor的注册功能,方便后续对bean对象完成具体的扩展功能
5.通过反射的方式将BeanDefinition实例化成具体的bean对象。(Class.forName,对象.getClass(),类.class)
6.bean对象的初始化过程(填充属性,检查aware接口并设置相关依赖,调用BeanPostProcessor前置处理方法、init-method方法、后置处理方法)
7.生成完成的bean对象,通过getBean()方法获取bean对象
8.销毁

spring aop

aop是IOC的一个扩展点   beanPostProcessor的后置处理方法中实现
aop的概念 应用场景 动态代理(jdk cglib)
1.代理对象的创建过程(advice,切面,切点)
2.通过jdk或cglib