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