1 final关键字
final修饰的类不能继承
final修饰的方法不能重写
final修饰的变量不能改变
(final修饰的JVM会尝试关联)
2 abstract class 和interface
抽象类可以有构造方法 接口不行
抽象类可以有普通成员变量 接口不行
抽象类可以包含非抽象普通方法 接口只有抽象方法
一个接口可以实现多个接口,只能继承一个抽象类
3 map
map是键值对。key唯一,值可重复
treemap 可以保证顺序
hashmap无序 key和value都可以为null线程不安全
hashtable key和value都不许为null
KeySet()方法可以将所有keys抽取成一个set
Values()可以将map中所有values抽取成一个集合
4 Set
不包含重复元素的集合
5 list
有序可重复
6 arraylist 和linkedlist
arraylist 动态数组 初始化大小10 每次扩容0.5 查询快
linkedlist 链表结构 增删快
7 内存泄漏与内存溢出
内存泄漏: 指程序在申请内存后无法释放内存,最终会导致溢出
比如 读取流即使关闭,数据库连接释放
内存溢出:没有足够内存使用 比如大批量导入 采用分批提交
8 int与integer区别
integer是包装类型,存的是对象,int是基本类型 存的是数值
9 string stringbuilder stringbuffer 都是字符串常量
string 不可变
stringbuffer 可变 线程安全 拼接时在后面追加
stringbuilder 可变线程不安全 拼接时在后面追加
stringbuilder 效率 > stringbuffer >string 因为stringbuilder不安全做所以效率高
10 常见异常
sqlexception 数据库访问错误等
ioexception io流中断或失败
classnotfoundexception 找不到指定名称类
11多线程
新建状态 执行start()方法 -> 就绪状态 执行run()方法 -> 运行状态 run()方法执行完
-> 死亡状态
阻塞状态 : 线程阻塞 让出cpu资源
12 gc
gc垃圾回收,负责清除对象并释放内存。java提供的gc功能可以自动检测对象是否超过作用域而达到回收的目的 防止内存泄漏
13 sql优化
1 mysql Explain优化器 可以查看sql的细节 比如type 可以显示全表扫描或索引
全表扫描不行 要优化到索引级别 。查看有没有索引失效。
2 表中建立索引,优先考虑where,group by使用到的字段
3 避免使用select * 返回无用字段会降低查询效率
4 避免使用in 和 not in ,or,判空 会导致数据库放弃索引,进行全表扫描
5 子查询使用exists代替
14if else优化(表驱动法)
用map将几种type存起来,再用for循环遍历区匹配,这样可以省略很多代码
更好的办法有策略模式+工厂模式
先设计模板方法,然后用工厂模式设计生产策略,最后根据不同业务逻辑实现模板方法
14 rabbitMq
灵活路由,支持多协议(mqtt)
15 mysql distinct和group by
distinct和group by都可以用来去重,
不同之处,distinct针对全部字段去重,而group by可以针对全部字段中的单一字段去重
两者执行方式不同,distinct主要是对数据两两进行比较,需要遍历整个表。group by分组类似先建立索引再查索引,当数据量较大时,group by速度要优于distinc
16 深拷贝和浅拷贝
深拷贝和浅拷贝是指在赋值一个对象时,拷贝的深度不同
在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到景响。
相反,浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。