JavaJAVA从入门到放弃

JAVA面试知识点整理

2019-09-29  本文已影响0人  chuan_bai

JAVA面向对象特性

事务的四大特性

数据库隔离级别

事务的传播特性

计算机网络分了哪七层

数据库索引

数据库引擎

JAVA中的集合

Collection 是所有集合类的接口,List和Set都是继承自Collection接口,Collection 继承自Iterable接口(迭代器)

  1. List:有序(存储顺序和取出顺序一致),可重复
    • ArrayList
      • 底层数据结构是数组。
        线程不安全ArrayList的默认初始化容量是10,每次扩容时候增加原先容量的一半,也就是变为原来的1.5倍
    • LinkedList
      • 底层数据结构是链表。线程不安全
        底层实现是双向链表[双向链表方便实现往前遍历]
    • Vector
      • 底层数据结构是数组。线程安全,现在已少用,被ArrayList替代,原因有两个:
        Vector所有方法都是同步,有性能损失。
        Vector初始length是10 超过length时 以100%比率增长,相比于ArrayList更多消耗内存
  2. Set:无序,元素不可重复
    • HashSet集合
      • 底层数据结构是哈希表(是一个元素为链表的数组)
    • TreeSet集合
      • 底层数据结构是红黑树(是一个自平衡的二叉树)
      • 保证元素的排序方式
    • LinkedHashSet集合
      • 底层数据结构由哈希表和链表组成。
  3. Map:存储key-value形式的数据
    • hashMap
      • 数组+链表(散列表)+红黑树
    • LinkedHashMap
      • 遍历的是内部维护的双向链表,所以说初始容量对LinkedHashMap遍历是不受影响的
    • TreeMap
      • 实现了NavigableMap接口,而NavigableMap接口继承着SortedMap接口,致使我们的TreeMap是有序的
    • LinkedHashSet


      集合关系图

LinkList 和 ArrayList的区别

HashMap和HashTable

int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);

static int hash(int h) {
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }
 
 static int indexFor(int h, int length) {
        return h & (length-1);
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

想线程安全又想效率高,使用ConcurrentHashMap类,把一个大的map分为N个Segment(类似HashTable),每一段数据分别加锁,可以提供相同的线程安全,但效率提升n倍,默认为16倍

HashMap

装箱和拆箱,为什么要使用拆装箱

Java是一个面向对象的语言,而基本类型,不具备面向对象的特性,没有封装一写好用的方法(如最大值、最小值、缓存值等)

多线程实现方式

  1. 继承Thread类,重写run方法
  2. 实现runable接口,重写run方法

启动方式
Thread thread = new Thread(继承了 Thread的对象/实现了runnable的对象)
thread.setName("设置线程名称")
thread.start();

线程池作用

JAVA通过Executors提供四个静态方法创建四种线程池

  1. 限定线程个数,不会导致由于线程过多导致系统运行缓慢或崩溃
  2. 线程池不需要每次都去创建或销毁,节约了资源
  3. 线程池不需要每次都去创建,响应时间更快

Jsp四大作用域

SpringMVC

  1. 用户发送请求 被前端控制器DispatcherServlet捕获请求, 解析url
  2. 解析url找到 handler对象
  3. 根据获得的Handler,选择合适的HandlerAdapter,填充Handler入参(执行handler)
  4. 选择ViewResovler,通过ViewResovler渲染视图并返回

String,StringBuffer,StringBuilder

String:是不可变的字符串,因为底层使用了不可变的字符数组(用final修饰)
StringBuffer和StringBuilder:是内容可变的字符串,底层是内容可变的字符数组
StringBuffer:是线程安全的,但是效率较低
StringBuilder:是线程不安全的,但是效率高

对JDBC的理解

java只定义接口,让厂商自己实现接口,我们只需要导入对应厂商开发的实现即可,然后以接口方式调用(普通开发者只要 下载驱动,然后 导入即可使用)

触发器

需要有触发条件,当条件满足以后做什么操作
关键字是trigger

  1. 创建语法
    create trigger trigger_name after/before insert/update on 表名 for each row begin sql语句 end;
  2. 删除
    drop trigger trigger_name
  3. 查询
    show triggers;
    show trigger like “%abc%”

数据库分表技术

  1. 垂直分表
    • 把不常用的大字段分离出去,通过外键关联
  2. 水平分表
    • 按时间分表
    • 按区间范围进行分表
  3. hash分表
    • 通过一个原始目标的ID或者名称通过一定的hash算法计算出数据库存储表的表名,然后访问相应的表

依赖注入和控制反转

IOC和DI其实是同一个概念的不同角度的描述(依赖注入是从程序的层面来描述的,控制反转是从容器的角度描述的)

JAVA内存区域

类加载机制

JVM调优工具

垃圾回收算法

  1. 引用计数法
    给对象中添加一个引用计数器,没当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就认为可以被回收。(这个方法实现简单,效率高,但是目前主流虚拟机没有选择这个算法管理内存,主要原因是很难解决对象之间相互循环引用的问题。)
  2. 可达性分析算法
    以“GC Roots”的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的话,则证明此对象时不可能用的
  3. finalize()方法最终判定对象是否存活
    即使在可达性分析算法中不可达的对象,需要经历再次标记过程才真正宣告一个对象死亡

垃圾收集算法

  1. 标记清除算法
    • 效率问题(会遍历内存)
    • 空间问题(标记清除后会产生大量不连续的碎片)
  2. 复制算法
  3. 标记整理算法
  4. 分代收集算法
    • 新生代适合复制算法
    • 老年代适合标记清除算法和标记整理算法

JVM调优指标

调优步骤

REDIS数据结构

REDIS单线程为什么这么快

所有数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题

REDIS单线程如何处理这么多的并发客户端连接

Redis的IO多路复用,redis利用epoll来实现IO多路复用,将连接信息和事件放在队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器

REDIS持久化

在默认情况下,Redis将数据库快照保存在名字为dump.rdb的二进制文件中。可以对Redis进行设置,让它在N秒内数据至少有M个改动这一条件满足时快照备份,一下设置会让Redis在满足“60秒内有至少有1000个键被改动”这一条件时进行快照备份 #save 60 1000

记录的是操作命令,每次有新命令追加到AOF文件时就执行一次fsync,就执行当Redis重启时,程序会重新执行AOF文件中的命令,可以通过修改配置文件来打开AOF功能 #appendonly yes

本质也是一种AOF方式所以必须打开AOF配置,整合了RDB和AOF格式,对AOF文件进行重写
开启混合持久化方式:#aof-use-rdb-preamble yes
AOF手动重写命令:#bgrewriteafo
AOF重写配置:#auto-aof-rewrite-percentage 100 #auto-of-rewrite-min-size 64mb

REDIS缓存淘汰策略

当Redis内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换。交换会让Redis的性能急剧下降,为了限制最大使用内存,Redis提供了配置参数maxmemory来限制内存超出期望大小

上一篇下一篇

猜你喜欢

热点阅读