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新特性:

  

  

  

    

原文地址:https://www.cnblogs.com/yikuan-919/p/10036208.html