2018-11-28-Summary
1.String、StringBuilder、StringBuffer区别
String:底层使用final修饰了一个不可变的字符数组;StringBuilder和StringBuffer是内容可变的,append方法进行追加内容;
StringBuilder:线程不安全,效率高;
StringBuffer:线程安全,效率低;
2.集合:
存值:
List:有序的,可以重复;
ArrayList(ArrayList不是线程安全的,Vector使用同步方法来实现线程安全):底层是数组:
数组具有索引,查询比较快;
数组在内存中是一块连续的内存,在插入和删除的时候都需要移动内存,插入删除比较慢;
LinkedList:底层是链表:
链表具有指针的效果,需要从头开始一个一个找引用指向,查询效率低;
插入和删除只需要改变引用的指向即可,插入和删除快;
Set:无序的,不可以重复;
重复与否:是根据equals 和 hashCode来判断的,也就是说如果一个对象要存储在Set里,必须重写equals 和 hashCode方法;
存key-value:
Map:(HashMap(线程不安全,效率高,可以把null值作为key或value)和HashTable(线程安全,效率低))
HashMap:用数组存数据,
调用键的HashCode()获取键的哈希值,
用哈希值,计算一个下标i,
新建Entry对象来封装键和值,
把Entry对象放在i的位置,
有位置,直接放入;
没有位置,使用equals()比较是否相等,
找到相等的,新值覆盖旧值;不相等,使用链表连接在一起,
(JDK1.8中,链表长度到8,转成红黑树,红黑树数量减少到6,转回链表)
(当负载率(加载因子)到0.75,新建翻倍容量的新数组,所有数组重新哈希,放入新数组);
问题:即想线程安全,又想效率高?怎么解决?
JDK1.5后引入的ConcurrentHashMap,
通过把整个Map分为N个Segment(类似HashTable),
可以提供相同的线程安全,效率提升N倍,默认提升16倍;
3.高并发下的多线程处理:
3.1线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位;
3.2线程是进程的子集,一个进程中可以有多个线程,每个线程执行不同的任务,不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间;
3.3Java中实现线程的方式:继承Thread类,实现Runable接口(重写Run方法);【java只支持单继承多实现】;
3.4start():用来启动新创建的线程,而且start()内部调用了Run方法,(当你直接调用Run()的时候,只是会在原来的线程中调用,没有新的线程启动)
3.5Runable和Callable的区别:
Runable从JDK1.0就有了,Callable在JDK1.5增加的,
主要区别是Callable的call方法可以返回值和抛出异常,而Runable的run方法没有这些功能;
3.6线程安全:
如果代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码,如果每次运行的结果和单线程运行的结果是一样的,就是线程安全的;
3.7JDK1.5增加了线程并发库
Java.util.concurrent包提供了线程的运行,线程池的创建,线程生命周期的控制;
Executors创建4种线程池:
可以缓存的线程池:newCacheThreadPool;
控制最大并发数的:newFixedThreadPool,超出的线程会在队列中等待;
支持定时及周期性任务执行的:newScheduledThreadPool;
单线程化的线程池:newSingleThreadExecutor;
4.反射:
获取私有方法:class.getDeclaredMethods
使用反射的优缺点:
优点:
能够运行时动态获取类的实例,提高了系统的灵活性和扩展性;
与Java动态编译相结合;
缺点:
使用反射性能较低;
使用反射相对不安全;
破坏了类的封装性,可以通过反射获取类的属性和私有方法;
5.Spring与SpringMVC父子容器:
6.优化数据库:
优化sql语句(根据主键查询、使用单表查询、条件用in);
创建索引(CREATE INDEX 索引名字 ON 表名称(列名称 [规定你需要索引的列]));
添加缓存;
数据库读写分离;
定期将历史数据进行转储;
分库分表;
7.Nginx怎么实现的图片回显:
使用的是反向代理机制;
当用户发起一个请求,被nginx的监听器拦截,
nginx通过配置文件,将用户的请求路径进行中转,转化为数据真实的磁盘路径,根据路径发起Http请求,
从服务器中正确获取数据后,返回给nginx,
nginx将返回的数据返回给用户;
Nginx的功能:
反向代理、负载均衡、Http服务器(动静分离)、正向代理;
8.Mysql读写分离、主从复制:
让主数据库响应事务性的操作,丛数据库响应非事务性的操作;
然后采用主从复制把主数据库的事务性操作同步到从数据库;
why什么实现读写分离:
数据库的写入会影响查询的效率;
主从复制过程:
主库将更新的事件记录到二进制文件中,记录完成后,主库会告诉存储引擎提交事务,
丛库将主库的二进制文件复制到本地的中继日志中,丛库会启动一个I/O线程跟主库建立一个连接,将二进制日志中的事件记录到中继日志中,
丛库的SQL线程会从中继日志中读取事件并在备库执行;
9.基础:
1.接口不可以被类继承,但是接口可以被接口继承;
2.类实现接口,必须实现接口的方法;抽象类可以不用实现接口的方法;
3.一个类只能继承一个父类,但可以实现多个接口;
4.一个接口可以继承多个接口,却不能实现任何接口,接口是支持多继承的;
10.Mysql:
1.查询每门课都大于80的学生姓名:
select distinct name from score where name not in(select distinct name from score where fenshu <=80)
或者:select name from score group by name having min(fenshu) >80
2.case when 语句:
select id,name,kecheng,fenshu,case when fenshu >=90 then 'pass+pass' when (fenshu >=80 and fenshu <90) then 'pass' else 'fail' end as remark from score
11.自动装箱:基本数据类型转换成对应的包装类型(valueOf方法)
自动拆箱:包装类型转换成对应的基本数据类型(intValue方法)
12.JDK1.8新特性: