├── .gitattributes ├── README.md ├── src ├── 1-java.md ├── 10-设计模式.md ├── 11-框架.md ├── 12-linux.md ├── 13-python.md ├── 14-other.md ├── 15-last.md ├── 2-集合.md ├── 3-线程.md ├── 4-JVM-JMM.md ├── 5-计算机网络.md ├── 6-数据库.md ├── 7-计算机基础.md ├── 8-分布式.md ├── 9-算法.md ├── 简历.md ├── 自我介绍.txt └── 面经.md └── util ├── __pycache__ ├── replaceChineseCharacer.cpython-36.pyc ├── replaceChineseCharacer.cpython-37.pyc ├── util.cpython-36.pyc └── util.cpython-37.pyc ├── mergeFiles.py ├── replaceChineseCharacer.py └── util.py /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > 关于Java基础知识, JVM, 多线程, 计算机网络, 数据库, 分布式, 算法, Java框架, 测试, Linux等知识, 详细答案见`/src/`目录下的细分内容, 里面附有面经 2 | 3 | > ## Java基础 4 | 5 | - java关键字与保留字? goto, const? false, true, null, inner? 6 | - String能被继承吗? 7 | - String底层如何实现? 不可变的好处? 采用什么设计模式? 什么是String Pool? 8 | - 基本类型中的缓冲池? 什么时候使用缓冲池的数据? 9 | - String, StringBuffer, StringBuilder区别? 10 | - 数组定义: String a[10]; 正不正确? 数组等号左边能不能出现数字? 11 | - `System.out.println(25 + "" + 10 + 5);` 输出什么? 12 | - `String.replaceAll(old, new);` 其中old是什么形式? 13 | - String使用"+"拼接快还是使用StringBuilder.append()快? 14 | - 引用类型为null, 能否找到其所属的静态类型? 15 | - switch参数可以有哪些类型? 16 | - Object有哪些方法? 17 | - 构造方法可以有哪些访问修饰符? 18 | - 分析count = count++; 19 | - Math.ceil(), Math.floor(), Math.round() 20 | - Java平台无关性与哪些有关? 21 | - 运算符优先级? 22 | - lambda表达式的作用? 形参列表、代码块? 优点与缺点? 23 | - 多态定义? 抽象定义? 24 | - 多态实现的机制是什么? 25 | - Java中null值是什么? 26 | - 管理文件和目录的类是什么? 27 | - Java如何将一个Date按照某种日期格式显示? 28 | - a += b 与 a = a + b有什么区别? 29 | - 能不能在不进行强制转换下将double赋给long? 30 | - 基础数据类型自动转换规则 31 | - 32位JVM和64位JVM最大堆内存分别是多少? 32 | - | 和 ||, & 和 && 的区别? 33 | - 怎样将byte转换为string? 34 | - B继承A, C继承B, 可以将B转换为C吗? 如 C = (C) B? 35 | - 分析以下代码? 36 | ```java 37 | byte a1 = 1, a2 = 2; 38 | final byte b1 = 2, b2 = 3; 39 | a1 = b1 + b2; // 会不会报错 40 | a1 = a1 + a2; // 会不会报错 41 | ``` 42 | - 分析以下代码 43 | ```java 44 | String s1 = "abc"; 45 | String s2 = new String(s1); 46 | s1 == s2; // true or false 47 | s1.equals(s2); // true or false 48 | ``` 49 | - 分析以下代码 50 | ```java 51 | String s1 = "abc"; 52 | String s2 = "a" + new String("bc"); 53 | s1 == s2; // true or false 54 | ``` 55 | - Java标识符有哪些? 56 | - 一个文件里有多个接口, 编译后有几个class文件? 57 | - Java中基本类型有哪些? 大小? 58 | - Java中数组是基本类型吗? 59 | - 类中方法可以与类同名吗? 60 | - Stream与Reader, Writer区别? 用代码实现一个txt文件的读写 61 | - 用代码实现文件递归查询 62 | - 访问修饰符作用范围? 63 | - Java编译过程? 64 | - Number, ClassLoader可以被继承吗? 65 | --- 66 | - JDBC使用什么设计模式? 67 | - 解释一下驱动在JDBC中的角色? JDBC执行大致流程? 68 | - 类之间存在哪些关系? 69 | - 一般关系型和对象数据模型之间的对应关系? 70 | - 一个类可以同时继承和实现其它类吗? 有没有先后顺序? 71 | - JRE判断程序是否执行结束的标准是什么? 72 | - JDK, JRE, JVM的区别和联系? 73 | - equals与hashCode联系? equals默认比较什么? 74 | - 为什么实现equals必须重新hashCode? 75 | - Java中Arrays.sort()如何实现排序? 76 | - JDK消费者生产者模型应用? 77 | - final修饰符有什么好处? 可以修饰哪些东西? 78 | - 为什么需要克隆, 直接new一个对象不行吗? 浅克隆与深克隆如何实现? 79 | - Java中的char可以存汉字吗? 能存所有汉字吗? 80 | - RTTI? 81 | - 注解有什么用? 如何自定义注解? 82 | - Java与C++比较? 83 | - public static void main(String[] args); 需要注意哪些? 一个类里面可以有多个main方法吗? main方法可以用final修饰吗? 可以用abstract修饰吗? 可以用synchronized修饰吗? 84 | - 为什么Java中有些接口没有任何方法? 85 | - 如何实现类似于C中的函数指针功能? 86 | - 面向对象和面向过程的区别? 87 | - 内部类有哪些? 88 | - 为什么非静态内部类不能定义静态方法, 静态成员, 静态初始化块? 89 | - 什么是反射, 反射优缺点? 90 | - 反射破坏了面向对象的什么? 91 | - 反射创建实例的三种方法? 92 | - 反射中Class.forName()与ClassLoader()区别? 93 | - 动态代理的几种实现方式? 优缺点? 可以通过类实现吗? 94 | - 如何获取父类的类名? 95 | - 什么是泛型? 限定通配符与非限定通配符? List< String > 能否传递给 List< Object >? Array可以使用泛型吗? 96 | - 泛型会不会导致程序执行速度下降? 97 | - 什么是泛型擦除? 98 | - try-catch-finally执行过程? finally是不是一定会执行? 99 | - 拆箱与装箱? 100 | - UML有哪些表示? 101 | - 有哪些处理错误的方式? 102 | - PHP与Java的区别? 103 | - Java类什么时候加载? 104 | - static原理? 105 | - static方法能否被覆盖? private方法能不能被覆盖? 106 | - 类方法内需要注意什么? 类方法能引用对象变量吗? 107 | - 什么是类成员, 对象成员? 108 | - 抽象类和接口区别? 如何选择? 109 | - 面向对象的特性有哪些? 110 | - 重载与重写定义? 构成重载条件? 函数返回值的不同可以作为重载吗? 构成重写条件? 111 | - 被final修饰的方法能够被重载吗? 能够被重写吗? 112 | - 数组和链表数据结构描述, 各自时间复杂度? 113 | - 异常分为哪些? 异常基类? 114 | - 类加载过程, 机制? 有什么优势? 类加载器有哪些? 115 | - 解释一下Serialization和Deserialization? serialVersionUID有什么用? 116 | - 被static或transient修饰的属性能被序列化吗? 117 | - "a == b" 与 a.equals(b)的区别? 118 | - 开发中用字节流好还是字符流好? 119 | - Comparable和Comparator的区别? 120 | - Java正则表达式匹配"成都市(武侯区)(高新区)"中的成都市? 121 | ```java 122 | Pattern pattern = Pattern.compile(".*?(?=\\()"); 123 | Matcher matcher = pattern.matcher(str); 124 | if (matcher.find()) { 125 | System.out.println(matcher.group(0)); 126 | } 127 | ``` 128 | - Java中socket连接过程? 129 | - Java中的引用有哪些类型? 目的是什么? 使用软引用能够带来什么好处? 130 | - throw和throws的区别? 131 | - 处理完异常后, Exception会有什么变化? 132 | - Java中用什么数据类型来代表价格? 133 | - 64位JVM中int的长度是多少? 134 | - final, finally, finalize的区别? 135 | - 编译器常量有什么风险? 136 | - 构造方法能不能被继承? 有没有返回值? 137 | - this()写第一行的原因? super()写第一行的原因? 可以写在一起吗? 138 | - 类初始化过程? 139 | - Collection与Collections的区别? 140 | - '0', 'A', 'a', ' ' 的ASCII码是多少? 141 | - 在Java中unicode占多少字节? UTF-8下中文占多少字节, 英文占多少字节? GBK呢? 142 | - instacneof有什么作用? 143 | - System.arraycopy(), clone(), Arrays.copyOf(), for对数组的复制效率? 144 | --- 145 | - 什么是servlet? 146 | - servlet生命周期? 147 | - servlet处理流程? 148 | - 服务端包含? 149 | - 什么是servlet链? 150 | - servlet安全性? 151 | - Tomcat结构以及类加载流程? 152 | --- 153 | 154 | 155 | > ## 集合问题 156 | 157 | - 线程同步的集合有哪些? 158 | - 哪些类实现了Collection接口? 159 | - 为什么集合没有实现Cloneable和Serializable? 160 | - Iterator和ListIterator区别? 161 | - Enumeration接口和Iterator接口的区别? 162 | - 快速失败(fail-fast)和安全失败(fail-safe)区别? 163 | - 数组和列表有什么区别? 如何选择 164 | - ArrayList与LinkedList区别? 底层原理? ArrayList扩容、删除如何实现? 165 | - LinkedList适合什么排序? 166 | - 用过哪些Map类, 都有神马区别? HashMap实现过程(JDK1.8)? put、扩充等实现过程? 167 | - 为什么HashMap里数组使用transient修饰? 168 | - HashMap的长度为什么是2的幂次方? 169 | - HashMap链表插入是头插入还是尾插入? 头插入会造成什么问题? 170 | - HashMap为什么用红黑树而不用AVL树? 171 | - concurrentHashMap实现原理? JDK1.7与JDK1.8区别? 172 | - HashTable和HashMap的区别? 173 | - HashTable和concurrentHashMap的区别? 174 | - HashSet, TreeSet, LinkedHashSet之间的区别? HashSet内部原理? 175 | - 阻塞队列, ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, DelayQueue, SynchronousQueue各自特点? 非阻塞队列? 176 | - 阻塞队列的插入、移除方法? 177 | - Set了解过吗? 知道add()会出现什么问题吗? 178 | --- 179 | 180 | 181 | > ## 线程 182 | 183 | - 如果一个线程构造了一个不可变对象, 就可以保证这个对象被其它程序正确查看吗? 184 | - 线程调用过程? 185 | - 守护线程和用户线程区别? 186 | - 你对线程优先级的理解? 187 | - 同步方法和同步块哪种方式好? 188 | - 线程有哪些状态? 画一下线程状态转移图 189 | - 数据库连接池与线程池? 190 | - 为什么使用线程池, 为什么使用数据库连接池? 191 | - 线程池ThreadPoolExecutor有哪些参数? 192 | - 线程池中线程任务数超过核心数会发生什么? 阻塞队列大小? 193 | - 线程池的组成? 194 | - Java线程池工作原理(过程)? 195 | - newSingleThreadExcutor, newFixedThreadPool, newCachedThreadPool, newScheduledThreadPool, newSingleThreadScheduledExcutor区别? 196 | - 线程池的关闭有几种方式? 有哪些状态? 状态转移? 197 | - 说一说ThreadLocal使用, 原理? 198 | - ThreadLocal内存泄露? 如何解决? 199 | - 为什么ThreadLocal要使用弱引用? 200 | - synchronized锁的范围? 201 | - synchronized与Lock比较(锁与同步锁的比较)? 202 | - synchronized与cas比较? 203 | - 说说 synchronized 关键字和 volatile 关键字的区别 204 | - 介绍一下AQS? 205 | - ReentrantLock如何实现可重入? 如何实现公平锁与非公平锁? 206 | - 在监视器内部如何做到线程同步? 程序应该用哪种级别的同步? synchronized如何实现可重入(底层)? 207 | - 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化, 可以详细介绍一下这些优化吗 208 | - 什么是自旋锁, 阻塞锁, 可重入锁, 乐观锁和悲观锁(使用场景, 各自实例), 轮询锁, 显示锁和内置锁, 读写锁, 对象锁和类锁, 锁粗化, 互斥锁, 消除锁, 轻量锁和偏向锁(这两个属于什么类型的锁)? 有几种锁状态? 209 | - volatile实现原理? 保证了什么? 能否保证原子性? 210 | - CAS机制? 包含哪些操作? 会产生哪些问题? 如何避免ABA问题? 211 | - 有哪些原子类? 212 | - 什么是原子操作? 什么是内存屏障? 213 | - 线程池设置大小与CPU的关系? 214 | - Thread中join()方法的原理? 215 | - Thread.wait()可以设置超时吗? 216 | - Java主线程如何捕获子线程抛出的异常? 217 | - 线程安全的实现方法? 218 | - 如何判断线程是否终止? 如何正确终止处于运行状态的线程? 219 | - isInterrupted和interrupted的区别? 220 | - 并行和并发的区别? 221 | - 什么是协程? 222 | - 一个类可以同时继承Thread和实现Runnable接口吗? 223 | - 如何让正在运行的线程暂停一段时间? 224 | - sleep和yield的区别? 225 | - sleep和wait的区别? 226 | - 线程挂起怎么办? 227 | - 导致死锁的原因? 怎么解除死锁? 228 | - 死锁, 饥饿, 活锁之间的定义区别? 229 | - 当一个线程进入一个对象的一个synchronized方法后, 其他线程是否可以进入该对象的其他方法? 230 | - 线程实现接口 VS 继承Thread 231 | - FutureTask是什么? 232 | - 说一下CylicBarrier与CountDownLatch的区别? 233 | - CylicBarrier与CountDownLatch内部实现原理? 234 | - Random与ThreadLocalRandom? 235 | - ReentrantReadWriteLock原理 236 | - 什么是Semaphore? Exchanger? 237 | - NIO, BIO, AIO区别? 谈谈Reactor模型 238 | - 阻塞与非阻塞, 异步与同步区别? 239 | - 加入有一个第三方接口, 有很多线程去调用获取数据, 现在规定每秒钟最多有10个线程同时调用它, 如何做到? 240 | - 线程之间相互协调完成某个工作, 如何设计? 241 | - 如何实现一个并发安全的链表? 242 | - 如何保证N个线程可以访问N个资源, 同时又不会导致死锁? 243 | - 高并发下如何做到安全地修改一行数据? 244 | - 多个线程达到同一个状态再执行, 如何实现? 245 | - 如何指定多个线程顺序? 246 | - 如何控制线程在某个时间内完成, 不完成就撤销? 247 | - 为什么使用读写锁而不使用synchronized这类锁? 248 | - 实现多线程的方法? 249 | - 实现Runnable接口和Callable接口的区别? 250 | - 执行execute()方法和submit()方法的区别是什么呢? 251 | - 如何创建线程池? 252 | 253 | --- 254 | 255 | 256 | > ## JVM虚拟机与JMM内存模型 257 | 258 | - JVM, JMM 259 | - JVM内存模型(介绍下 Java 内存区域/运行时数据区)? 程序计数器, 栈, 堆, 方法区? 260 | - JDK1.7之前常量池在哪里? 之后在哪里? 261 | - JDK1.8永久代变为了什么? 262 | - Java内存模式对final的实现? 什么是引用逃逸? 263 | - 什么是元空间? 264 | - Java基本类型、引用类型在内存中的存储原理? 265 | - JVM如何判断两个类是否相同? 266 | - 分析 `Object obj = new Object();` 对象创建过程? 267 | - `String.intern()`? 268 | - `String s = new String("abc");`创建了几个对象? 269 | - 栈中对象引用有几种方法? 详细介绍一下区别? 270 | - JVM年轻代与老年代? 年轻代垃圾回收过程? 271 | - 永久代会发生垃圾回收吗? 272 | - JVM年轻代中Eden与survivor的比例? 273 | - 垃圾回收算法有哪些? 274 | - 垃圾回收策略? 275 | - 垃圾收集器有哪些? CMS特点? 276 | - CMS中什么是浮动垃圾? 277 | - 比较一下G1与CMS? 278 | - 整个JVM大小? 279 | - 年老代堆空间被占满如何解决? 持久代被占满如何解决? 堆栈溢出如何解决? 280 | - 如何解决异常Fatal: Stack size too small? 281 | - 如何解决异常java.lang.OutOfMemoryError: unable to create new native thread? 282 | - JMM内存模型中的规定了哪八种操作? 什么是重排序? 283 | - 内存模型三大特性? 原子性、可见性、有序性如何实现? 284 | - 堆上的内存如何释放, 栈上的内容如何释放? 285 | - Java内存泄露的最直接表现? 286 | - 什么是内存溢出, 什么是内存泄露? Java会不会发生内存泄露? 287 | - 什么情况下会发生内存溢出? 288 | - 老年代溢出原因? 永久代溢出原因? 289 | - 如果对象的引用被置为null, 垃圾回收器是否会立即释放该对象占用的内存? 290 | - Java中对象什么时候可以被垃圾回收? 291 | - 你能保证GC吗? 292 | - finalize什么时候使用? 为什么避免使用? 293 | - JVM如何确定一个对象是不是有引用? 294 | - GC Roots包含哪些? 295 | - GC Roots 对不可用对象的判断过程? 296 | - 什么时候新生代会发生GC? 老年代发生GC条件? Full GC 触发条件? + 297 | - 永久代回收条件? 298 | - GC为什么要分代? 299 | - JVM中大对象被分配到哪里? 长期存活对象进入哪里? 什么是空间分配担保? 300 | - 进入老年代的几种情况? 301 | - JRE判断程序是否结束的标准? 302 | - 什么是安全点? 303 | - 什么是happens-before(先发行为原则)? 304 | - 对象创建的过程? 305 | - 对象内存布局? 306 | - 被动引用有哪些情况? 307 | - 静态解析和动态解析? 308 | - 静态分配和动态分配? 309 | - 频繁FullGC如何排查? 310 | - JVM中存在大量图片如何解决? 311 | - 双重校验锁为什么要加锁后再次判断是否为空? 为什么外面还要判断? 312 | 313 | --- 314 | 315 | 316 | > ## 计算机网络 317 | 318 | - 什么是URI 319 | - URL格式? 320 | - Http请求和响应结构? 321 | - HTTP请求头与请求行之间是什么? 322 | - 什么是Cookie? Session和Cookie的区别? Cookie被禁用解决办法? 323 | - 浏览器和Servlet通信协议? 324 | - HTTP隧道? 325 | - URL解码与编码? 326 | - 常见HTTP状态码: 100, 200, 301, 302, 400, 401, 403, 404, 500, 502, 503, 504 327 | - 301和302区别? 328 | - HTTP状态码502与504区别? 329 | - HTTP请求有哪些? 330 | - post与get的区别? 331 | - 为什么get效率高于post? 332 | - HTTP协议? 特点? 333 | - HTTP长连接与短连接? 非流水线与流水线? 334 | - HTTP1.1与HTTP1.0比较? HTTP2.0与HTTP1.x比较? 335 | - HTTP2.0 多路复用与HTTP1.X中的长连接比较? 336 | - HTTP2.0中服务端推送? 337 | - 一次完整的HTTP请求? 338 | - HTTP是有状态还是无状态? 如何记住上次请求的用户? 339 | - HTTPS交互过程? 与HTTP比较? 340 | - SMTP, DNS, HTTPS端口号与通信协议? 341 | - 什么是RESTful? 342 | - 什么是token? 343 | - HTTP是基于TCP还是UDP? 344 | - TCP三次握手与四次挥手? 345 | - TCP三次握手的必要性? 346 | - 为什么不能进行两次握手连接? 347 | - 为什么连接的时候是三次握手, 关闭的时候是四次挥手? 348 | - 如果已经建立了连接, 但客户端忽然出故障了怎么办? 349 | - TIME_WAIT与CLOSE_WAIT区别? 350 | - TIME_WAIT为什么要等待2MSL, 可以等待1MSL吗? 351 | - 什么是SYN攻击, 如何检测, 如何防御? 352 | - TCP流量控制? 353 | - 什么是流量控制? 流量控制和拥塞控制是一种东西吗? 354 | - 滑动窗口机制? 355 | - 拥塞避免机制? 356 | - TCP, UDP的区别? 357 | - TCP, UDP的应用场景? 358 | - TCP可靠传输的实现? 359 | - TCP粘包现象? 如何解决? 360 | - 如何用UDP实现可靠性传输? 361 | - UDP为什么不会发送粘包现象? 362 | - UDP为什么采用链式传播? 363 | - UDP有发送缓冲区吗? 364 | - TCP, UDP, IP在传输过程中数据的最大值? 365 | - 段, 数据包, 帧? 366 | - TCP中keep alive与HTTP中的keep-alive区别? 367 | - 稳定且有上限的带宽条件下, 超大文件从server传输到client端, 选择一个TCP连接快还是构建多个TCP连接快? 368 | - TCP包结构? TCP, UDP, MAC, IP包头有多少字节? 369 | - OSI七层模型, TCP/IP四层模型 370 | - 如何查找域名对应IP? 371 | - 有网络层的存在为什么还需要传输层? 372 | - ICMP协议? ping功能? 373 | - 路由功能? 分组和路由选择的区别? 什么是AS? 常用路由选择协议? 374 | - IP地址分类 375 | - ARP 376 | - 数据链路层的作用? 377 | - 浏览器从一个请求发送到返回经历过程中的优化有哪些? 378 | - 浏览器访问一个网站的过程? 会用到哪些协议? 379 | - CSRF和XSS区别? 各自解决方法? 380 | - 什么是ajax? 381 | - SOAP和REST有什么区别? 382 | - 什么是XML? 383 | - PV和UV区别? 384 | - 什么是跨域, 如何解决? 385 | - 客户端缓存过期机制, 缓存验证? 386 | - 数据包的流动? 387 | - forward和redirect的区别? 388 | - URL重写技术? 389 | - IP寻址过程? 390 | - 客户端与服务端建立TCP连接三次握手前做了什么? 391 | 392 | --- 393 | 394 | 395 | > ## 数据库 396 | 397 | - ER图? 398 | - SQL与NoSQL区别? 399 | - 数据库分表? 分片规则? 分表带来的事物问题、join查询、全局主键重复问题如何解决? 400 | - 事物的两个特性? 401 | - 什么是存储过程? 与函数有什么区别和联系? 402 | - 什么是游标? 403 | - 什么是触发器? 404 | - 什么是视图? 如何进行操作? 405 | - 什么是ACID? 具体? 406 | - 说一下一范式, 二范式, 三范式? 举例说明 407 | - InnoDB乐观锁如何实现? 408 | - InnoDB有多少种日志? 409 | - MySQL中redo log与undo log区别? 410 | - MySQL约束类型? 411 | - MySQL有哪些语言? 412 | - MySQL有哪些数据类型? ip用什么类型存储? 电话号码用什么类型存储? 413 | - MySQL连接有哪些方式? 内连接与外连接有什么区别? 默认使用什么连接? 414 | - MySQL中exist和in的区别? 415 | - union和union all区别? 416 | - group by, having, where区别? 417 | - count(\*), count(column), count(1)的区别? 418 | - drop, truncate, delete区别? 419 | - MySQL有哪些搜索引擎? MySQL索引有哪些? 什么是倒排索引? 420 | - MySQL如何删除外键? 421 | - MySQL数据库索引原理? 422 | - MySQL数据库优化? 423 | - 聚集索引与非聚集索引区别? 424 | - MySQL索引优化? 425 | - 为什么要使用索引? 索引那么多有点为什么不对表中的每一列都创建索引? 426 | - 什么是覆盖索引? 427 | - 索引是如何提高查询速度的? 428 | - MySQL在哪些情况下索引会失效? 429 | - MySQL索引使用条件? 性别适合使用索引嘛? 430 | - MySQL如何优化数据访问? 431 | - 什么是最左匹配原则? 什么是联合索引? 432 | - MySQL封锁粒度? 封锁类型? 封锁协议? 433 | - 什么是当前读与快照读? 434 | - MySQL有哪些锁? InnoDb行锁有几种? 什么是死锁? 数据库死锁如何解决? 435 | - InnoDB的行锁加什么完成? 436 | - MySQL事物隔离级别? 各自会带来什么问题? 437 | - MySQL如何解决RC, RP带来的问题? 什么是MVCC? 438 | - MySQL如何解决幻读? 439 | - MySQL主从复制过程? 读写分离好处? 440 | - InnoDB与MyISAM的区别? 441 | - 如果数据库日志满了, 会出现什么情况? 442 | - 如何查看慢查询? 443 | - B+ Tree 与B Tree区别? 444 | - B+ Tree操作过程? 445 | - B+ Tree 与红黑树比较? 446 | - JDBC处理事务采用什么方法? 447 | - JDBC中getString()和getObject()区别? 448 | - 数据库如何查询大数据 449 | --- 450 | - Redis是数据库吗? 451 | - 为什么Redis是单线程还这么快? 452 | - Redis数据持久化如何实现? 453 | - AOF文件过大如何解决? 454 | - Redis如何保证原子性? 455 | - Redis主从复制模式下, 主挂了怎么办? 456 | - Redis缓存更新策略? 457 | - Redis底层数据结构(有哪些数据类型)? 跳跃表如何实现? 压缩列表是什么? 458 | - Redis使用场景? 459 | - 与Memcached比较? 460 | - Redis数据淘汰策略? 461 | - Redis如何实现事务? 462 | - Redis复制如何实现? 什么是主从链? 463 | - Redis切片? 464 | - 常见的缓存策略? 465 | - 如何防止缓存雪崩? 466 | - 如何防止穿透? 467 | - 什么是缓存预热? 468 | - 什么是缓存无底洞现象? 469 | - 如何保证缓存与数据库的双写一致性? 470 | - MySQL数据备份与恢复 471 | 472 | --- 473 | 474 | 475 | > ## 计算机基础 476 | 477 | - 栈有哪些用途? 478 | - 原码, 反码, 补码 479 | - 进程间的通信方式? 480 | - CPU占用率100%怎么查? 481 | - 操作系统有哪些部分组成? 482 | - 什么是大端, 小端? 483 | - 上下文? 484 | - 上下文切换步骤? 485 | - 进程切换步骤? 486 | - 进程切换一定比线程切换开销大吗? 487 | - 引起线程上下文切换的原因? 488 | - 程序计数器? 489 | - PCB-切换帧? - 490 | - 线程调度算法? 491 | - JVM如何实现线程调度? 492 | - 进程调度算法? 493 | - 死锁处理方法? 494 | - 分页与分段的比较? 495 | - 虚拟内存? 496 | - 页面置换算法? 497 | - I/O复用 498 | - 线程和进程的区别? 多线程和单线程的区别? 499 | - 计算机判断是否有中断应该是什么时候? 降低进程优先级的时机? 500 | - 实时操作系统与分时操作系统的区别? 501 | - 中断, 异常 502 | - 内存碎片如何解决? 503 | 504 | --- 505 | 506 | 507 | > ## 分布式 508 | 509 | - 集群、分布式、微服务区别? 510 | - 微服务的优点与缺点? 511 | - 分布式锁的实现? 512 | - CAP理论? BASE理论? 513 | - 2PC, 3PC? 514 | - 什么是RMI? 什么是RPC? 515 | - RPC与REST区别? 516 | - 什么是一致性哈希? 517 | - 反向代理与CDN加速的区别? 518 | - 大型网站核心架构要素? 519 | - 网站性能测试的主要指标? 520 | - 性能测试包括哪些? 521 | - Web前端性能优化? 522 | - 应用服务器性能优化? 523 | - 典型的网站分层架构? 524 | - 如何实现应用层高可用? 525 | - 应用服务的Session如何管理? 526 | - 如何实现高可用服务器? 527 | - 如何实现高可用数据? 528 | - 如何实现网站的可伸缩性? 529 | - 什么是负载均衡? 有哪些实现方式? 530 | - 四层负载均衡与七层负载均衡? 二层负载均衡? 三层负载均衡? 531 | - LVS? LVS-NAT? LVS-DR? LVS-Tun? Lvs-FULLNAT? 532 | - Nginx与LVS比较? 533 | - 正向代理和反向代理? 534 | - Nginx负载均衡策略? 535 | - 网站攻击方式? 536 | - 如何实现服务限流(有哪些限流策略)? 537 | - 分布式事务解决方案? 538 | - 如何实现单点登录? 539 | --- 540 | - 什么是zookeeper? 原理? session, ZNode, 版本, 顺序访问 541 | - 什么是Dubbo? 框架图? 有哪些节点角色? 542 | - kafka? 543 | - Hbase? 544 | - springCloud与Dubbo区别? 545 | - springCloud基本功能? 546 | - Eureka? 可以被什么替代? 与zookeeper比较? 还有哪些注册服务? zookeeper可以实现负载均衡嘛? 547 | - Ribbon负载策略? 548 | - Hystrix容错实现方式? 熔断、资源隔离、降级. 限流? 549 | - Alibaba Sentinel 熔断降级方式? 550 | - Feign? 551 | - 网关服务? 什么是网关? 552 | - 配置中心? SpringCloud Bus? 553 | - zipkin? + 554 | - 微服务设计准则? 555 | - 如何保证幂等性? 556 | - RabbitMQ? 557 | - 为什么使用RabbitMQ? 如何保证消息正确发送? 如何保证消息接收方消费了消息? 如何避免消费重复投递或重复消费? 基于什么传输? 消息如何分发? 如何保证消息可靠传输? 如何保证消息顺序性? 558 | - 使用消息队列的好处? 使用消息队列会带来什么问题? 559 | 560 | --- 561 | 562 | 563 | > ## 算法 564 | 565 | - 算法定义? 566 | - 你了解大O吗? 你能给出不同数据结构的例子吗? 567 | - 如何权衡使用有序数组还是无序数组? 568 | - 五大基础算法? 569 | - 红黑树? 570 | - BitMap如何实现? 有哪些应用? 什么是布隆过滤? 571 | - RSA算法? 572 | - 动态规划的三个概念? 573 | - 什么是前缀树? 应用? 574 | - 对称加密和非对称加密? 575 | - 各种排序算法时间复杂度与空间复杂度比较? 冒泡、交换、选择、插入、基数、希尔、快排、归并、堆 576 | - 二叉树中两个节点的公共祖先? 577 | - 从100亿条记录中找出重复数最多的前10条? 578 | - 一个文本行, 大约有一万行, 每行一个单词, 要统计最频繁的前10个? 579 | - 100万个数中找出最大的100个数? 580 | - 动态规划与贪心算法的区别 581 | 582 | --- 583 | 584 | 585 | > ## 设计模式 586 | 587 | - 设计模式分为几大类? 588 | - 说一说有哪些设计原则? 589 | --- 590 | - 懒汉与饿汉区别? 实现单例模式的方法? 591 | - 单例模式有什么特点? 应用场景? 592 | - 工厂模式有哪些? 之间的区别(三种工厂模式的比较)? 593 | - 生成器/建造者(Builder) 594 | - 原型模式 595 | --- 596 | - 责任链模式 597 | - 命令模式 598 | - 解释器 599 | - 迭代器 600 | - 中介者 601 | - 备忘录 602 | - 观察者 603 | - 状态 604 | - 策略 605 | - 模板 606 | - 访问者 607 | - 空对象 608 | --- 609 | - 适配器 610 | - 桥接模式 611 | - 装饰器 612 | - 外观模式/门面模式(Facede) 613 | - 享元模式(Flyweight) 614 | - 代理模式 615 | --- 616 | 617 | 618 | > ## 框架 619 | 620 | - Maven特点? 621 | - Solr是什么? 622 | - Thymeleaf是什么? 623 | - 什么是webService? + 624 | --- 625 | 626 | > ## JSP 627 | 628 | - JSP有哪些动作? 629 | - 会话跟踪技术? 630 | - JSP内置九大类型? 631 | --- 632 | 633 | > ## MyBatis 634 | 635 | - MyBatis中#{}和${}的区别? 636 | - PreparedStatement与Statement区别? 637 | - Mybatis缓存? 638 | - 什么是MyBatis? 639 | - 当实体类的属性名和表中的字段名不一样, 怎么办? 640 | - 通常一个Xml映射文件, 都会写一个Dao接口与之对应, 请问, 这个Dao接口的工作原理是什么? Dao接口里的方法, 参数不同时, 方法能重载吗? 641 | - MyBatis如何实现分页? 分页插件的原理? 642 | - 如何获取插入数据id? 643 | --- 644 | 645 | > ## spring 646 | 647 | - Spring有哪些特点? 648 | - Spring核心? 649 | - Spring中的IOC有几种注入方式? 650 | - Spring提供哪些配置方式? 651 | - 什么是IOC/DI,什么是AOP? AOP的实现方式? 652 | - Spring IOC 容器初始化过程? 653 | - 为什么用Spring IOC 而不用工厂模式? 654 | - Spring事物的传播级别? 655 | - Spring中的事物隔离级别? 656 | - Spring中Bean的Scope作用域? 657 | - 什么是Spring Bean? 658 | - SpringMVC路由怎么写? 659 | - SpringMVC如何接受ajax? 660 | - SpringMVC用到了那个核心servlet? 661 | - SpringMVC核心控制器是什么? 请求流程? 662 | - SpringBoot优点? 663 | - 关于加@Transactional注解的方法之间调用, 事物是否生效? 664 | - Bean的生命周期? 665 | - Spring用了哪些设计模式? 666 | - Spring三大核心组件? 667 | - Spring框架中的单例Beans是线程安全的么? 668 | - Spring如何处理线程并发问题? 669 | - SpringMVC如何区分post和get? 670 | - Spring中@Autowrited与@Resource的区别? 671 | - Spring中的@RestController, @RequestBody, @Controller, @ResponseBody有什么用 672 | - 过滤器与拦截器的区别? 673 | --- 674 | 675 | 676 | > ## Linux 677 | 678 | - Linux文件和目录操作 679 | - 创建文件, 查看文件 680 | - 创建目录 681 | - 监测程序 682 | - ps和top的区别 683 | - 压缩数据 684 | - 结束进程 685 | - 压力测试衡量CPU的三个指标? 686 | - Linux下查看80端口是否被占用 687 | - 查看内存 688 | - 查看磁盘 689 | - 创建一个新用户 690 | - 文件权限 691 | - 备份 692 | - 你知道库函数和内核调用吗? 693 | 694 | --- 695 | 696 | 697 | > ## Python 698 | 699 | - Pyton垃圾回收策略? 700 | - MVC与MVT模式? 701 | - 什么是wsgi?uwsgi? 702 | - Django请求生命周期? 703 | - 什么是FBV, CBV? 704 | - Django模板中自定义filter与simple_tag区别? 705 | - Flask与Django区别? 706 | --- 707 | 708 | 709 | > ## 测试 710 | 711 | - 对软件测试的理解? 712 | - 一个完整的测试应有哪些阶段组成? 713 | - 单元测试怎么实现? 714 | - 测试用例元素 715 | - 好的测试用例应该从哪些方面考虑 716 | - 软件测试有什么策略和阶段 717 | - 回归测试和冒烟测试 718 | - 软件测试类型 719 | - 用例策略 720 | - 测试用例是什么? 有什么作用? 721 | - 软件缺陷定义 722 | - 缺陷中应该包含什么? 严重等级一般有哪些? 723 | - 给你一个杯子你会怎样测试? 724 | - 测试报告应该包含哪些? 725 | - 测试中出现BUG开发不承认, 你会怎么办? 726 | - 模拟铁路局卖火车, 假设有一条高铁线路, 途径多个城市, 火车上共5000个座位. 请设计一个数据结构, 以检查在某乘车区间内购票是否有座位的方法 727 | - "3-5-8" 原则 728 | 729 | > ## 其他 730 | 731 | - 虚拟化技术? 732 | - 赛马, 有25匹马, 每次只能5匹马比赛, 比赛只能得到5匹马之间的快慢, 而不是速度.请问, 最少比赛多少次, 才能获得最快的前3匹马? 733 | - SSH协议? 什么是跳板机? 734 | - thinkPHP处理流程? 735 | - 敏捷开发与瀑布开发的区别? 736 | --- 737 | 738 | 739 | > ## 项目 740 | 741 | - 项目需求 742 | - 项目实现 743 | - 项目问题, 项目如何解决 744 | - 项目中的优化 745 | 746 | > ## 综合面 747 | 748 | - 为我介绍? 749 | - 优缺点? 750 | - 投简历的时候选择什么样的公司? 751 | - 薪资 752 | - 工作地点 753 | - 对加班看法 754 | - 职业规划? 755 | - 你的人生规划怎样的? 756 | - 平时如何学习, 如何做项目? 757 | - 遇到什么困难? 困难如何解决? 758 | - 你觉得你做项目时最大的收获是什么? 759 | - 如何评价公司的? 760 | 761 | > ## 提问 762 | 763 | - 公司的研发团队目前是什么规模? 开发、测试分别有多少人? 764 | - 现在部门业务方向? 765 | - 如果我有幸能够进入你们部门, 请问到时候是先进行培训还是直接上手项目呢? 766 | - 进入部门之后做的项目是针对某一方向还是看实际接手的项目不固定的那种? 767 | - 晋升制度 768 | --- 769 | 770 | -------------------------------------------------------------------------------- /src/1-java.md: -------------------------------------------------------------------------------- 1 | > ## Java基础 2 | 3 | ## java关键字与保留字? goto, const? false, true, null, inner? 4 | goto没有定义, 但自己也不能使用这样的变量名, 使用编译后会报错 5 | 关键字与保留字作为变量使用会报错 6 | 7 | ## String能被继承吗? 8 | 不能继承, 使用final修饰 9 | 10 | ## String底层如何实现? 不可变的好处? 采用什么设计模式? 什么是String Pool? 11 | 底层实现: 12 | - JDK1.8, String内部使用`private final char value[];` 13 | - JDK1.9, String定义时使用`private final byte value[]`有些字母不需要两个字节, 节省空间 14 | 15 | 不可变的好处: 线程安全, 哈希值存储, 字符串常量池 16 | 17 | 采用享元设计模式 18 | 19 | 字符串常量池在JDK1.7时被转移到堆中, 之前在方法区的运行时常量池中. 20 | 使用字符串常量池, 每当我们使用字面量(`String s="1";`)创建字符串常量时, JVM会首先检查字符串常量池, 如果该字符串已经存在常量池中, 那么就将此字符串对象的地址赋值给引用s(引用s在Java栈中).如果字符串不存在常量池中, 就会实例化该字符串并且将其放到常量池中, 并将此字符串对象的地址赋值给引用s(引用s在Java栈中). 21 | 使用字符串常量池, 每当我们使用关键字new(`String s=new String("1");`)创建字符串常量时, JVM会首先检查字符串常量池, 如果该字符串已经存在常量池中, 那么不再在字符串常量池创建该字符串对象, 而直接堆中复制该对象的副本, 然后将堆中对象的地址赋值给引用s, 如果字符串不存在常量池中, 就会实例化该字符串并且将其放到常量池中, 然后在堆中复制该对象的副本, 然后将堆中对象的地址赋值给引用s. 22 | [原文链接](https://blog.csdn.net/qq_34490018/article/details/82110578) 23 | 24 | ## 基本类型中的缓冲池? 什么时候使用缓冲池的数据? 25 | 对于整数(包括可以自动转型为整数的类型)来说缓冲池大小为[-128, 127], 超出该部分的不共享数据 26 | 27 | ## String, StringBuffer, StringBuilder区别? 28 | 分别是字符串常量, 字符串变量(线程安全但与StringBuilder相比效率不高), 字符串变量 29 | StringBuilder[底层原理](https://blog.csdn.net/AlbenXie/article/details/89739172) 30 | 31 | ## 数组定义: String a[10]; 正不正确? 数组等号左边能不能出现数字? 32 | 不正确, 数组等号左边不能出现数字. 33 | 34 | 数组在new后就会为其分配空间 35 | 36 | ## `System.out.println(25 + "" + 10 + 5);` 输出什么? 37 | 输出"25105", 字符串左边的执行运算操作, 遇到第一个字符串后执行拼接操作. 38 | 39 | ## `String.replaceAll(old, new);` 其中old是什么形式? 40 | 为正则匹配形式 41 | 42 | ## String使用"+"拼接快还是使用StringBuilder.append()快? 43 | 44 | 45 | ## 引用类型为null, 能否找到其所属的静态类型? 46 | 可以通过声明类型来找到静态方法 47 | 48 | ## switch参数可以有哪些类型? 49 | 7之前只能是int类型以及能够自动转换为int类型的变量, 之后开始支持String 50 | 51 | ## Object有哪些方法? 52 | getClass(), equals(), hashCode(), clone(), wait(), notify(), notifyAll(), finalize(), toString() 53 | 54 | ## 构造方法可以有哪些访问修饰符? 55 | 四种修饰符之一, 不能为abstract, static, final等, 不能有返回值 56 | 57 | ## 分析count = count++; 58 | 先将count赋予左边的count变量, 然后右边自增, 最终count值还是自增之前的值 59 | 60 | ## Math.ceil(), Math.floor(), Math.round() 61 | - Math.round(): 将原来的数字加0.5然后向下取整 62 | - Math.ceil(): 向上取整, 符号不变, 可以为-0 63 | - Math.floor(): 向下取整, 符号不变 64 | 65 | ## Java平台无关性与哪些有关? 66 | 字节码技术与JVM虚拟机技术 67 | 68 | ## 运算符优先级? 69 | 单运移比按逻三赋 70 | 71 | ## lambda表达式的作用? 形参列表、代码块? 优点与缺点? 72 | 为替代匿名函数.形式为`()->{}`, 圆括号内为捕获参数, 后面为代码块. 73 | - 优点: 书写方便, 调用速度快, 可以使用非final类型变量 74 | - 缺点: 函数式编程违背面向对象编程; 阅读困难, 因为参数类型可以省略 75 | 76 | ## 多态定义? 抽象定义? 77 | 编译期与运行期运行结果不一致即多态. 78 | 79 | ## 多态实现的机制是什么? 80 | 重载与重写 81 | 82 | ## Java中null值是什么? 83 | 对象的值为null指这个对象为空对象. 84 | 85 | ## 管理文件和目录的类是什么? 86 | File, 方法有: createFile(), delete(), isFile(), exists(), listFiles(), isDirectory(), mkdir(), getName(), getPath(); 87 | 88 | ## Java如何将一个Date按照某种日期格式显示? 89 | `java.text.SimpleDateFormat` 90 | 91 | ## a += b 与 a = a + b有什么区别? 92 | 后者会强制转换 93 | 94 | ## 能不能在不进行强制转换下将double赋给long? 95 | 不行, 只可以long不强制转换为double 96 | 97 | ## 基础数据类型自动转换规则 98 | (byte, short, char) -> int -> long -> double <- float 99 | 100 | ## 32位JVM和64位JVM最大堆内存分别是多少? 101 | 都是32位 102 | 103 | ## | 和 ||, & 和 && 的区别? 104 | 后者为短路逻辑比较 105 | 106 | ## 怎样将byte转换为string? 107 | new String(str.getBytes(), "utf-8"); 108 | 109 | ## B继承A, C继承B, 可以将B转换为C吗? 如 C = (C) B? 110 | 可以进行强制转换, 但是不推荐 111 | 112 | ## 分析以下代码? 113 | ```java 114 | byte a1 = 1, a2 = 2; 115 | final byte b1 = 2, b2 = 3; 116 | a1 = b1 + b2; // 会不会报错 117 | a1 = a1 + a2; // 会不会报错 118 | ``` 119 | 120 | 第一行不会报错, 因为b1, b2为final变量不会对其进行转换; 第二行会报错, 在进行运算时a1, a2会转换为int型, 其结果不能自动转换为byte型 121 | 122 | ## 分析以下代码 123 | ```java 124 | String s1 = "abc"; 125 | String s2 = new String(s1); 126 | s1 == s2; // true or false 127 | s1.equals(s2); // true or false 128 | ``` 129 | 第一行为false, 第二行为true 130 | 131 | ## 分析以下代码 132 | ```java 133 | String s1 = "abc"; 134 | String s2 = "a" + new String("bc"); 135 | s1 == s2; // true or false 136 | ``` 137 | 结果为false, 使用new创建的都是新的对象 138 | 139 | ## Java标识符有哪些? 140 | 数字, 字母, 下划线, $; 变量方法不能以数字开头 141 | 142 | ## 一个文件里有多个接口, 编译后有几个class文件? 143 | 有多少个接口编译过后就有多少个class文件 144 | 145 | ## Java中基本类型有哪些? 大小? 146 | - 整数类型: byte, int, short, long 147 | - 字符类型: char 148 | - 浮点类型: double, float 149 | - 布尔类型: boolean 150 | 151 | ## Java中数组是基本类型吗? 152 | 数组不是基本类型, Java中除了上述的基本类型外都属于对象类型 153 | 154 | ## 类中方法可以与类同名吗? 155 | 可以同名 156 | 157 | ## Stream与Reader, Writer区别? 用代码实现一个txt文件的读写 158 | - Stream为字节流 159 | - Reader, Writer为字符流 160 | 见`../../java/笔记/java-深入学习/读取文件/Main.java` 161 | 162 | ## 用代码实现文件递归查询 163 | 见`../../java/笔记/java-深入学习/获取文件路径/GetFilePath.java` 164 | 165 | ## 访问修饰符作用范围? 166 | 类内部, 包, 子类, 任何地方 167 | 168 | ## Java编译过程? 169 | 1. 将代码编译成字节码 170 | 2. 将字节码载入JVM中称为可执行的代码 171 | 3. 运行时将可执行的代码编译为机器码 172 | 173 | ## Number, ClassLoader可以被继承吗? 174 | 可以被继承 175 | 176 | --- 177 | ## JDBC使用什么设计模式? 178 | 桥接模式 179 | 180 | ## 解释一下驱动在JDBC中的角色? JDBC执行大致流程? 181 | 初始化, 提供调用方法 182 | 183 | ## 类之间存在哪些关系? 184 | is-a, has-a, use-a 185 | 186 | ## 一般关系型和对象数据模型之间的对应关系? 187 | ORM(Object Relation Mapping), 表对类, 数据对对象, 字段对属性 188 | 189 | ## 一个类可以同时继承和实现其它类吗? 有没有先后顺序? 190 | 先继承后实现 191 | 192 | ## JRE判断程序是否执行结束的标准是什么? 193 | 前台线程执行完毕 194 | 195 | ## JDK, JRE, JVM的区别和联系? 196 | - JDK: java开发工具, 是java开发核心, 包括javac.exe, java.exe等工具 197 | - JRE: 包含JVM的标准实现与Java基本类 198 | - JVM: 虚拟机 199 | 200 | ## equals与hashCode联系? equals默认比较什么? 201 | 默认情况下hashCode相同, equals不一定相同; 而equals相同的hashCode都相同. 202 | equals默认比较地址, 比较形式为`==` 203 | 204 | ## 为什么实现equals必须重新hashCode? 205 | 一般在集合Set中, 若equals相同则对象相同, 而重写equals不重写hashCode后可能会导致同一个对象hashCode不相同, 违背对象唯一的规则. 206 | 207 | ## Java中Arrays.sort()如何实现排序? 208 | TIM sort, 将升序子序列找出来, 将非升序进行排序后使用归并算法 209 | 210 | ## JDK消费者生产者模型应用? 211 | 线程池 212 | 213 | ## final修饰符有什么好处? 可以修饰哪些东西? 214 | 好处: 215 | - 线程安全 216 | - 共享 217 | 218 | 修饰: 219 | - 修饰类: 表示该类不可以被继承 220 | - 修饰方法: 方法不可以被重写 221 | - 修饰变量: 基本类型的变量不可以改变值, 对象类型时不可以改变对象的引用, 但可以改变对象的状态 222 | - 修饰参数: 表示该参数只读不可以修改 223 | 224 | ## 为什么需要克隆, 直接new一个对象不行吗? 浅克隆与深克隆如何实现? 225 | - 直接new一个对象不能保持其拥有的状态. 226 | - 浅克隆拷贝不能拷贝对象类型的属性, 即若某个变量属于对象类型, 那么修改该变量其余地方引用改对象的状态也会变. 227 | - [实现方法](../../java/笔记/java-深入学习/克隆) 228 | 229 | ## Java中的char可以存汉字吗? 能存所有汉字吗? 230 | Java中能够存储汉字, 默认Unicode下中文字符2个字节. 231 | 只要字符没有超过编码范围内的字节都能存下, 而有些特殊汉字的编码超过了范围则不能存储 232 | 233 | ## RTTI? 234 | 运行时类型信息 235 | 236 | ## 注解有什么用? 如何自定义注解? 237 | 文档, 注入属性 238 | 239 | ## Java与C++比较? 240 | - Java没有指针, 自动回收垃圾; C++需要手动回收垃圾 241 | - Java是面向对象语言; C++即可以面向对象也可以面向编程 242 | - Java是解释性语言; C++是编译语言 243 | - Java是基于C++编写的 244 | - Java跨平台性比C++好 245 | 246 | ## public static void main(String[] args); 需要注意哪些? 一个类里面可以有多个main方法吗? main方法可以用final修饰吗? 可以用abstract修饰吗? 可以用synchronized修饰吗? 247 | - 一个类里面可以由多个main方法, 这属于重载. 248 | - main方法可以使用final修饰, 但作为方法入口的main方法不能使用abstract修饰. 249 | - 能使用synchronized修饰. 250 | 251 | ## 为什么Java中有些接口没有任何方法? 252 | 标识接口, 用来表明实现它的类属于一个特定的类型 253 | 254 | ## 如何实现类似于C中的函数指针功能? 255 | 通过声明接口的方法来实现该功能. 256 | 257 | ## 面向对象和面向过程的区别? 258 | 面向对象处理方式与人类思考问题方式一致, 将问题看做一个整体.而面向过程是将问题处理方法进行逻辑抽取, 使用一个个函数来解决. 259 | 260 | ## 内部类有哪些? 261 | 局部类, 匿名内部类, 静态内部类, 成员内部类 262 | 263 | ## 为什么非静态内部类不能定义静态方法, 静态成员, 静态初始化块? 264 | 因为静态方法属于类, 如果调用一个静态方法需要提前实例化一个对象, 那么久违背了该准则. 265 | 266 | ## 什么是反射, 反射优缺点? 267 | 有点: 可扩展, 类浏览器 268 | 缺点: 性能开销, 破坏面向对象的封装性 269 | 270 | ## 反射破坏了面向对象的什么? 271 | 封装性. 272 | 273 | ## 反射创建实例的三种方法? 274 | ## 反射中Class.forName()与ClassLoader()区别? 275 | 前者会初始化, 后者不会 276 | 277 | ## 动态代理的几种实现方式? 优缺点? 可以通过类实现吗? 278 | JDK: 通过接口, invocationHandler 279 | cglib: 通过继承(子类可以继承父类私有方法与属性, 只是子类无法直接访问私有方法; 不能继承final修饰的方法), 速度较快. 280 | 281 | ## 如何获取父类的类名? 282 | `this.getClass().getSuperClass().getName();` 283 | 284 | ## 什么是泛型? 限定通配符与非限定通配符? List< String > 能否传递给 List< Object >? Array可以使用泛型吗? 285 | - 泛型是类型参数化. 286 | - 指定范围与没有指定范围. 287 | - 不能, 因为点不能赋给不相同的点. 288 | - Array不能使用泛型. 289 | 290 | ## 泛型会不会导致程序执行速度下降? 291 | 不会有影响, 泛型在编译期阶段会进行泛型擦除, 不影响性能. 292 | 293 | ## 什么是泛型擦除? 294 | 编译期阶段使用指定的类进行替换 295 | 296 | ## try-catch-finally执行过程? finally是不是一定会执行? 297 | 执行过程: 先执行try,如果有异常则被catch捕获, 最后执行finally.finally一定会被执行, 即使try中有return语句, 并且如果finally中也有return语句, 则会返回finally中的return语句. 298 | 299 | ## 拆箱与装箱? 300 | - 装箱: Integer.valueOf(),Integer.parseInt() 301 | - 拆箱: Integer.intValue() 302 | 303 | ## UML有哪些表示? 304 | - 依赖: ┅┄┅┄> 305 | - 关联: ──────> 306 | - 聚合: 空心◇── 307 | - 组合: 实心◆── 308 | - 泛化-继承: ◁────; 实现◁┅┄┅┄ 309 | 310 | ## 有哪些处理错误的方式? 311 | - 全局标志 312 | - 返回类型 313 | - 抛出异常 314 | 315 | ## PHP与Java的区别? 316 | - php是脚本语言, java是解释性语言 317 | - java最小单位为类, PHP最小单位为可执行语句; 318 | - Java内存自动回收, PHP一次创建一次销毁 319 | - Java可常驻内存, 可以实现多线程, 而PHP无法常驻内存, 无法实现多线程 320 | 321 | ## Java类什么时候加载? 322 | - 实例通过使用new()关键字创建或者使用class.forName()反射, 但它有可能导致ClassNotFoundException. 323 | - 类的静态方法被调用 324 | - 类的静态域被赋值 325 | - 静态域被访问, 而且它不是常量 326 | - 在顶层类中执行assert语句 327 | 328 | ## static原理? 329 | 编译期阶段初始化一次, 共享数据 330 | 331 | ## static方法能否被覆盖? private方法能不能被覆盖? 332 | static方法属于类方法, 不能被覆盖 333 | private被隐式声明为final, 不能被覆盖 334 | 335 | ## 类方法内需要注意什么? 类方法能引用对象变量吗? 336 | 类方法内不能使用对象方法或对象成员; 类方法不能使用this(), super();类方法可以调用其他类方法 337 | 338 | 类方法不能引用对象变量 339 | 340 | ## 什么是类成员, 对象成员? 341 | 使用static修饰的成员, 能够被类直接调用的称为类成员 342 | 一般成员, 需要通过实例化对象才能调用 343 | 344 | ## 抽象类和接口区别? 如何选择? 345 | 接口: 346 | - JDK1.8之前不能有方法, 只能声明; 之后可以使用default和static修饰 347 | - 没有普通变量与方法; 变量会加public static final, 方法会加 public abstract 348 | - 可以实现多个接口 349 | - 孩子如果没有完全实现父类的方法不能实例化 350 | - 不能实例化 351 | 352 | 抽象类: 353 | - 声明的方法可以由方法体 354 | - 可以由普通变量 355 | - 只能继承一个抽象类 356 | - 孩子如果没有完全实现父类的方法不能实例化 357 | - 不能实例化 358 | 359 | 选择: 如果确认一个类是基类, 一般让它成为接口.但如果该类需要普通变量, 那么就应该令该类为抽象类 360 | 361 | ## 面向对象的特性有哪些? 362 | 封装, 继承, 多态 363 | 364 | ## 重载与重写定义? 构成重载条件? 函数返回值的不同可以作为重载吗? 构成重写条件? 365 | 重载: 在一个类中方法名相同, 形参列表不同 366 | 重写: 子类继承父类重写父类的方法 367 | 368 | 重载构成条件: 方法名相同, 形参列表不同; 不看返回值与修饰 369 | 重写条件: 两同两小一大 370 | - 两同: 方法名, 形参列表相同 371 | - 两小: 返回值类型小于等于父类方法返回值类型, 抛出异常小于等于父类抛出的异常 372 | - 一大: 访问修饰符大于等于父类访问修饰符 373 | 374 | ## 被final修饰的方法能够被重载吗? 能够被重写吗? 375 | 重载不看访问修饰符, final修饰的方法能够被重载 376 | 被final修饰的方法不能被重写 377 | 378 | ## 数组和链表数据结构描述, 各自时间复杂度? 379 | - 真数组在内存上是一段连续区域, 链表则没有这种要求 380 | - 对于删除元素, 数组O(N), 链表O(1) 381 | - 插入元素数组O(1), 链表O(1) 382 | - 搜索元素, 如果数组是排序的则O(logN), 链表为O(N) 383 | 384 | ## 异常分为哪些? 异常基类? 385 | - Error:非检查异常, 程序无法处理的错误 386 | - Exception: 387 | checked: 编译时异常属于检查异常, 如文件资源打开关闭必须捕获 388 | Runtime: 运行时异常, 不必处理, 不必要捕获 389 | 390 | ## 类加载过程, 机制? 有什么优势? 类加载器有哪些? 391 | 过程: 加载-链接-初始化 392 | 机制: 双亲委托加载 393 | 优势: 保证核心API, 避免重复加载 394 | 类加载器: BootStrap ClassLoader, Extention ClassLoader, App ClassLoader, Custom ClassLoader 395 | 396 | ## 解释一下Serialization和Deserialization? serialVersionUID有什么用? 397 | 将对象转化为字节序列 398 | serialVersionUID: 对序列化对象进行版本管理 399 | 400 | ## 被static或transient修饰的属性能被序列化吗? 401 | 这两种修饰的属性不能被序列化 402 | 403 | ## "a == b" 与 a.equals(b)的区别? 404 | 地址比较和逻辑比较 405 | 406 | ## 开发中用字节流好还是字符流好? 407 | 字符流 = 字节流 + 编码 408 | 409 | ## Comparable和Comparator的区别? 410 | comparator: 重写compare 411 | Comparable: 重写compareTo 412 | 413 | ## Java正则表达式匹配"成都市(武侯区)(高新区)"中的成都市? 414 | ```java 415 | Pattern pattern = Pattern.compile(".*?(?=\\()"); 416 | Matcher matcher = pattern.matcher(str); 417 | if (matcher.find()) { 418 | System.out.println(matcher.group(0)); 419 | } 420 | ``` 421 | ## Java中socket连接过程? 422 | 服务器: bind, listen, accept, connect, write/read, close 423 | 客户端: connect, write/read, close 424 | 425 | ## Java中的引用有哪些类型? 目的是什么? 使用软引用能够带来什么好处? 426 | - 强: 一般对象引用 427 | - 软: 只有当内存不足时才会对失去引用的对象进行回收 428 | - 弱: 一旦失去最后一个强引用, 立即回收 429 | - 虚: 用来跟踪对象被垃圾回收的活动, 虚引用必须和引用队列(ReferenceQueue)联合使用.程序可以通过判断引用队列中是 否已经加入了虚引用, 来了解被引用的对象是否将要被垃圾回收.程序如果发现某个虚引用已经被加入到引用队列, 那么就可以在所引用的对象的内存被回收之前采取必要的行动.[参考](https://www.cnblogs.com/javaee6/p/4763190.html) 430 | - 目的: 以代码的形式管理对象生命周期 431 | 432 | 软引用好处: 提升JVM内存使用性能 433 | 434 | ## throw和throws的区别? 435 | 前者抛出一个具体异常; 后者只是声明可能会抛出的异常不一定会抛出 436 | 437 | ## 处理完异常后, Exception会有什么变化? 438 | 会在下一个垃圾回收过程中被回收 439 | 440 | ## Java中用什么数据类型来代表价格? 441 | BigDecimal, 需要使用字符串初始化, 用double初始化仍然不能精确表示 442 | 443 | ## 64位JVM中int的长度是多少? 444 | 无论什么平台都是32 445 | 446 | ## final, finally, finalize的区别? 447 | - final修饰类, 类不可以被继承; 修饰方法, 方法不可以被重写; 修饰变量, 基本类型的值不可以改变, 引用类型不能改变其引用 448 | - finally:try中使用, 而且一定会执行 449 | - finalize: object方法, 重写后给变量一个自救机会, 让其与root链上的对象进行关联 450 | 451 | ## 编译器常量有什么风险? 452 | 即final static, 修改之后需要重新编译才能使用新值 453 | 454 | ## 构造方法能不能被继承? 有没有返回值? 455 | 构造方法不能被继承, 没有返回值 456 | 457 | ## this()写第一行的原因? super()写第一行的原因? 可以写在一起吗? 458 | - this()写在第一行表示使用了委托构造, 不能和super()一起使用; 459 | - 防止父类重复构造 460 | - super()写第一行是为保证父类方法的可用性 461 | 462 | ## 类初始化过程? 463 | 父类静态成员、父类静态代码块-子类静态成员、子类静态代码块-父类普通成员、父类代码块、父类构造函数-子类普通成员、子类代码块、子类构造函数 464 | 465 | ## Collection与Collections的区别? 466 | 前者属于集合接口; 后者是集合方法的集合 467 | 468 | ## '0', 'A', 'a', ' ' 的ASCII码是多少? 469 | 48,65,97,32 470 | 471 | ## 在Java中unicode占多少字节? UTF-8下中文占多少字节, 英文占多少字节? GBK呢? 472 | - 2字节 473 | - 中3字节, 英1字节 474 | - 中2字节, 英1字节 475 | 476 | ## instacneof有什么作用? 477 | 判断一个对象是否属于指定的类型 478 | 479 | ## System.arraycopy(), clone(), Arrays.copyOf(), for对数组的复制效率? 480 | 性能递减 481 | 482 | --- 483 | 484 | ## 什么是servlet? 485 | 接受用户请求, 生成动态内容 486 | 487 | ## servlet生命周期? 488 | 加载, 创建, 初始, 调用方法, 销毁 489 | 490 | ## servlet处理流程? 491 | <71> 492 | ## 服务端包含? 493 | ## 什么是servlet链? 494 | ## servlet安全性? 495 | ## Tomcat结构以及类加载流程? -------------------------------------------------------------------------------- /src/10-设计模式.md: -------------------------------------------------------------------------------- 1 | > ## 设计模式 2 | 3 | ## 设计模式分为几大类? 4 | ## 说一说有哪些设计原则? 5 | - 开闭原则 6 | - 单一替换原则 7 | - 里氏替换原则 8 | - 迪米特法则 9 | - 接口隔离原则 10 | - 依赖倒置原则 11 | 12 | --- 13 | ## 懒汉与饿汉区别? 实现单例模式的方法? 14 | ## 单例模式有什么特点? 应用场景? 15 | ## 工厂模式有哪些? 之间的区别(三种工厂模式的比较)? 16 | ## 生成器/建造者(Builder) 17 | ## 原型模式 18 | --- 19 | ## 责任链模式 20 | ## 命令模式 21 | ## 解释器 22 | ## 迭代器 23 | ## 中介者 24 | ## 备忘录 25 | ## 观察者 26 | ## 状态 27 | ## 策略 28 | ## 模板 29 | ## 访问者 30 | ## 空对象 31 | --- 32 | ## 适配器 33 | ## 桥接模式 34 | ## 装饰器 35 | ## 外观模式/门面模式(Facede) 36 | ## 享元模式(Flyweight) 37 | ## 代理模式 -------------------------------------------------------------------------------- /src/11-框架.md: -------------------------------------------------------------------------------- 1 | > ## 框架 2 | 3 | ## Maven特点? 4 | ## Solr是什么? 5 | ## Thymeleaf是什么? 6 | ## 什么是webService? + 7 | 基于网络的分布式模块组件, 将可调用的功能发布到web上以供应用程序访问. 8 | 9 | --- 10 | 11 | > ## JSP 12 | 13 | ## JSP有哪些动作? 14 | ## 会话跟踪技术? 15 | ## JSP内置九大类型? 16 | request, response, out, page, session, application, pageContext, config, exception 17 | 18 | --- 19 | > ## MyBatis 20 | 21 | ## MyBatis中#{}和${}的区别? 22 | 前者需要预编译, 能够防止SQL注入; 后者直接替换 23 | 24 | ## PreparedStatement与Statement区别? 25 | 前者预编译, 能够进行参数化查询, 防止SQL注入 26 | 27 | ## Mybatis缓存? 28 | - 一级缓存 29 | 生命周期基于sql session, 基于HashMap本地缓存; 默认打开一级缓存 30 | - 二级缓存 31 | 生命周期基于application, 按照每个namespace一个缓存来存储; 也是HashMap存储 32 | - 使用注意 33 | 只能在单表操作的表上使用; 可以保证查询远大于其它操作的表上使用; 避免二级缓存使用, 因为多表操作无论缓存放到哪个namespace中都会导致其它表不在其中, 会导致缓存查询结果出错. 34 | 35 | ## 什么是MyBatis? 36 | ORM框架, 内部封装了JDBC, 开发时只需要关注SQL本身.可以使用XML来配置映射原生信息. 37 | 38 | ## 当实体类的属性名和表中的字段名不一样, 怎么办? 39 | - 通过``来映射字段名和实体类属性名的一一对应关系 40 | - 通过定义别名, 让别名的名字与实体类属性名一致 41 | 42 | ## 通常一个Xml映射文件, 都会写一个Dao接口与之对应, 请问, 这个Dao接口的工作原理是什么? Dao接口里的方法, 参数不同时, 方法能重载吗? 43 | 通过映射对应字段, 接口全限定名+方法名拼接字符串作为key值来定位MapperStatement 44 | 45 | Mapper接口里的方法是不能重载的, 因为使用全限定名+方法名的保存和寻找策略.Mapper接口的原理是JDK动态代理, 代理对象会拦截接口方法, 转而执行sql. 46 | 47 | ## MyBatis如何实现分页? 分页插件的原理? 48 | - Mybatis使用RowBounds对象进行分页, 它是针对ResultSet结果集执行的内存分页 49 | - 原理是使用MyBatis提供的插件接口, 实现自定义插件, 在插件的拦截方法内拦截待执行的sql, 然后重新写sql 50 | 51 | ## 如何获取插入数据id? 52 | 插入成功后会返回插入成功的行数, 并将主键插入到对象中, 可以直接通过对象进行查询 53 | 54 | --- 55 | > ## spring 56 | 57 | ## Spring有哪些特点? 58 | - 容器 59 | - IOC/DI 60 | - AOP 61 | - 轻量, 非侵入式 62 | 63 | ## Spring核心? 64 | - IOC/DI 65 | - AOP 66 | 67 | ## Spring中的IOC有几种注入方式? 68 | - 构造器注入 69 | - 根据注解注入 70 | - setter 71 | 72 | ## Spring提供哪些配置方式? 73 | - 基于XML 74 | - 基于注解配置 75 | - 基于Java API中的`@Bean` 和`@Configuration` 76 | 77 | ## 什么是IOC/DI,什么是AOP? AOP的实现方式? 78 | - ICO: 将由程序对对象的控制交给容器进行管理; Spring中使工厂模式+反射机制实现 79 | - DI: 由容器向组件注入资源 80 | Spring中有两种IOC容器: 81 | - BeanFactory 82 | - ApplicationContext,上面的扩展 83 | 84 | - AOP: 面向切面编程 85 | 两种方式实现: 静态织入与动态代理 86 | 87 | ## Spring IOC 容器初始化过程? 88 | ## 为什么用Spring IOC 而不用工厂模式? 89 | 不用工厂模式而使用IOC. 其实本质上还是因为IOC是通过反射机制来实现的. 当我们的需求出现变动时, 工厂模式会需要进行相应的变化. 但是IOC的反射机制允许我们不重新编译代码, 因为它的对象都是动态生成的. 90 | 91 | ## Spring事物的传播级别? 92 | 其中事物传播级别: 93 | - PROPAGATIOH_REQUIRED 94 | - PROPAGATIOH_SUPPORTS 95 | - PROPAGATIOH_MADATORY 96 | - PROPAGATIOH_REQUIREDS_NEW 97 | - PROPAGATIOH_NEVER 98 | - PROPAGATIOH_NOT_SUPPORTED 99 | - PROPAGATIOH_NOT_SUPPORTED 100 | 101 | ## Spring中的事物隔离级别? 102 | 事物隔离级别与MySQL事物隔离级别一致 103 | 104 | ## Spring中Bean的Scope作用域? 105 | - sigleton 106 | - prototype 107 | - request 108 | - session 109 | - global session 110 | 111 | ## 什么是Spring Bean? 112 | - 由IOC容器管理 113 | - 基于用户提供给容器的配置元数据创建 114 | 115 | ## SpringMVC路由怎么写? 116 | @RequestMapping() 117 | 118 | ## SpringMVC如何接受ajax? 119 | @RequestBody(), @ResponseBody() 120 | 121 | ## SpringMVC用到了那个核心servlet? 122 | DispatchServlet 123 | 124 | ## SpringMVC核心控制器是什么? 请求流程? 125 | ## SpringBoot优点? 126 | - 快速构建项目 127 | - 对主流开发框架无配置集成 128 | - 项目可独立运行, 无需依赖外部Servlet 129 | - 可提供运行时的应用监控 130 | 131 | ## 关于加@Transactional注解的方法之间调用, 事物是否生效? 132 | - 不同类之间, 如A的方法a调用B的方法b, 只要a或b配置了事物就会生效 133 | - 相同类不同方法之间, 如a调用b, 无论b是否配置事务, 该方法在调用时都不会生效; 但若a配置了事务, 此时b的事务虽然不会生效, 但对于b中抛出的异常会回滚 134 | 135 | ## Bean的生命周期? 136 | - 通过构造器或工厂方法创建Bean实例 137 | - 为Bean的属性设置值和对其它Bean的引用 138 | - 将Bean实例传递给Bean前置处理器 139 | - 调用Bean的初始化方法 140 | - 将Bean实例传递给Bean后置处理器 141 | - 使用Bean 142 | - 当容器关闭时, 调用Bean的销毁方法 143 | 144 | ## Spring用了哪些设计模式? 145 | - 工厂模式: BeanFactory就是简单工厂模式的体现, 用来创建对象的实例; 146 | - Bean的单例模式 147 | - 享元模式 148 | - AOP代理模式 149 | 150 | ## Spring三大核心组件? 151 | bean, core, context 152 | 153 | ## Spring框架中的单例Beans是线程安全的么? 154 | Spring中没有对单例bean进行任何多线程的封装, 一般来说bean并没有可变状态如DAO, 所以说某种程度上是线程安全的.但如果bean有多种状态, 就需要自己保证线程安全, 最浅显的方式就是将多态bean的作用域有单例模式改为原型模式. 155 | 156 | ## Spring如何处理线程并发问题? 157 | 默认的Controller,DAO,Bean都是单例模式.在非线程安全状态下采用TheadLocal来解决多线程并发访问. 158 | 159 | ## SpringMVC如何区分post和get? 160 | 1. `@RequestMapping(value="page", method=RequestMethod.GET)` 161 | 2. `@RequestMapping(value="page")`即可以接收get也可以接收post 162 | 163 | ## Spring中@Autowrited与@Resource的区别? 164 | 1. @Autowrited自动加载, 按类型装配依赖对象必须存在, 如果允许null必须在required属性为false.当一个类有两个实现类@Autowrited就不知道该注入哪个类, 而@Resource有name属性可以区分 165 | 166 | 2. @Resource按名称进行装配, 通过name属性指定 167 | 168 | ## Spring中的@RestController, @RequestBody, @Controller, @ResponseBody有什么用 169 | 170 | ## 过滤器与拦截器的区别? -------------------------------------------------------------------------------- /src/12-linux.md: -------------------------------------------------------------------------------- 1 | > ## Linux 2 | 3 | ## Linux文件和目录操作 4 | ## 创建文件, 查看文件 5 | ## 创建目录 6 | ## 监测程序 7 | ## ps和top的区别 8 | ## 压缩数据 9 | ## 结束进程 10 | ## 压力测试衡量CPU的三个指标? 11 | CPU Utilization、Load Average和ContextSwitch Rate 12 | ## Linux下查看80端口是否被占用 13 | `ps -ef | grep 80` 14 | `netstat -an | grep : 80` 15 | ## 查看内存 16 | `free` 17 | ## 查看磁盘 18 | `df -h` 显示已经挂载的分区列表 19 | ## 创建一个新用户 20 | `useradd username` 21 | ## 文件权限 22 | `chmod 777 file` 对file文件的拥有者, 同组, 其他用户都有写、读和执行权 23 | r: 4 w: 2 x: 1 24 | ## 备份 25 | `dump` 26 | 27 | ## 你知道库函数和内核调用吗? 28 | 系统调用运行在内核态 29 | 库函数调用运行的用户态, 一般会通过缓冲等机制减少系统调用次数 -------------------------------------------------------------------------------- /src/13-python.md: -------------------------------------------------------------------------------- 1 | > ## Python 2 | 3 | ## Pyton垃圾回收策略? 4 | ## MVC与MVT模式? 5 | ## 什么是wsgi?uwsgi? 6 | ## Django请求生命周期? 7 | ## 什么是FBV, CBV? 8 | ## Django模板中自定义filter与simple_tag区别? 9 | ## Flask与Django区别? -------------------------------------------------------------------------------- /src/14-other.md: -------------------------------------------------------------------------------- 1 | > ## 测试 2 | 3 | ## 对软件测试的理解? 4 | ## 一个完整的测试应有哪些阶段组成? 5 | 测试计划, 测试设计, 测试开发, 测试执行, 测试评估 6 | 7 | ## 单元测试怎么实现? 8 | ## 测试用例元素 9 | 用例ID, 用例名, 测试目的, 测试级别, 测试环境, 前提条件, 测试步骤, 预期结果, 实际结果 10 | 11 | ## 好的测试用例应该从哪些方面考虑 12 | 准确性, 易用性, 可维护, 可追溯 13 | 14 | ## 软件测试有什么策略和阶段 15 | 动态测试和静态测试(白盒测试), 白盒测试和黑盒测试(功能测试) 16 | 17 | ## 回归测试和冒烟测试 18 | ## 软件测试类型 19 | 功能测试, 性能测试, 兼容测试, 安全测试, 可靠测试, 压力测试, 负载测试 20 | 21 | ## 用例策略 22 | 1. 场景图 23 | 基本流+备选流 24 | 2. 等价类 25 | 3. 边界值 26 | 4. 因果图 27 | 5. 错误推测法 28 | 29 | ## 测试用例是什么? 有什么作用? 30 | ## 软件缺陷定义 31 | 未完成需求; 出错; 未明确提出但应该实现的功能; 易用, 性能, 操作性 32 | 33 | ## 缺陷中应该包含什么? 严重等级一般有哪些? 34 | 用例ID, 用例名称, BUG ID, 测试环境, 测试方法, 测试条件, 预期结果, 实际结果, 截图, 日志 35 | 36 | ## 给你一个杯子你会怎样测试? 37 | 界面测试:查看外观是否美观 38 | 功能度: 查看水瓶漏不漏; 瓶中水能不能被喝到 39 | 安全性: 瓶子的材质有没有毒或细菌 40 | 可靠性: 从不同高度落下的损坏程度 41 | 可移植性: 再不同的地方、温度等环境下是否都可以正常使用 42 | 兼容性: 是否能够容纳果汁、白水、酒精、汽油等 43 | 易用性: 是否烫手、是否有防滑措施、是否方便饮用 44 | 用户文档: 使用手册是否对的用法、限制、使用条件等有详细描述 45 | 疲劳测试: 将盛上水(案例一)放24小时检查泄漏时间和情况; 盛上汽油(案例二)放24小时检查泄漏时间和情况等 46 | 压力测试: 用根针并在针上面不断加重量, 看压强多大时会穿透 47 | 跌落测试:测试在何种高度跌落会破坏水瓶 48 | 49 | ## 测试报告应该包含哪些? 50 | ## 测试中出现BUG开发不承认, 你会怎么办? 51 | ## 模拟铁路局卖火车, 假设有一条高铁线路, 途径多个城市, 火车上共5000个座位. 请设计一个数据结构, 以检查在某乘车区间内购票是否有座位的方法 52 | ## "3-5-8" 原则 53 | 54 | > ## 其他 55 | 56 | ## 虚拟化技术? 57 | ## 赛马, 有25匹马, 每次只能5匹马比赛, 比赛只能得到5匹马之间的快慢, 而不是速度.请问, 最少比赛多少次, 才能获得最快的前3匹马? 58 | ## SSH协议? 什么是跳板机? 59 | ## thinkPHP处理流程? 60 | ## 敏捷开发与瀑布开发的区别? -------------------------------------------------------------------------------- /src/15-last.md: -------------------------------------------------------------------------------- 1 | > ## 项目 2 | 3 | ## 项目需求 4 | ## 项目实现 5 | ## 项目问题, 项目如何解决 6 | ## 项目中的优化 7 | 前端使用模板, 资源使用CDN加速, css放上面js放下面, 多个资源合并减少请求次数, 开启压缩模式 8 | 9 | 后端数据库索引优化, 外键也添加索引这样多表join查询时速度更快, 查询过程中查询自己感兴趣的地方. 如果涉及多表大数据会考虑使用多线程, 对于数据特别大的表我会考虑分表, 如分库分表根据主键id切分 10 | 公共部分抽离, 比如获取session、cookie、当前用户信息等 11 | 重复使用的资源及工具共享, 微服务中entity重复使用 12 | 首页等经常访问的页面对其需要加载的资源进行缓存, 存入Redis中 13 | 单点登录的使用 14 | 15 | > ## 综合面 16 | 17 | ## 为我介绍? 18 | ## 优缺点? 19 | 乐于接受新的知识, 原意尝试新的方法.举例自己做的项目关联度不大, 都是新的知识, 而且项目跨度也较大. 20 | 21 | ## 投简历的时候选择什么样的公司? 22 | 23 | 24 | ## 薪资 25 | 如果求职者很希望进入面试公司工作, 可以说我注重的是找对工作机会, 所以只要条件公平, 我则不会计较太多, 相信贵公司在处理我的问题上会友善合理. 26 | 27 | ## 工作地点 28 | 主要是看中平台与自身发展 29 | 30 | ## 对加班看法 31 | 加班一般是项目比较赶, 在这种情况下即使早早的下班回家, 只要自己对项目有个负责任的心理, 自己也会挂念着项目, 想着业务逻辑还需要哪些处理, 今天做的事情是否有不足.自己举个栗子. 32 | 那些对于公司没有责任感对于项目没有责任心, 那么即使6点钟下班拖到6点十分也会大发牢骚. 33 | 34 | ## 职业规划? 35 | 打算继续做技术, 不断地学习新的知识, 成为技术大牛. 不确定将来有没有管理能力, 但现在能确定的是有一技之长总能够走的更远, 为公司做出更大的贡献. 36 | 37 | ## 你的人生规划怎样的? 38 | 如果有幸能进入你们部门, 短期内我会把工作做好, 与同事多交流学习, 用心对待工作, 精进业务.经过三五年后, 通过不断地学习, 希望能达到可以独立负责相关项目或业务的这样一个水平.我相信在你们这个平台上, 只要够努力, 就一定能够得到自己想的. 39 | 40 | 41 | ## 平时如何学习, 如何做项目? 42 | 举例子: 第一个项目 43 | 准备阶段: 收集资料(博客, stack overflow, GitHub), 看完成项目需要涉及哪些知识与工具 44 | 学习阶段: 逐个攻破然后做项目 45 | 46 | ## 遇到什么困难? 困难如何解决? 47 | 微服务例子: 48 | 刚开始想用微服务做项目的时候无从下手, 不知道微服务是怎样运行, 自己慢慢查询资料搞清微服务是做什么的, 怎么样实现.看别人实际项目的源码看别人如何进行架构, 然后考虑如何拆分业务, 服务拆分粒度, 各服务之间的耦合度到底多大. 49 | 50 | ## 你觉得你做项目时最大的收获是什么? 51 | 做了好多个不同语言做的项目, 越到后面面对新的语言或技术熟悉的也越快.在网站开发方面分布式项目对我的影响是最大的, 这不是说我学了springcloud, 而是我再学习过程中逐渐了解到现在的大型项目到底是怎样架构的, 现在网站开发的方向, 为什么那么多用户取访问一个应用还不卡, 感觉就像开启了一项新的大门.除此之外我认为图像处理机器学习相关的项目对我的影响也十分大, 之前做网站的项目都是自己站在用户的角度去思考用户需要什么功能, 而图像处理的项目全部是用户需要完成什么功能然后我再去思考如何做好哪些功能如何做的更完善, 这是两种不同的思维模式, 而且会更多地去考虑代码后期的维护和扩展, 比如说在计算准确率时因为后面可能还会有多种不同的准确率判定方法, 所以我采用了策略模式去实现准确率的计算, 这样后面就不需要重构代码, 也遵守了开闭原则. 52 | 53 | ## 如何评价公司的? 54 | 面试前了解清楚公司的主营业务, 面试岗位的技术需求, 发展情况, 回答时可以说说公司的情况, 根据公司的需求谈行业趋势及技术发展, 不能无边际的泛泛而谈 55 | 56 | > ## 提问 57 | 58 | ## 公司的研发团队目前是什么规模? 开发、测试分别有多少人? 59 | ## 现在部门业务方向? 60 | ## 如果我有幸能够进入你们部门, 请问到时候是先进行培训还是直接上手项目呢? 61 | ## 进入部门之后做的项目是针对某一方向还是看实际接手的项目不固定的那种? 62 | ## 晋升制度 -------------------------------------------------------------------------------- /src/2-集合.md: -------------------------------------------------------------------------------- 1 | > ## 集合问题 2 | 3 | ## 线程同步的集合有哪些? 4 | Vector, Stack, HashTable, Enumeration 5 | 6 | ## 哪些类实现了Collection接口? 7 | List, Stack, Queue,Set 8 | 9 | ## 为什么集合没有实现Cloneable和Serializable? 10 | 集合类存储的数据有些空间利用率不高, 需要自己实现自己的克隆或序列化 11 | 12 | ## Iterator和ListIterator区别? 13 | 前者可以遍历Set和List, 后者只能遍历List; 14 | 后者功能比前者功能多, 后者提供pre节点访问 15 | 16 | ## Enumeration接口和Iterator接口的区别? 17 | 前者速度快, 但功能较少; 后者虽然速度慢, 但提供功能较多如删除节点功能 18 | 19 | ## 快速失败(fail-fast)和安全失败(fail-safe)区别? 20 | 快速失败: 21 | 指`java.util.*`下面的集合.对于这类集合, 在多线程访问下遍历下一个节点时会查看modCount会否等于exceptionmodCount, 如果不等于则抛出异常 22 | 23 | 安全失败: 24 | 指`java.util.concurrent`下的集合.对于这类集合, 在多线程下访问时会先拷贝副本在拷贝集合上进行遍历, 不会报错.适用于多线程. 25 | 26 | ## 数组和列表有什么区别? 如何选择 27 | 数组: 28 | - 可以存储基本类型与对象类型 29 | - 不可扩展 30 | - 提供的方法较少 31 | 32 | 列表: 33 | - 不能存储基本类型, 只能存储对象类型 34 | - 可以扩展 35 | - 提供方法较多 36 | 37 | 选择: 看具体情况, 追求性能的话选用数组, 追求可扩展性的话选择列表 38 | 39 | ## ArrayList与LinkedList区别? 底层原理? ArrayList扩容、删除如何实现? 40 | 前者底层数组, 后者底层使用链表 41 | 42 | ArrayList初始大小默认为10(可以指定), 之后每次扩展1.5倍, 扩容使用Arrays.copyOf()进行迁移 43 | 44 | 删除之后使用System.arraycopy()将之后的数据往前移动 45 | 46 | ## LinkedList适合什么排序? 47 | 适合于归并排序 48 | 49 | ## 用过哪些Map类, 都有神马区别? HashMap实现过程(JDK1.8)? put、扩充等实现过程? 50 | HashMap(允许null键), TreeMap(不允许null键), HashTable(线程安全), LinkedHashMap(记录插入顺序), IdentityMap(使用==来判断对象是否相同), WeakMap, EnumeMap 51 | 52 | HashMap底层(JDK1.8): 53 | - 数据结构: 数组+链表+红黑树 54 | put操作过程: 55 | 1. 判断数组是否为空或长度为0, 若是的话则进行数组初始化 56 | 2. 判断key, 若为null则调用方法将其插入数组0索引位置 57 | 3. 获得key的哈希值, 计算桶位置 58 | 4. 若桶位置没有数据, 则将值插入到该位置, 若有数据 59 | 5. 如果为链表, 判断链表长度是否大于8, 若是则将链表转化为红黑树在进行插入; 否则将数据插如到链表中; 60 | 6. 若为红黑树则将数据插如到红黑树中 61 | 7. 插入成功后判断数组是否需要扩容 62 | 63 | 扩容操作: 64 | - 分配新的数组 65 | - 数据迁移: 计算数据新的桶位置, 采用尾插入方法进行插入数据(JDK1.7采用头插入, 但会造成环; JDK1.8在数据尾部添加了一个tail指针方便尾插入) 66 | 67 | 68 | ## 为什么HashMap里数组使用transient修饰? 69 | 不使用默认序列化方法, 自己有一个序列化方法 70 | 原因: 71 | - 数组中存储的数据量是小于数组长度的, 使用默认序列化会造成空间浪费 72 | - 不同JVM对hashcode产生的值可能不一样, 如果使用默认序列化, 可能会造成反序列化之后数据的位置还是原来的位置但hashcode值会导致不能定位到数据 73 | 74 | ## HashMap的长度为什么是2的幂次方? 75 | 寻找桶位置时通过`hash & (length - 1)`来实现, 这样更加有效地利用每个位 76 | 77 | ## HashMap链表插入是头插入还是尾插入? 头插入会造成什么问题? 78 | JDK1.7是使用头插入; JDK1.8开始使用尾插入, 在尾部添加一个tail指针. 79 | 头插入在进行扩展时可能会形成闭环. 80 | 81 | ## HashMap为什么用红黑树而不用AVL树? 82 | 红黑树更适合插入修改密集型操作; AVL树因为是更加严格的平衡, 适用于查找型操作; 通常AVL旋转比红黑树更难以平衡和调试 83 | 84 | ## concurrentHashMap实现原理? JDK1.7与JDK1.8区别? 85 | - JDK1.7: 使用Segment, HashEntry, ReentranLock 86 | - JDK1.8: 使用Node, CAS, Synchronized 87 | put()操作步骤: 88 | 1. 先判断键值是否为空, 若为空则返回 89 | 2. 获得键的哈希值, 然后进入一个无限循环 90 | 3. 循环中第一步先判断数组是否为空, 若为空初始化数组, 进入下一个循环 91 | 4. 判断是否需要扩充 92 | 5. 判断桶所在位置是否为空, 若为空则使用CAS操作将数据插入 93 | 6. 若有数据, 则用syncronized锁住该桶的第一个数据 94 | 7. 若为链表, 若重复则更新值, 否则添加到链表末尾 95 | 8. 若为树, 按照树的插入操作进行插入 96 | 9. 插入数据后判断链表长度是否大于转换阈值8, 若大于8则需要将链表转换为红黑树 97 | 10. 更新数据记录, 返回 98 | 99 | ## HashTable和HashMap的区别? 100 | 前者线程安全锁住整个结构, 速度慢, 推荐使用concurrentHashMap, 后者线程不安全 101 | 102 | ## HashTable和concurrentHashMap的区别? 103 | 前者锁住整个结构, 后者锁住范围小 104 | 105 | ## HashSet, TreeSet, LinkedHashSet之间的区别? HashSet内部原理? 106 | - HashSet基于HashMap 107 | - TreeSet自动排序但需要定义对象的大小比较 108 | - LinkedHashSet继承HashSet, 但保持了元素插入顺序 109 | 110 | ## 阻塞队列, ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue, DelayQueue, SynchronousQueue各自特点? 非阻塞队列? 111 | 阻塞队列BlockingQueue为接口, 可选有界不接受null值 112 | - ArrayBlockingQueue: 数组支持的有界队列, 构造时需要指定容量, 并且可以选择公平还是非公平.此队列按照FIFO原则对元素进行排序 113 | - LinkedBlockingQueue: 链表支持的可选有界队列, 不允许有null值.没有容量上限, 按FIFO排序元素 114 | - PriorityBlockingQueue: 堆支持的有界队列, 带优先级, 不允许null值, 出队和入队的时间复杂度为O(logN) 115 | - DelayQueue: 优先堆支持的基于时间调度队列, 只有在延迟期满时才能从中取出元素 116 | 117 | ## 阻塞队列的插入、移除方法? 118 | 阻塞方法: put(), take() 119 | 120 | ## Set了解过吗? 知道add()会出现什么问题吗? -------------------------------------------------------------------------------- /src/3-线程.md: -------------------------------------------------------------------------------- 1 | > ## 线程 2 | 3 | ## 如果一个线程构造了一个不可变对象, 就可以保证这个对象被其它程序正确查看吗? 4 | 不能, 这个不可变对象需要正确地初始化完成后才能保证其余线程对其正常查看. 5 | 6 | 原因: this逃逸现象 7 | this逃逸是对象在实例化过程中自身成员变量没有全部初始化就通过this将自身引用出入使得其他线程查看到的成员变量与完全初始化成功的成员变量的值不同. 8 | 9 | ## 线程调用过程? 10 | 线程调用start()之后使得线程进入资源竞争状态, 当线程获取时间片后调用线程的run()方法 11 | 12 | ## 守护线程和用户线程区别? 13 | 守护线程也就是后台线程, 不会阻止用户线程的结束.用户线程结束, 守护线程也跟着结束. 14 | 15 | ## 你对线程优先级的理解? 16 | 线程优先级也就是公平锁和非公平锁的实现, 线程优先级高的线程不一定能够比优先级低的线程先抢夺到资源. 17 | 18 | ## 同步方法和同步块哪种方式好? 19 | 同步块更好, 粒度更小 20 | 21 | ## 线程有哪些状态? 画一下线程状态转移图 22 | 线程状态: 创建, 可运行, 运行, 阻塞(等待阻塞(wait)与一般阻塞(sleep, System.in)), 结束 23 | 24 | ## 数据库连接池与线程池? 25 | 数据库连接池: 在系统启动时创建一组线程组成线程池, 在有请求时, 从线程池中获得线程去处理, 处理完之后放回线程池中.如果请求过多, 线程池中没有线程, 则会阻塞线程. 26 | 27 | ## 为什么使用线程池, 为什么使用数据库连接池? 28 | 优点: 29 | - 方便线程管理 30 | - 降低并发 31 | - 降低线程和对象频繁创建和销毁的性能开销 32 | 33 | ## 线程池ThreadPoolExecutor有哪些参数? 34 | int corePoolSize; // 线程池大小 35 | int maximumPoolSize; // 线程池中允许的最大线程数 36 | long keepAliveTime; // 当线程数大于核心线程数, 终于多余空闲的线程等待新任务的最长时间 37 | TimeUnit unit; // keepAliveTime的单位 38 | BlockingQueue workQueue; // 储存还没有来得及执行的任务的队列 39 | ThreadFactory threadFactory; 40 | RejectedExecutionHandler handler; // 线程超过容量时的处理方法, 四种拒绝策略 41 | 42 | ## 线程池中线程任务数超过核心数会发生什么? 阻塞队列大小? 43 | 线程中任务数超过核心数后会被阻塞放到阻塞队列中. 44 | 45 | 阻塞队列大小受阻塞队列本身影响. 46 | 47 | ## 线程池的组成? 48 | 1. 线程池管理 49 | 2. 工作线程 50 | 3. 任务接口 51 | 4. 阻塞队列 52 | 53 | ## Java线程池工作原理(过程)? 54 | 1. 创建线程池 55 | 2. 调用执行往里面添加任务时会进行如下判断: 56 | - 如果正在运行的线程数小于corePoolSize, 则马上创建线程运行该任务 57 | - 如果正在运行的线程数大于corePoolSize, 则将该线程放入任务队列中 58 | - 如果任务队列满了且正在运行的线程数小于maximumPoolSize, 创建非核心线程来运行该任务 59 | - 如果任务队列满了且正在运行的线程数大于maximumPoolSize, 则线程池会抛出RejectExcutionException 60 | 3. 当一个线程完成任务时, 它会从中取出下一个任务来执行 61 | 4. 当一个线程无事可做超过一定时间, 并且当前运行的线程数大于corePoolSize, 那么该线程会被停掉.所有线程的任务完成后, 最终会缩到corePoolSize大小 62 | 63 | ## newSingleThreadExcutor, newFixedThreadPool, newCachedThreadPool, newScheduledThreadPool, newSingleThreadScheduledExcutor区别? 64 | - SingleThreadExcutor: 按顺序 65 | - FixedThreadPool: 指定线程数 66 | - CachedThreadPool: 由JVM决定线程数 67 | - ScheduledThreadPool: 定时以及周期任务 68 | 69 | ## 线程池的关闭有几种方式? 有哪些状态? 状态转移? 70 | 关闭线程池的方式: 71 | - shutDown: 不接受新的线程, 将任务队列中的线程处理完 72 | - shutDownNow: 将当前线程运行完, 不处理队列中的线程 73 | - tryTerminate: 终止任务 74 | 75 | shoutDwon, Stop, Running, Tiding, Terminated 76 | 77 | ## 说一说ThreadLocal使用, 原理? 78 | `ThreadLocal obj = new ThreadLocal(() -> new Object());` 79 | 底层是通过ThreadLocalMap来实现, 每个线程对应一个资源. 80 | 81 | ## ThreadLocal内存泄露? 如何解决? 82 | 内存泄露主要是因为ThreadLocalMap中主键使用的是弱引用, 一旦失去最后一个强引用就会被回收, 从而导致主键对应的值无法被获取从而导致内存泄露. 83 | 解决办法为: 一旦决定某个资源不使用就调用remove()进行回收. 84 | 85 | ## 为什么ThreadLocal要使用弱引用? 86 | 实例对象被置为null之后, 实例可以被gc顺利回收 87 | 88 | ## synchronized锁的范围? 89 | - 对象方法 90 | - 类方法 91 | - 代码块: 类.class, obj, this 92 | 93 | ## synchronized与Lock比较(锁与同步锁的比较)? 94 | 1. 底层实现 95 | synchronized由JVM实现, Lock由JDK实现 96 | 2. 性能 97 | JDK1.6开始对synchronized进行优化后性能提升, 如果不需要使用Lock的高级功能, 一般使用synchronized 98 | 3. 功能 99 | Lock功能比synchronized多, 可以绑定多个条件 100 | 4. 显示与隐式 101 | synchronized不需要手动释放锁, Lock需要手动释放锁 102 | 5. 中断其它阻塞线程 103 | synchronized不能中断其他正在等待的阻塞线程, 而Lock可以 104 | 105 | <21><129> 106 | `t1.interrupt()`会中断其他阻塞线程中使用了 `lock.lockInterruptibly()` 指令的线程, 并使其抛出异常(InterruptedException) 107 | 108 | ## synchronized与cas比较? 109 | - 同步阻塞与非阻塞同步 110 | - CAS针对单个变量进行修改, 在循环等待时间可能较长 111 | 112 | ## 说说 synchronized 关键字和 volatile 关键字的区别 113 | <146> 114 | 1. s修饰方法和代码块, v修饰变量; s性能略差与v 115 | 2. s实现原子性和可见性, v实现可见性 116 | 3. v不发生阻塞, s发生阻塞 117 | 4. s解决多线程资源同步问题, v解决多线程下可见性 118 | 119 | ## 介绍一下AQS? 120 | Abstract Queue Synchronizer, 维护一个同步状态和一个FIFO线程等待队列 121 | 定义了两种资源共享方式: 122 | - 独占锁 123 | - 共享锁 124 | 125 | ## ReentrantLock如何实现可重入? 如何实现公平锁与非公平锁? 126 | 若上一次获得锁的线程是当前线程, 则该线程获得锁.若没有获得锁, 则将当前线程包装成一个Node节点放在队列末尾, 进入自旋状态(挂起)等待前驱节点释放头结点.当前节点尝试去获取锁有两种方式: 127 | - 公平锁: 竞争资源的线程严格按照先入先出的顺序 128 | - 非公平锁: 竞争资源的线程不严格按照FIFO顺序 129 | 130 | ## 在监视器内部如何做到线程同步? 程序应该用哪种级别的同步? synchronized如何实现可重入(底层)? 131 | 通过监视器监视一个代码块, 使一次只能有一个线程运行该代码块. 132 | 原理: 在线程获得执行权之前会有一个moniter enter指令, 使得锁计数器加1; 运行完之后会有一个moniter exit指令, 使锁计数器减1. 133 | 134 | ## 说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化, 可以详细介绍一下这些优化吗 135 | 主要的是偏向锁和轻量锁 136 | 偏向锁: 优先第一个获得锁的线程, 消除资源在无竞争下的同步原句 137 | 轻量锁: 当偏向锁的线程有线程去竞争后, 系统将获得偏向锁的线程挂起, 然后改用轻量锁 138 | 139 | 140 | ## 什么是自旋锁, 阻塞锁, 可重入锁, 乐观锁和悲观锁(使用场景, 各自实例), 轮询锁, 显示锁和内置锁, 读写锁, 对象锁和类锁, 锁粗化, 互斥锁, 消除锁, 轻量锁和偏向锁(这两个属于什么类型的锁)? 有几种锁状态? 141 | 142 | 143 | ## volatile实现原理? 保证了什么? 能否保证原子性? 144 | volatile实现两种功能: 145 | 1. 将当前缓存行数据刷回系统内存 146 | 2. 写回内存的操作会让其它CPU缓存无效 147 | 148 | 对使用volatile修饰变量进行读写操作, JVM会向处理器发送一条Lock前缀指令, 这个前缀指令会将数据写回内存.而读取一个变量时不会从栈私有数据栈中获取变量值而是强制从公共堆中取得变量的值. 149 | 150 | 保证了可见性以及顺序性.不能保证原子性 151 | 152 | ## CAS机制? 包含哪些操作? 会产生哪些问题? 如何避免ABA问题? 153 | 机制: V(内存位置)A(预期值)B(新值), 仅当V符合预期值A时, 处理器才会用B更新V的值, 否则不会执行更新操作. 154 | 缺点: 155 | - 只能对单个变量进行操作 156 | - 循环等待时间长 157 | - ABA问题.解决办法: 时间戳 158 | 159 | ## 有哪些原子类? 160 | - 基本类型 161 | - 数组类型 162 | - 对象引用类型 163 | 164 | ## 什么是原子操作? 什么是内存屏障? 165 | 原子操作: 一系列不间断的操作 166 | 内存屏障: 主内存与工作内存的操作 167 | 168 | ## 线程池设置大小与CPU的关系? 169 | 最佳线程数目=(线程等待时间/线程CPU时间 + 1)* CPU数 170 | 171 | ## Thread中join()方法的原理? 172 | 阻塞主线程, 等待子线程结束后调用notify方法唤醒主线程 173 | 174 | ## Thread.wait()可以设置超时吗? 175 | 可以 176 | 177 | ## Java主线程如何捕获子线程抛出的异常? 178 | 一般来说, 在多线程中, 线程中的异常需要自己处理. 179 | 实现办法: 通过重新定义`Thread.UncaughtExceptionHandler`,并且使用线程池来实现捕获. 180 | 详细代码见[这里](../../java/笔记/多线程/CaughtExceptionFromChildThread.java) 181 | 182 | ## 线程安全的实现方法? 183 | <47> 184 | - 互斥同步: synchornized 185 | - 非阻塞同步: cas 186 | - 无同步方案: 可重复代码, ThreadLocal 187 | - 不可变对象: final, string(尽量少用, 因为字符串类型会共享资源, 会导致锁住其它线程) 188 | 189 | ## 如何判断线程是否终止? 如何正确终止处于运行状态的线程? 190 | 191 | 1. 退出标志, 线程正常退出 192 | 2. 使用stop(直接释放资源, 导致不确定性), suspend(挂起资源不释放), resume 193 | 3. 使用interrupt方法 194 | 195 | ## isInterrupted和interrupted的区别? 196 | interrupted清除状态, 第一次True, 第二次False 197 | isInterrupted不清除状态 198 | 199 | ## 并行和并发的区别? 200 | - 并行: 需要硬件支持, 同一时刻执行多个任务 201 | - 并发: 在一段时间内需要执行多个任务 202 | 203 | ## 什么是协程? 204 | 205 | - 优点: 无需内核上下文切换, 减小开销; 无需原子锁以及同步开销; 单线程可以实现高并发 206 | - 缺点: 协程无法利用多核, 处处都要使用非阻塞代码 207 | 208 | ## 一个类可以同时继承Thread和实现Runnable接口吗? 209 | 可以 210 | 211 | ## 如何让正在运行的线程暂停一段时间? 212 | 使用sleep或yield 213 | 214 | ## sleep和yield的区别? 215 | - sleep在指定时间内不唤醒; yield则是将运行控制权让出来然后与其它线程进行竞争,不能预计停顿时间 216 | - sleep和yield都不释放资源 217 | - sleep并不一定能够在指定时间之后马上运行 218 | 219 | ## sleep和wait的区别? 220 | - sleep不释放资源, wait会释放资源 221 | - sleep在指定时间之后会参与资源竞争; wait需要notify之后才能去竞争 222 | 223 | 224 | ## 线程挂起怎么办? 225 | 使用notify, 或者notifyAll唤起 226 | 227 | ## 导致死锁的原因? 怎么解除死锁? 228 | 死锁四个条件: 229 | - 资源互斥: 一个资源每次只能被一个线程使用 230 | - 请求与保持: 一个进程因请求而阻塞时, 对已获得的资源保持不放 231 | - 不剥夺条件: 进程已获取的资源, 在未使用完之前不剥夺 232 | - 循环等待(闭环), 若干个进程之间形成一种头尾相接的循环等待资源关系 233 | 234 | 解决: 235 | - 撤销进程 236 | - 回退 237 | - 系统重启 238 | - 加锁顺序 239 | - 加锁时限 240 | - 死锁检测 241 | 242 | ## 死锁, 饥饿, 活锁之间的定义区别? 243 | - 死锁: 两个或两个以上的线程, 因为资源而造成一种相互等待的现象. 244 | - 饥饿: 一个线程一直让出资源给其它线程使用而导致不执行 245 | - 活锁: 线程1让出资源给其它线程用, 线程2让出资源给其它线程用, 使得两个线程都无法使用资源 246 | 247 | ## 当一个线程进入一个对象的一个synchronized方法后, 其他线程是否可以进入该对象的其他方法? 248 | 【极米面试栽在这个问了】 249 | 250 | 看访问的方法是否被修饰为synchronized, 如果不是synchornized的话可以访问, 因为不需要获得锁就可以调用; 如果该对象的其他方法是synchornized的话答案是不可以, synchronized有两种情况锁住类(类方法), 锁住对象(对象方法, 代码块), 要想调用synchornized方法的话需要提前获取对象锁, 所以synchronized可以保证原子性. 251 | 252 | ## 线程实现接口 VS 继承Thread 253 | 实现接口开销比继承开销小, 而且实现接口后还可以继承其它方法 254 | 255 | ## FutureTask是什么? 256 | - 线程执行任务 257 | - 异步获取执行结果 258 | 259 | ## 说一下CylicBarrier与CountDownLatch的区别? 260 | - CylicBarrier阻塞一组线程直到达到一种状态 261 | - CountDownLatch阻塞主线程, 等待子线程完成 262 | 263 | ## CylicBarrier与CountDownLatch内部实现原理? 264 | CylicBarrier实现原理是基于ReentrantLock实现的, 线程访问CylicBarrier的await()需要获取锁, 当最后一个线程访问CylicBarrier的await()前其余线程会调用Condition的await()方法进行阻塞等待, 直到最后一个线程调用CyclicBarrier的await()方法后, 该线程会调用Condition的notifyAll()唤起其它被阻塞的线程, 最后一个进入CylicBarrierawait()的线程可以重置CylicBarrier状态 265 | 266 | CountDownLatch是基于AQS实现的, 维护一个同步状态, 每调用countDown()方法后同步状态减1, 当线程访问await()方法时若同步状态不为0则阻塞线程, 并放入AQS维护的同步队列中进行等待. 267 | 268 | ## Random与ThreadLocalRandom? 269 | - Random基于CAS进行更新种子, 操作费时, 因为同时只有一个线程会成功, 会造成大量线程自旋等待 270 | - ThreadLocalRandom是拷贝副本进行随机数生成 271 | 272 | ## ReentrantReadWriteLock原理 273 | 维护一个同步状态来实现写锁与读锁, 同步状态为一个32位整数, 高16为记录读状态, 低16位记录写状态.若当前状态不为0, 且低位16为0, 那么读状态大于0, 即读锁已被获取. 274 | 275 | 特性: 276 | - 支持公平锁与非公平锁 277 | - 锁支持重入 278 | - 锁降级: 写锁可以降级为读锁 279 | 280 | ## 什么是Semaphore? Exchanger? 281 | - Semaphore: 控制线程数, 控制对同一资源访问的线程数量 282 | - Exchanger: 线程间相互交换对方资源 283 | 284 | ## NIO, BIO, AIO区别? 谈谈Reactor模型 285 | - NIO: 非阻塞, 若缓存中没有数据不会阻塞 286 | - BIO: 阻塞, 若缓存中没有数据则会阻塞, 直到缓存中有数据 287 | - AIO: 不仅读是非阻塞, 写也是非阻塞 288 | 289 | Reactor模型: 实现多路复用, 是一个事件分发器. 290 | - 大致流程: 事件注册, 轮询等待事件到来, 事件到来之后调用相应的事件处理器, 处理器执行完之后返回控制权继续轮询. 291 | 292 | ## 阻塞与非阻塞, 异步与同步区别? 293 | - 阻塞与非阻塞: 没有数据时等待数据到来和不等待数据到来的区别 294 | - 异步同步: 读数据与写数据是否同步 295 | 296 | ## 加入有一个第三方接口, 有很多线程去调用获取数据, 现在规定每秒钟最多有10个线程同时调用它, 如何做到? 297 | 使用ScheduledThreadPool, 执行定时周期性任务 298 | 299 | ## 线程之间相互协调完成某个工作, 如何设计? 300 | 相互协调即按顺序执行, 使用singleThreadExcutor 301 | 302 | ## 如何实现一个并发安全的链表? 303 | - concurrentLinkedList 304 | - LinkedBlockingQueue 305 | 306 | ## 如何保证N个线程可以访问N个资源, 同时又不会导致死锁? 307 | 上锁按顺序, 解锁也按顺序 308 | 309 | ## 高并发下如何做到安全地修改一行数据? 310 | 上锁, 分布式锁, 数据库锁id 311 | 312 | ## 多个线程达到同一个状态再执行, 如何实现? 313 | 使用CylicBarrier 314 | 315 | ## 如何指定多个线程顺序? 316 | singleThreadExcutor 317 | 318 | ## 如何控制线程在某个时间内完成, 不完成就撤销? 319 | FutureTask.get(), FutureTask.cancel() 320 | 321 | ## 为什么使用读写锁而不使用synchronized这类锁? 322 | 大多数情况对于读来说是共享的, 若读方法也加锁那么会影响读性能 323 | 324 | ## 实现多线程的方法? 325 | 1. 继承Thread, 重写run方法 326 | 2. 实现Runnable接口, 重写run方法 327 | 3. FutureTask, 继承Callable接口重写call方法 328 | 4. Excutors线程池 329 | 330 | ## 实现Runnable接口和Callable接口的区别? 331 | 都能执行线程, 前者咩有返回值, 后者有返回值 332 | 333 | ## 执行execute()方法和submit()方法的区别是什么呢? 334 | 前者不知道线程运行状态, 没有返回值; 后者可以知道线程运行状态有返回值 335 | 336 | ## 如何创建线程池? 337 | ThreadPoolExcutor 构造和 Excutors 工具实现 -------------------------------------------------------------------------------- /src/4-JVM-JMM.md: -------------------------------------------------------------------------------- 1 | > ## JVM虚拟机与JMM内存模型 2 | 3 | ## JVM, JMM 4 | - JVM: 虚拟机内存模型 5 | - JMM: Java内存模型 6 | 7 | ## JVM内存模型(介绍下 Java 内存区域/运行时数据区)? 程序计数器, 栈, 堆, 方法区? 8 | - 程序计数器: 记录指令执行位置 9 | - 栈: 存放已知基本类型数据以及对象指针 10 | - 堆: 数组与对象, 垃圾回收主要区域 11 | - 方法区: 类的信息, 常量, 静态变量 12 | 13 | ## JDK1.7之前常量池在哪里? 之后在哪里? 14 | 之前字符串常量池在方法区, 之后在堆中 15 | 16 | ## JDK1.8永久代变为了什么? 17 | 变为了元空间, 不属于JVM内存, 防止内存溢出 18 | 19 | ## Java内存模式对final的实现? 什么是引用逃逸? 20 | 对final修饰的变量使用内存屏障. 21 | this逃逸指初始化对象过程中有一部分成员没有初始化就将这个对象通过this引用出去, 导致其它线程得到的对象不完整 22 | 23 | ## 什么是元空间? 24 | JDK1.8开始HotSpot的实现中永久区改为元空间, 不属于JVM内存了, 而使用本地内存, 解决内存溢出问题 25 | 26 | ## Java基本类型、引用类型在内存中的存储原理? 27 | 基本类型存储在栈中, 引用类型的引用存储在栈中, 实例对象在堆中 28 | 29 | ## JVM如何判断两个类是否相同? 30 | 类全限定名和类加载器 31 | 32 | ## 分析 `Object obj = new Object();` 对象创建过程? 33 | 通过new创建一个对象, 对象存放在堆中, obj变量放在栈中指向堆中的对象. 34 | 35 | ## `String.intern()`? 36 | 若字符串常量池中国已有该字符串则直接返回.JDK1.6及之前的字符串常量池在方法区, 之后的在堆中. 37 | 38 | ## `String s = new String("abc");`创建了几个对象? 39 | 先创建"abc"字符串, 然后new 一个对象,s 指向该对象 40 | 41 | ## 栈中对象引用有几种方法? 详细介绍一下区别? 42 | - 句柄: 指向对象数据以及对象类型 43 | - 指针: 直接指向实例对象, 实例对象对象头中有对象类型 44 | 45 | ## JVM年轻代与老年代? 年轻代垃圾回收过程? 46 | JVM主要分为年轻代和老年代, 年轻代又分为survivor(from和to)和Edien区域.年轻代与老年代默认比例1:2 47 | Edien区域满后会触发major gc, 过程大致为: 先对Eiden区域进行垃圾回收, Eiden区域存活的对象复制到survivor区域的to区域中, from区域的对象根据其年龄进行转移, 若其年龄大于称为老年代设置的阈值时转移到老年代, 否则复制到to区域中; 复制完之后to区域和from区域交换角色. 48 | 49 | ## 永久代会发生垃圾回收吗? 50 | 永久代本身没有垃圾回收算法, 但会使用full gc来进行回收. 51 | 52 | ## JVM年轻代中Eden与survivor的比例? 53 | 8:1 54 | 55 | ## 垃圾回收算法有哪些? 56 | - 引用计数法 57 | - GC ROOT 58 | 59 | ## 垃圾回收策略? 60 | - 复制算法: JVM年轻代回收算法 61 | - 标记-整理: 回收过期对象, 然后对回收区域进行整理压缩, 不会产生垃圾碎片 62 | - 标记-清理: 直接回收过期对象, 不会对回收区域进行压缩, 会产生垃圾碎片 63 | - 分代 64 | 65 | ## 垃圾收集器有哪些? CMS特点? 66 | - Serial: 年轻代垃圾回收, 单线程, 需要stop-the-world 67 | - ParNew: Serial的多线程版本, 年轻代 68 | - Parallel Scavenge: 吞吐量优先, 年轻代使用复制算法, 老年代使用标记整理算法 69 | - Serial Old: 老年代收集器, 单线程 70 | - Parallel Old: Serial Old的多线程版本 71 | - CMS: 最短回收停顿时间为目标的收集器.初始标记(STW)-并发标记-重新标记(STW)-并发回收.在并发标记时会产生浮动垃圾, 并且需要在内存用尽完之前回收, 72 | 73 | ## CMS中什么是浮动垃圾? 74 | 在并发标记过程中产生的垃圾. 75 | 76 | ## 比较一下G1与CMS? 77 | - CMS: 使用标记清理算法, 会产生浮动垃圾 78 | - G1: 使用标记整理, 不会产生垃圾碎片; 可预测的停顿; 保留分代 79 | 80 | ## 整个JVM大小? 81 | - JDK1.8之前 JVM = 年轻代+老年代+永久代 82 | - JDK1.8之后 JVM = 年轻代+老年代 83 | 84 | ## 年老代堆空间被占满如何解决? 持久代被占满如何解决? 堆栈溢出如何解决? 85 | - 年老代堆空间被占满: survivor设置大一些; 老年代设置大一些 86 | - 持久代被占满: 持久代设置大一些 87 | - 堆栈溢出: 递归或循环调用 88 | 89 | ## 如何解决异常Fatal: Stack size too small? 90 | Xss设置线程栈大小 91 | 92 | ## 如何解决异常java.lang.OutOfMemoryError: unable to create new native thread? 93 | 可能是单个线程栈太大, 设置小一点, 以便产生更多的线程. 94 | 95 | ## JMM内存模型中的规定了哪八种操作? 什么是重排序? 96 | 八种操作: 97 | - lock 98 | - unlock 99 | - read 100 | - load 101 | - use 102 | - assign 103 | - write 104 | - store 105 | 106 | 重排序: 系统或处理器会根据性能在不影响逻辑情况下对指令进行重排以提高性能 107 | 108 | ## 内存模型三大特性? 原子性、可见性、有序性如何实现? 109 | - 原子性: synchronized实现 110 | - 可见性: volatile即可实现, synchronized也可以实现 111 | - 有序性: volatile, synchronized 112 | 113 | ## 堆上的内存如何释放, 栈上的内容如何释放? 114 | - 堆上的内存需要major gc或 full gc释放 115 | - 栈上的内容在方法调用结束后会释放 116 | 117 | ## Java内存泄露的最直接表现? 118 | 抛出异常 119 | 120 | ## 什么是内存溢出, 什么是内存泄露? Java会不会发生内存泄露? 121 | - 内存溢出: 无法申请到内存空间 122 | - 内存泄露: 垃圾没有被回收, 一直占用内存空间, 无法得到释放 123 | 124 | ## 什么情况下会发生内存溢出? 125 | 堆设置太小, 递归深度过大 126 | 127 | ## 老年代溢出原因? 永久代溢出原因? 128 | - 老年代溢出: 创建大数组或大字符串 129 | - 永久代溢出: 通过反射创建太多对象, 永久代存放过多类信息 130 | 131 | ## 如果对象的引用被置为null, 垃圾回收器是否会立即释放该对象占用的内存? 132 | 不会立即释放, 会在下一个垃圾回收时进行垃圾回收 133 | 134 | ## Java中对象什么时候可以被垃圾回收? 135 | 没有变量指向该对象时, 会在下一个垃圾回收期被回收 136 | 137 | ## 你能保证GC吗? 138 | 无法保证GC. 即使使用System.gc(), 这只会建议JVM进行垃圾回收, 不会立即执行. 139 | 140 | ## finalize什么时候使用? 为什么避免使用? 141 | - 重写finalize给对象一次挽救机会, 将对象与GC Roots上的对象进行关联, 使得不会被垃圾回收器收集. 142 | - 避免使用的原因: 无法预测执行时间, 可能整个程序声明周期也不会执行 143 | 144 | ## JVM如何确定一个对象是不是有引用? 145 | 通过GC Roots方法 146 | 147 | ## GC Roots包含哪些? 148 | - 栈中的引用对象 149 | - 本地方法中的引用对象 150 | - 方法区指向对象的常量 151 | 152 | ## GC Roots 对不可用对象的判断过程? 153 | 一般经过两次GC Roots. 154 | 155 | 第一次GC Roots遍历对象链, 如果发现某个对象不可达: 如果该对象重写finalize方法且没有运行过, 那么就运行finalize方法让该对象自救一次, 如果自救成功则在下一次遍历过程中从即将被回收的对象集合中移除; 如果失败, 则下一次遍历过程中被回收. 156 | 157 | ## 什么时候新生代会发生GC? 老年代发生GC条件? Full GC 触发条件? + 158 | - 当Edien区域满了会发生Major gc 159 | - 老年代满了会发生full gc 160 | 161 | full gc出触发条件: 162 | - 老年代满 163 | - 空间分配担保失败 164 | - CMS抛出异常需要full gc 165 | - 调用System.gc()命令 166 | 167 | ## 永久代回收条件? 168 | 三个条件: 169 | - 该类的所有对象被回收 170 | - 类加载器被回收 171 | - 不能通过反射获得该类 172 | 173 | ## GC为什么要分代? 174 | 根据对象生命周期, 根据对象生命周期使用不同的垃圾回收策略.年轻代因为对象朝生夕死, 频繁发生垃圾回收, 并且大部分对象都会被回收掉, 所以一次major gc后Edien区域存活对象少, 这时使用复制算法就很快, 而老年代因为对象大部分存活比较长, 一次垃圾回收后存活对象多不适合复制算法而适合标记整理算法. 175 | 176 | 另外在判断对象是否可以回收过程中需要遍历所有对象, 若每次gc都会对整个堆中的对象都进行遍历, 那么将会非常耗时. 177 | 178 | ## JVM中大对象被分配到哪里? 长期存活对象进入哪里? 什么是空间分配担保? 179 | 1. JVM中大对象被分配到老年代 180 | 2. 长期存活的对象被分配到老年代 181 | 3. 空间分配担保: 在进行Major GC过程中, JVM需要判断老年代连续空间大小是否大于Major GC历代进入老年代对象大小的平均值, 若大于则进行一次有风险的Major GC; 若小于则进行一次full gc. 182 | 183 | ## 进入老年代的几种情况? 184 | - 长期存活的对象 185 | - 大对象 186 | - 动态年龄判断 187 | 188 | ## JRE判断程序是否结束的标准? 189 | 前台线程执行完 190 | 191 | ## 什么是安全点? 192 | 指令复用即可以长时间执行的阶段, 一般发生在方法调用, 循环跳转, 异常抛出等情况 193 | 194 | ## 什么是happens-before(先发行为原则)? 195 | 规定某些指令必须按照顺序执行 196 | 197 | ## 对象创建的过程? 198 | - 类加载 199 | - 申请空间, 指针碰撞法和空闲列表法 200 | - 初始化地址空间 201 | - 初始化类 202 | 203 | ## 对象内存布局? 204 | - 对象头 205 | - 对象实例数据 206 | - 填充 207 | 208 | ## 被动引用有哪些情况? 209 | - 子类调用父类非final修饰的static成员, 父类会初始化 210 | - 子类调用父类final static修饰的成员, 父类不会初始化 211 | - 创建数组, 不会初始化 212 | 213 | ## 静态解析和动态解析? 214 | ## 静态分配和动态分配? 215 | - 静态分配: 重载 216 | - 动态分配: 重写 217 | 218 | ## 频繁FullGC如何排查? 219 | 先明确fullgc触发条件, 根据那些条件来排查 220 | 触发条件: 221 | - CMS垃圾回收失败 222 | - 空间分配失败 223 | - 老年代满 224 | - 永久代满 225 | - 调用system.gc 226 | 227 | 排查: 228 | - jstat -gc [pid] # 查看gc情况 229 | - jmap -heap pid # 显示java堆详细信息 230 | - jmap -histo [pid] # 查看堆中对象统计 231 | 232 | 233 | ## JVM中存在大量图片如何解决? 234 | 使用软引用, 内存不足时回收 235 | 236 | ## 双重校验锁为什么要加锁后再次判断是否为空? 为什么外面还要判断? 237 | 为防止加锁时其它线程刚好创建一个实例 238 | 239 | 外面判断的原因是为了提高性能, 因为并不是每次都需要加锁来创建对象 -------------------------------------------------------------------------------- /src/5-计算机网络.md: -------------------------------------------------------------------------------- 1 | > ## 计算机网络 2 | 3 | ## 什么是URI 4 | URL+URN组成 5 | 6 | ## URL格式? 7 | <协议>://<主机>:<端口>/<路径> 8 | 9 | ## Http请求和响应结构? 10 | 请求: 请求行(请求方法+URL+协议版本)+请求头部+请求包体 11 | 响应: 响应行(协议版本+状态码+状态码解释)+响应首部+响应包体 12 | 13 | ## HTTP请求头与请求行之间是什么? 14 | 空行 15 | 16 | ## 什么是Cookie? Session和Cookie的区别? Cookie被禁用解决办法? 17 | cookie是浏览器端存储的数据, 数据类型为字符串; session是浏览器端存储的数据, 可以为任意数据类型. 18 | 19 | cookie被禁用后session也会被禁用, 因为session靠cookie中的sessionId来识别用户.可以通过URL重写技术, 将sessionId写入链接中. 20 | 21 | ## 浏览器和Servlet通信协议? 22 | HTTP通信协议 23 | 24 | ## HTTP隧道? 25 | 将数据封装在HTTP协议里面, 通过HTTP协议进行传输 26 | 27 | ## URL解码与编码? 28 | URL中对特殊字符进行编码 29 | 30 | ## 常见HTTP状态码: 100, 200, 301, 302, 400, 401, 403, 404, 500, 502, 503, 504 31 | - 100: 消息 32 | - 200: 成功消息 33 | - 301: 永久重定向 34 | - 302: 临时重定向 35 | - 400: 错误请求, Bad Request 36 | - 401: 未授权 37 | - 403: forbidden 38 | - 404: not found 39 | - 500: 服务端未知错误 40 | - 502: Bad Gateway 41 | - 503: 服务器不能正确处理请求 42 | - 504: 网关超时Gateway Time-out 43 | 44 | ## 301和302区别? 45 | 永久重定向与临时重定向 46 | 47 | ## HTTP状态码502与504区别? 48 | [参考博客](https://www.cnblogs.com/liluxiang/p/9360944.html) 49 | 50 | ## HTTP请求有哪些? 51 | - put: 上传文件不带验证机制 52 | - get: 获取资源 53 | - post: 传输实体 54 | - head: 获取报文首部, 用以确认URL的有效性 55 | - patch: 对部分资源进行修改 56 | - options: 支持查询方法 57 | - connect: 要求在代理服务器通信时建立隧道 58 | - trace: 追踪路径 59 | 60 | ## post与get的区别? 61 | get: 62 | - 数据在URL中 63 | - 可以缓存 64 | - 效率高 65 | - 只能接受ASCII码字符的参数类型 66 | - 用于查询 67 | - 大小有限制, 一般为2kb限制 68 | 69 | Post: 70 | - 数据在请求实体中 71 | - 不可以缓存 72 | - 效率低 73 | - 支持多编码 74 | - 通常用于修改删除 75 | - 大小无限制 76 | - 不可以缓存 77 | 78 | ## 为什么get效率高于post? 79 | - get可以缓存, post不能缓存 80 | - post在真正接受数据之前会先将请求头发送给服务器确认, 然后才真正发送数据 81 | - post请求包含更多的请求头 82 | - post不能进行管道化传输 83 | 84 | ## HTTP协议? 特点? 85 | HTTP协议属于应用层协议, 底层是基于TCP传输 86 | 87 | 特点: 效率高, 速度快, 无状态 88 | 89 | ## HTTP长连接与短连接? 非流水线与流水线? 90 | 建立TCP连接完成一次数据传输后不关闭TCP, 下一次传输继续在该连接上发送数据. 91 | HTTP1.1之前默认短连接, HTTP1.1后开始默认长连接. 92 | 93 | 流水线: 发送数据时不等到上一个发送的数据收到ACK确认也可以继续发送数据 94 | 非流水线: 等待上一次发送的数据收到ACK后才发送下一个数据 95 | 96 | ## HTTP1.1与HTTP1.0比较? HTTP2.0与HTTP1.x比较? 97 | HTTP1.1与HTTP1.0比较: 98 | - HTTP1.1开始默认长连接 99 | - 100消息 100 | - 多个HOST 101 | - 大的数据进行分割 102 | - 过期资源不直接删除而是向服务器确认一下 103 | 104 | HTTP2.0与HTTP1.X比较: 105 | - HTTP2.0支持二进制格式, 之前的为文字格式 106 | - HTTP2.0 首部压缩, 使用哈夫曼算法进行压缩 107 | - HTTP2.0支持多路复用 108 | - HTTP2.0支持服务端推送 109 | 110 | ## HTTP2.0 多路复用与HTTP1.X中的长连接比较? 111 | 多路复用: 一个连接上可以同时发送多个请求 112 | 长连接: 多次请求共用一个连接 113 | 114 | ## HTTP2.0中服务端推送? 115 | 客户端不用单独向服务端进行资源请求, 服务端直接解析代码主动向客户端发送资源, 以减少客户端请求次数. 116 | 117 | ## 一次完整的HTTP请求? 118 | DNS域名解析 -> TCP连接 -> HTTP请求 -> 服务端处理 -> 客户端解析HTML代码, 请求资源 -> 服务端响应资源 -> 客户端接收资源然后对页面进行渲染 -> 呈现给客户端 119 | 120 | ## HTTP是有状态还是无状态? 如何记住上次请求的用户? 121 | HTTP是无状态的. 122 | 123 | 通过cookie来记住用户. 124 | 125 | ## HTTPS交互过程? 与HTTP比较? 126 | HTTPS基于HTTP+SSL(STL), 交互过程: 127 | 1. 客户端选择一套suite cipher发送给服务器 128 | 2. 服务器选择hash算法以及加密解密方法, 以证书形式发送给客户端 129 | 3. 客户端验证证书合法性并生成一串随机数, 将随机数使用hash算法进行hash, 然后将握手信息+hash结果使用公钥加密发送给服务器 130 | 4. 服务器使用秘钥解密握手信息, 对应的hash算法对握手信息进行hash并比较结果是否一致, 一致后也生成握手信息+哈希发送给客户端验证 131 | 5. 客户端验证成功后进行正常通信发送数据 132 | 133 | 区别: 134 | - HTTPS需要申请证书 135 | - HTTPS是基于HTTP+SSL 136 | - HTTPS端口为443, HTTP端口为80 137 | - HTTP发送的是明文, HTTPS发送的是加密信息 138 | 139 | ## SMTP, DNS, HTTPS端口号与通信协议? 140 | 25, 53, 443 141 | 142 | ## 什么是RESTful? 143 | 一种编程风格, 主要采取动宾格式如"delete/user/id=10" 144 | 145 | ## 什么是token? 146 | token是一串字符串用于验证用户信息或防止表单重复提交 147 | 148 | ## HTTP是基于TCP还是UDP? 149 | HTTP是基于TCP协议 150 | 151 | ## TCP三次握手与四次挥手? 152 | 三次握手: 153 | 1. 客户端发起SYN报文后进入SYN_SENT状态 154 | 2. 服务器接收报文后发送ACK+SYN确认应答报文, 然后进入SYN_RECD状态 155 | 3. 客户端收到服务器的确认应答及同步报文后发送ACK报文进入ESTABLISHED状态 156 | 4. 服务器接收客户端发来的ACK报文后也进入ESTABLISHED状态 157 | 158 | 四次挥手: 159 | 1. 客户端发起FIN报文后进入FIN_WAIT1状态 160 | 2. 服务端接收报文后发送ACK进入CLOSE_WAIT状态 161 | 3. 客户端接收确认应答后进入FIN_WAIT2状态 162 | 4. 服务端继续发送未发送完的数据, 发送完数据之后服务端发送FIN+ACK报文然后进入LAST_ACK状态 163 | 5. 客户端收到服务端的关闭应答报文后发送ACK确认应答, 然后进入TIME_WAIT状态并等待2MSL.在2MSL时间内未收到服务器的确认应答表示服务器接收到了客户端最后发送的ACK确认应答 164 | 6. 服务端CLOSE, 客户端CLOSE 165 | 166 | ## TCP三次握手的必要性? 167 | 三次握手的必要性: 保证双全工通信, 既要保证客户端到服务端的通信也要保证服务端到客户端的通信.并且三次通信保证了客户端可能因为未收到服务端发送的ACK+SYN而导致死锁的情况不会发生 168 | 169 | ## 为什么不能进行两次握手连接? 170 | 如果只进行两次握手即服务端发送ACK+SYN之后就完成通信, 客户端可能因为服务端最后发送的ACK+SYN没有收到而认为服务端没有准备好, 从而导致客户端不会接受服务端的数据, 只等待服务端进行同步确认应答, 这样就导致了死锁的产生. 171 | 172 | ## 为什么连接的时候是三次握手, 关闭的时候是四次挥手? 173 | 客户端在请求关闭后, 服务端可能还有数据没有传输完成, 所以要等待服务端的数据传输完成后才发送一个ACK+FIN报文, 就多了这么一步. 174 | 175 | ## 如果已经建立了连接, 但客户端忽然出故障了怎么办? 176 | 每次传输后都会重置超时重传计时器, 如果两个小时候仍未收到客户端发来的消息, 服务端会每隔75s发送一个确认报文, 连续十次没有响应后服务端认为客户端出现故障, 进而关闭连接. 177 | 178 | ## TIME_WAIT与CLOSE_WAIT区别? 179 | 前者是客户端等待, 后者是服务端等待 180 | 181 | ## TIME_WAIT为什么要等待2MSL, 可以等待1MSL吗? 182 | 不能, 等待1MSL可能会导致客户端发送一个ACK后, 服务端在收到这个ACK的一瞬间刚好启动超时重传FIN, 需要等待这个FIN消失, 所以需要2MSL 183 | 184 | ## 什么是SYN攻击, 如何检测, 如何防御? 185 | 大量半连接请求导致无法处理正常的请求 186 | 187 | 检测: netstate检测网络连接情况, 是否有大量半连接 188 | 189 | 防御: 过滤; 增大半连接请求数 190 | 191 | ## TCP流量控制? 192 | 通过窗口滑移来进行流量控制 193 | 194 | ## 什么是流量控制? 流量控制和拥塞控制是一种东西吗? 195 | 拥塞控制是防止拥塞而导致阻塞出现 196 | 197 | ## 滑动窗口机制? 198 | 发送方和接收方协商一段字节长度作为窗口大小.可以防止接收方因为缓存溢出而导致消息丢失. 199 | 200 | ## 拥塞避免机制? 201 | 两种: 超时重传和三次确认 202 | 203 | 机制: 慢开始, 拥塞避免, 快重传/快恢复 204 | 205 | 慢开始: 开始时窗口大小为1, 门限初始, 以指数形式增长, 当窗口大小等于门限大小时转为拥塞避免算法 206 | 207 | 拥塞避免算法: 以线性增长, 当网络出现拥塞时将门限设置为当前窗口的一半然后将当前窗口变为1, 实行慢开始算法 208 | 209 | 快重传/恢复: 210 | - 快重传是指当接收方收到失序片断后发送重复确认, 发送方连续收到三次重复确认后就立即发送接收方尚未收到的失序片断, 而不必等待重传计时器到期. 211 | - 快恢复: 当连续收到三次重复确认后将当前门限减半, 当前窗口设置为门限大小, 然后执行拥塞避免算法(当TCP连接和网络出现超时时采用慢开始) 212 | 213 | ## TCP, UDP的区别? 214 | 面向连接, 可靠速度慢, 速度低 215 | 面向无连接, 不可靠, 速度快 216 | 217 | ## TCP, UDP的应用场景? 218 | TCP场景: 保证数据安全可靠的传输如HTTP传输 219 | 220 | UDP: 效率高, 但不能保证数据可靠, 适用于及时性强的应用如视屏通话, 语音通话 221 | 222 | 223 | ## TCP可靠传输的实现? 224 | - 超时重传 225 | - 拥塞避免 226 | - 确认序列 227 | - 流量控制 228 | 229 | ## TCP粘包现象? 如何解决? 230 | TCP粘包现象主要是因为Nagle算法导致不同的数据因为缓存的原因, 数据之间没有边界标识导致数据无法区分 231 | 232 | 解决办法: 数据之间需要由边界标识如换行符'\n' 233 | 234 | Nagle算法: 为了解决telnet场景下键盘每敲一下就发送一个字符导致传输效率低的问题. 235 | 具体: 如果发送方发送包含少量字符的数据包, 发送端会将第一个小包发送出去, 然后将后面收到的字符缓存起来而不立即发送, 直到接收到前一个数据包报文的ACK确认或者当前字符属于紧急数据或者当前缓存数据长度超过MSS(Maximum Segment Size)后才将缓存中组成的一个较大的数据包发送出去. 236 | 237 | ## 如何用UDP实现可靠性传输? 238 | - 采用确认序列 239 | - 拥塞避免 240 | - 超时重传 241 | - 流量控制 242 | 243 | 244 | ## UDP为什么不会发送粘包现象? 245 | TCP是基于流传播, 而UDP会基于链式传播保证每条消息的完整性.比如发送了三条消息, UDP接收方会在缓存中保存三条消息, 而TCP可能只接受到一条合并消息; UDP需要接受三次, 而TCP则可能只接收一次 246 | 247 | ## UDP为什么采用链式传播? 248 | 因为UDP可能是一对多连接, 为了区分发送方需要分开存储; 而TCP是一对一 249 | 250 | ## UDP有发送缓冲区吗? 251 | 因为是不可靠传输, 所以只把数据从用户态拷贝到内核, 然后立即发送, 不管对方是否接收到, 所以不需要缓冲区. 252 | 253 | 而TCP因为需要保证可靠性传输, 所以需要由发送缓冲区来实现丢失重传, Nagel算法合并, 滑动窗口等 254 | 255 | ## TCP, UDP, IP在传输过程中数据的最大值? 256 | 链路层在Internet最大传输是1518, 去除首部的18字节后为1500 257 | TCP: 1500 - IP首部(20) - TCP首部(20) 258 | UDP: 1500 - IP首部(20) - UDP首部(8) 259 | IP报文限制在1500字节 260 | 261 | ## 段, 数据包, 帧? 262 | 传输层叫段, 网络层叫数据包, 链路层叫帧 263 | 264 | ## TCP中keep alive与HTTP中的keep-alive区别? 265 | 前者为查看是否存活, 后者为设置存活时间 266 | 267 | ## 稳定且有上限的带宽条件下, 超大文件从server传输到client端, 选择一个TCP连接快还是构建多个TCP连接快? 268 | 在内网上带宽决定传输所以使用单个TCP传输 269 | 270 | 公网上考虑数据丢失或拥塞现象采用多个TCP传输 271 | 272 | ## TCP包结构? TCP, UDP, MAC, IP包头有多少字节? 273 | 20, 8, 14, 20 274 | 275 | ## OSI七层模型, TCP/IP四层模型 276 | open system interconnection(OSI): 277 | - 物: 物理层 278 | - 数: 数据链路层, Ethernet 279 | - 网: 网络层, IP, ICMP 280 | - 传: 传输层, TCP, UDP 281 | - 会: 会话层, SMTP 282 | - 表: 表示层, TELNET 283 | - 应: 应用层, HTTP, FTP 284 | 285 | TCP/IP四层模型: 286 | - 数据链路层 287 | - 网络层 288 | - 传输层 289 | - 应用层 290 | 291 | ## 如何查找域名对应IP? 292 | 浏览器缓存, 系统缓存, MAC上缓存, ISP缓存, DNS缓存, DNS查询 293 | 294 | ## 有网络层的存在为什么还需要传输层? 295 | 能够保证实现多功能传输 296 | 297 | ## ICMP协议? ping功能? 298 | 网络简单协议, 基于IP,IPv4,功能: 299 | - 将数据发送到指定目的地 300 | - 报告数据丢弃的原因 301 | 302 | ping功能: 303 | - 检查网络连通性 304 | - 查看响应时间延迟 305 | 306 | ## 路由功能? 分组和路由选择的区别? 什么是AS? 常用路由选择协议? 307 | 功能: 分组和路由选择 308 | 309 | AS:路由自治系统, 根据内部网关协议来决定如何路由数据包 310 | 311 | 路由选择协议: 312 | - RIP(Routing Information Protocal), 在固定时间间隔中交换各自的整个路由表, 根据跳数(<=15跳) 313 | - OSPF(Open Shortest Path First), 使用泛洪算法发送跟新消息, 根据IP数据报发送信息, 选择路由的度量标准是带宽, 延迟. 314 | 315 | ## IP地址分类 316 | - A: 8字节, 0-8位为网络标识, 后面24位为主机标识 317 | - B: 16字节 318 | - C: 24字节 319 | - D: 32字节 320 | 321 | ## ARP 322 | 1. 每个主机都会在自己的ARP缓冲区建立一个ARP列表, 以表示IP和MAC的关系 323 | 2. 当源主机要发送数据时, 检查ARP是否有对应的IP,如果有直接发送, 如果没有则向本段网络的所有主机发送ARP数据包, 该数据包的内容: 源主机IP地址, 源主机MAC地址, 目的主机的IP地址 324 | 3. 本网段所有主机接收ARP包, 检查IP是否为自己的IP, 若不是则忽略; 若是则将自己的MAC地址写入ARP响应包中, 告诉源主机自己是它想要找的MAC地址 325 | 4. 源主机收到ARP响应包后, 将目的主机的IP和MAC写入ARP列表, 并利用此信息发送数据 326 | 327 | ## 数据链路层的作用? 328 | 1. 为IP模块接收和发送数据 329 | 2. ARP模块发送ARP和接收ARP应答 330 | 331 | 会解决三个问题: 封装成帧, 透明传输, 差错检测 332 | 333 | ## 浏览器从一个请求发送到返回经历过程中的优化有哪些? 334 | 客户端: 335 | - 浏览器: 336 | 1. 浏览器开启压缩 337 | 2. 资源尽量放在一起 338 | 3. css上面js下面 339 | 4. 减少不必要的cookie请求 340 | - CND加速 341 | - 反向代理 342 | 343 | 服务端: 344 | - 分布式缓存 345 | - 集群: 容错, 负载均衡, 限流 346 | - 异步处理 347 | - 代码优化 348 | 349 | ## 浏览器访问一个网站的过程? 会用到哪些协议? 350 | DNS->HTTP->TCP->IP->ARP 351 | 352 | ## CSRF和XSS区别? 各自解决方法? 353 | CSRF:跨域伪造请求, 根据cookie伪造请求. 354 | 解决办法: reference; token; 转发请求时需要用户输入, 让用户知道自己在干什么 355 | 356 | XSS:跨站脚本, 通过向请求里注入代码 357 | 解决办法: 过滤+编码 358 | 359 | ## 什么是ajax? 360 | 异步请求, XmlHttpRequest 361 | 362 | ## SOAP和REST有什么区别? 363 | SOAP有一定的规范, 如底层数据使用XML格式 364 | REST只是一种代码风格, 没有明确的代码规范 365 | 366 | ## 什么是XML? 367 | Extention Markup Language(可扩展标记语言) 368 | 369 | ## PV和UV区别? 370 | page view, user view 371 | 372 | ## 什么是跨域, 如何解决? 373 | 跨域后js不能使用另一个域的对象 374 | 375 | 通过JSONP处理 376 | 377 | ## 客户端缓存过期机制, 缓存验证? 378 | MAX_AGE 379 | 380 | ETAG缓存验证 381 | 382 | ## 数据包的流动? 383 | MAC->IP->TCP->应用层 384 | 385 | ## forward和redirect的区别? 386 | - forward:服务端转发, 可以共享数据, 速度快, 浏览器看不到URL地址栏变化 387 | - redirect: 服务端给客户端发送一个301/302状态码告知客户端重新定向到指定URL, 用户知道请求变化, 地址栏有改变, 效率较低 388 | 389 | ## URL重写技术? 390 | 当cookie禁用时的一种跟踪用户策略, 将标记信息增添到URL 391 | 392 | ## IP寻址过程? 393 | 1. 根据路由表搜索匹配主机, 如果找到直接将报文发送给主机 394 | 2. 如果匹配主机失败, 则匹配同子网的路由器, 寻找与目的网络号相匹配的表目, 如果找到就发送给指定路由器 395 | 这样进行逐跳式进行, 因为IP不知道到达任何目的地的完整路径, 所有IP路由选择只为数据报文提供下一站路由器的IP地址 396 | 397 | ## 客户端与服务端建立TCP连接三次握手前做了什么? 398 | 在握手前进行DNS查询, DNS迭代查询 399 | - 本地缓存中查询 400 | - 如果没有就到系统配置的DNS服务器中查询 401 | - 如果还没有就到DNS根服务器中进行查询, 然后迭代查询域名 402 | - 最后查询出网址对应IP 403 | 404 | DNS查询基于UDP -------------------------------------------------------------------------------- /src/6-数据库.md: -------------------------------------------------------------------------------- 1 | > ## 数据库 2 | 3 | ## ER图? 4 | Entity-Relation, 属性、依赖关系图 5 | 6 | ## SQL与NoSQL区别? 7 | - SQL基于表, NoSQL不用提前建表 8 | - SQL数据结构为表, NoSQL可以任意格式 9 | - SQL数据分层不容易, NoSQL数据分层容易 10 | - SQL支持丰富的多表查询 11 | - SQL事物支持度较高, NoSQL事物支持度不高 12 | - SQL速度没有NoSQL速度快 13 | 14 | ## 数据库分表? 分片规则? 分表带来的事物问题、join查询、全局主键重复问题如何解决? 15 | 数据库分表分为垂直切分和水平切分 16 | 17 | 垂直切分: 18 | - 垂直分表: 大表拆小表, 可以增加数据读取行数 19 | - 垂直分库: 将关联度相同的表放在一起 20 | 21 | 水平切分: 22 | - 库内分表: 库内水平切分表, 不能缓解数据库IO压力, 只能减小单个表的大小; 用处不大 23 | - 分库分表: 有三种拆分方法, 根据范围; 根据主键哈希; 映射关系 24 | 25 | 分表带来的事物问题: 最终一致性去解决 26 | 27 | join查询问题: 28 | - 全局表: 某个表全局都用 29 | - 数据冗余, 缓存某些反范式的字段 30 | - 分表查询后进行组合 31 | - 根据关系进行切分 32 | 33 | ## 事物的两个特性? 34 | 事物传播以及隔离 35 | 36 | ## 什么是存储过程? 与函数有什么区别和联系? 37 | 存储过程与函数类似, 但是会编译后进行存储, 功能大 38 | 39 | 区别: 40 | - 存储过因为编译, 所以运行速度大于函数 41 | - 存储过程作为独立部分执行, 函数作为查询语句的一部分嵌套在select中执行 42 | - 函数不能操作实体表, 只能操作内建表 43 | - 存储过程一般为逻辑较复杂的操作, 函数一般功能较单一如max, min 44 | 45 | ## 什么是游标? 46 | 游标可以遍历多行返回结果并处理其中一个结果 47 | 48 | 使用方法: 49 | - 定义游标 `declare 游标名 cursor for select 语句` 50 | - 打开游标 `open 游标名` 51 | - 获取结果 `fetch 游标名 into 变量名` 52 | - 关闭游标 `close 游标名` 53 | 54 | ## 什么是触发器? 55 | 一个特殊类型的存储过程, 由事件来触发, 自动完成SQL语句; 隐式调用, 保证数据有效性和完整性 56 | 57 | ## 什么是视图? 如何进行操作? 58 | 视图为虚表, 由基本表中选取的数据组成的逻辑窗口, 不存放真实数据. 59 | - 简化查询数据 60 | - 提高数据的安全性 61 | 62 | ## 什么是ACID? 具体? 63 | - Atomic,原子性, 操作要么成功, 要么失败 64 | - Consistent, 一致性, 事物中一次和多次操作结果都相同 65 | - Isolation, 隔离性, 事物之间不相互影响 66 | - Durability, 已提交的事物对数据库所做的更新必须永久保存 67 | 68 | ## 说一下一范式, 二范式, 三范式? 举例说明 69 | - 一范式: 数据原子性, 不可分割 70 | - 二范式: 不能存在部分依赖 71 | - 三范式: 不能存在传递依赖 72 | 73 | ## InnoDB乐观锁如何实现? 74 | 通过MVCC + undo log 完成 RC 75 | 通过MVCC + Next-Key lock 完成 RP 76 | 77 | ## InnoDB有多少种日志? 78 | - 慢日志 79 | - 查询日志 80 | - 错误日志 81 | - 事务日志 82 | - 中继日志 83 | - 二进制日志 84 | 85 | ## MySQL中redo log与undo log区别? 86 | - redo log: 87 | 大部分为物理日志, 其记录时间点为缓存页面修改完成, 但数据还没有刷入磁盘之前(事务提交), 即日志一定要比数据先到磁盘, 以保证事物持久性 88 | - undo log: 89 | 基本为逻辑日志, 记录时间点为修改缓存页面之前, 保证事物发生之前的一个版本, 可以用于回滚 90 | 91 | ## MySQL约束类型? 92 | 主键约束, 外键约束, 唯一约束, 非空约束 93 | 94 | ## MySQL有哪些语言? 95 | Define 96 | Managment 97 | Query 98 | Control 99 | 100 | ## MySQL有哪些数据类型? ip用什么类型存储? 电话号码用什么类型存储? 101 | - 整数类型: 102 | 包括tinyint(8), smallint(16), mediumint(24), int(32), bigint(64); int(11)中只是规定交互工具显示字符的个数, 对存储和计算是没有意义的 103 | - 字符串类型: char和varchar(20); 104 | varchar性能高于char, 但是在进行修改时会进行扩展可能导致需要额外操作; 105 | carchar会存储字符串末尾的空格, char则不会保留字符串末尾的空格 106 | - 日期和时间 107 | datetime:精确到秒, 8字节, 与时区无关 108 | timestamp: 4字节, 和unit时间戳相同, 会默认插入当前时间 109 | 110 | ## MySQL连接有哪些方式? 内连接与外连接有什么区别? 默认使用什么连接? 111 | 连接方式: 外连接, 内连接 112 | 113 | 外连接: 分为left join, right join 114 | 115 | 内连接: inner join(只有join关键字时的默认连接方式), a inner join b 与 from a,b效果一致(说法不同) 116 | 117 | ## MySQL中exist和in的区别? 118 | - exist 119 | 先查询外表再查询子表, 将外部查询结果在子查询结果中进行匹配, 内标可以使用索引 120 | - in 121 | 先查询子表再查询外标, 将内表中的结果与外表中的结果进行关联 122 | 123 | ## union和union all区别? 124 | union是将字段相同的记录合在一起, 默认去除重复字段; all加上后显示所有字段 125 | 126 | ## group by, having, where区别? 127 | group by 是分组 在where之后 128 | 129 | having是分组过滤, 在group by 之后 130 | 131 | `select distinct id, count(*) from table_name where id > 20 group by id having count(id) > 3;` 132 | 133 | ## count(\*), count(column), count(1)的区别? 134 | `count(*)` 与 count(1)效果类似, 一般使用 `count(*)`, 不会过滤空字段 135 | count(column)会过滤空字段 136 | 137 | ## drop, truncate, delete区别? 138 | - drop: 删除表结构表数据, 不可恢复 139 | - truncate:删除表数据, 不可恢复, 删除后的表数据恢复id顺序 140 | - delete: 删除表数据, 可以恢复, 删除后id不重新按顺序 141 | 142 | ## MySQL有哪些搜索引擎? MySQL索引有哪些? 什么是倒排索引? 143 | - B+ Tree 144 | - 哈希索引, 自适应哈希索引(B+ Tree 查询频繁字段自动生成哈希索引) 145 | - 基于图 146 | - 全文检索(倒排序):通过字段查询文章, 而不是通过文章查询字段 147 | 148 | ## MySQL如何删除外键? 149 | alter table table_name drop foreign key uid; 150 | 151 | ## MySQL数据库索引原理? 152 | B+ Tree索引, 将相对无序的数据变为相对有序的数据, 方便检索 153 | 154 | ## MySQL数据库优化? 155 | - 搜索优化, 索引优化 156 | - 从数据库结构: 水平切分和垂直切分 157 | - 从缓存角度 158 | - 分布式 159 | 160 | ## 聚集索引与非聚集索引区别? 161 | - 聚集索引: 叶子中的数据为数据本身 162 | - 非聚集索引: 叶子中的数据为数据指针 163 | 164 | ## MySQL索引优化? 165 | - 前缀索引优化 166 | - 索引不参与计算 167 | - 主键, 外键创建索引 168 | - 尽可能选择区分度高的字段为索引 169 | - 避免全文索引 170 | - 使用模糊查询时, %不放在最前面 171 | - 使用where等条件查询时, 要使索引生效需要全部条件都为索引字段 172 | 173 | ## 为什么要使用索引? 索引那么多有点为什么不对表中的每一列都创建索引? 174 | 索引优点: 175 | - 使得每一行数据唯一 176 | - 多表查询时提升查询速度 177 | - 索引提升数据库查询速度 178 | 179 | 不对每一列都建立索引的原因在于: 180 | - 索引的创建需要空间与时间 181 | - 索引的维护需要时间 182 | - 过多的索引会占据内存空间 183 | 184 | ## 什么是覆盖索引? 185 | 查询语句中的结果全部为索引, 查询出来后不需要再去通过索引查询非索引字段, 提升查询速度 186 | 187 | ## 索引是如何提高查询速度的? 188 | 将相对无需的数据变为相对有序的数 189 | 190 | ## MySQL在哪些情况下索引会失效? 191 | - 数据库认为不使用索引查询的速度高于使用索引查询的速度 192 | - 在使用条件查询中存在非索引条件 193 | - 模糊查询使用%前缀 194 | - 前缀查询时, 第一个字段不是索引 195 | 196 | ## MySQL索引使用条件? 性别适合使用索引嘛? 197 | 区分度高的字段使用索引, 性别区分度不高, 不适合索引 198 | 199 | ## MySQL如何优化数据访问? 200 | - 查询感兴趣的字段 201 | - 按行数查询 202 | - 使用索引 203 | 204 | ## 什么是最左匹配原则? 什么是联合索引? 205 | 最左匹配原则基于联合索引, 在创建联合索引如(a,b,c)时, 数据库会自动创建三个索引分别为: (a), (a, b), (a, b, c).当使用的(b, c)或(d, b, c)时, 索引不生效. 206 | 207 | ## MySQL封锁粒度? 封锁类型? 封锁协议? 208 | 封锁粒度: 行锁和表锁 209 | 210 | 类型: 独占锁排他锁, 意向锁 211 | 212 | 封锁协议: 两次阶段, 加锁与解锁两阶段进行 213 | 214 | ## 什么是当前读与快照读? 215 | - 当前读: 使用悲观锁进行读取数据 216 | - 快照度: 不使用锁, 使用MVCC+日志的方式进行读取 217 | 218 | ## MySQL有哪些锁? InnoDb行锁有几种? 什么是死锁? 数据库死锁如何解决? 219 | MySQL锁: 220 | - record lock, 记录本身所在索引 221 | - gap lock, 间隙锁, 记录本身索引之间的记录, 不包括记录本身索引 222 | - next-key lock, 前两者的集合 223 | 224 | ## InnoDB的行锁加什么完成? 225 | 默认的和update 226 | 227 | ## MySQL事物隔离级别? 各自会带来什么问题? 228 | 以下事物为InnoDB事务 229 | - read uncommit 230 | 读取未提交事物, 会造成脏读 231 | - read commit 232 | 读取已提交事物, 会造成不可重复读, 如读取某一行数据前后两次读取结果不同 233 | - repeatable read 234 | 保证多个实例在并发读取数据时会看到相同的数据; 会造成幻读(重新读取某个范围时, 数据行不一致) 235 | - serializable 236 | 强制事物排序使之不能相互冲突, 可以解决幻读 237 | 238 | ## MySQL如何解决RC, RP带来的问题? 什么是MVCC? 239 | 使用MVCC解决RC, 使用MVCC+Next-key lock解决RP 240 | 241 | MVCC(Multi-Version Concurrency Control, 多版本并发控制), 通过在记录行添加两列字段, 创建版本号与删除版本号进行控制 242 | - 读取: 读取创建版本号早于当前版本号并且删除版本号大于当前版本号的字段 243 | - 删除: 删除时将原数据行的删除版本号改为当前事物版本号 244 | - 更新: 复制原数据行, 将新行数据创建版本改为当前事物版本, 原数据行的删除数据版本号改为当前事物版本号 245 | 246 | ## MySQL如何解决幻读? 247 | MVCC+next-key lock 248 | 249 | ## MySQL主从复制过程? 读写分离好处? 250 | 过程: 251 | - binlog: 负责将主服务器数据更改写入二进制日志中 252 | - IO线程: 将数据从主服务器的二进制日志中写入从服务器的中继日志中 253 | - SQL线程: 负责读取从服务器的中继日志, 并进行更改 254 | 255 | ## InnoDB与MyISAM的区别? 256 | - InnoDB支持事物, MyISAM不支持事物 257 | - InnoDB支持行锁, MyISAM不支持行锁 258 | - InnoDB不记录行数,MyISAM记录行数 259 | - 删除InnoDB数据时, 一行行删除; 删除MyISAM时重构表结构 260 | - InnoDB支持外键, MyISAM不支持外键 261 | 262 | ## 如果数据库日志满了, 会出现什么情况? 263 | 只能用于查询操作, 修改更新删除操作需要写入日志 264 | 265 | ## 如何查看慢查询? 266 | 查看慢日志, 前提是开启了慢日志, 并设置慢日志的时间 267 | 268 | ## B+ Tree 与B Tree区别? 269 | B+ Tree只有根节点存储数据, 而B Tree每个节点都存储数据 270 | 271 | ## B+ Tree操作过程? 272 | 使用二分查找根节点中的指针, 然后指向下一个节点, 递归查询到叶子节点, 叶子节点查询出来的数据如果是聚集索引则直接返回结果, 若为非聚集索引则通过指针查询数据 273 | 274 | ## B+ Tree 与红黑树比较? 275 | 相同节点情况下因为B+ Tree的出度大, 整个数的高度低, 复杂度要低于红黑树 276 | 277 | ## JDBC处理事务采用什么方法? 278 | 采用与数据库一致的事物并加上一个不采取事物操作 279 | 280 | ## JDBC中getString()和getObject()区别? 281 | getString()是一次查询结果, getObject()是一部分一部分地取出结果 282 | 283 | ## 数据库如何查询大数据 284 | - 可以分表然后再查询 285 | - 分段查询 286 | - 查询感兴趣字段 287 | - 使用索引查询 288 | 289 | --- 290 | ## Redis是数据库吗? 291 | Redis不用于数据库, 虽然有持久化机制, 但一般作为缓存使用 292 | 293 | ## 为什么Redis是单线程还这么快? 294 | - 多路复用 295 | - 存储在内存中 296 | 297 | ## Redis数据持久化如何实现? 298 | - RDB: 父线程fork一个子线程, 子线程复制父进程的数据并存储 299 | - AOF: append of file, 每操作一次将操作指令写入日志文件中, 但会造成日志文件过大 300 | 301 | ## AOF文件过大如何解决? 302 | 对AOF进行重写 303 | 304 | ## Redis如何保证原子性? 305 | 通过单线程保证原子性 306 | 307 | ## Redis主从复制模式下, 主挂了怎么办? 308 | 通过哨兵模式, 主服务器挂了之后从服务器会通过选举选出一个新的主服务器 309 | 310 | ## Redis缓存更新策略? 311 | - 定时过期: 对字段设置失效时间 312 | - 惰性过期: 查询时判断字段是否过期 313 | 314 | ## Redis底层数据结构(有哪些数据类型)? 跳跃表如何实现? 压缩列表是什么? 315 | - string类型 316 | - list类型 317 | - 字典 318 | - 跳跃表: 通过链表实现类似于二分查找的功能 319 | - 整数集合 320 | - 压缩列表: 将字段按照一定地规则编码在一块连续的内存区域, 目的是解决内存 321 | 322 | ## Redis使用场景? 323 | - 缓存 324 | - 计数器 325 | - 查询表 326 | - 集合排序、过滤 327 | - 订阅/发布 328 | 329 | ## 与Memcached比较? 330 | - M本身不支持分布式需要通过一致性哈希算法 331 | - M本身只支持字符串, R支持多种类型 332 | - M本身不支持持久化, R支持持久化 333 | - M只存储在内存中, R可以通过日志存储在磁盘中 334 | 335 | ## Redis数据淘汰策略? 336 | - volatile-lru: 从已经设置过期的数据集中选出最近最少使用数据淘汰 337 | - volatile-ttl(time to live): 从已经设置过期的数据集中选出将要过期的数据 338 | - volatile-random: 从已经设置过期的数据集中随机选出进行淘汰 339 | - allkeys-lru: 从所有数据集中选出最近最少使用的数据淘汰 340 | - allkeys-random: 从所有数据集中随机选出进行淘汰 341 | - noevication: 禁止淘汰 342 | 343 | ## Redis如何实现事务? 344 | 使用MUTI进入事物, 使用EXIT完成事物.不支持回滚操作 345 | 346 | ## Redis复制如何实现? 什么是主从链? 347 | 复制操作: 348 | - 主服务器创建快照文件发给从服务器并在发送期间用缓存区记录执行的写命令, 快照发送完之后将缓存中的指令发送给从服务器 349 | - 从服务器读取快照中的指令并接受主服务器发送来得写指令 350 | - 主服务器每写一次命令, 就向从服务器发送相同的写指令 351 | 352 | ## Redis切片? 353 | - 客户端分片: 哈希一致 354 | - 代理分片: 将客户端的请求发送到代理服务器上 355 | - 服务器分片: Redis Cluster 356 | 357 | ## 常见的缓存策略? 358 | - LRU 359 | - LFU 360 | 361 | ## 如何防止缓存雪崩? 362 | 雪崩现象主要是指缓存大面积失效导致大量请求需要数据库处理, 从而导致系统性能下降. 363 | 364 | 解决办法: 365 | - 设置不同的失效时间 366 | - 设置二级缓存 367 | - 真正大面积失效后通过对查询数据库请求进行并发限制 368 | 369 | ## 如何防止穿透? 370 | 穿透是指客户端查询大量缓存中不存在的数据, 可能是数据库攻击 371 | 372 | 解决办法: 373 | - 布隆过滤, 将不可能存在的请求字段进行过滤 374 | - 将查询为空的请求也进行缓存, 缓存时间设置短一些 375 | 376 | ## 什么是缓存预热? 377 | 系统上线时将数据库中的数据放入缓存中 378 | 379 | ## 什么是缓存无底洞现象? 380 | 缓存服务器节点增多, 性能不增反降. 381 | 382 | 原因: 各节点之间通讯费时 383 | 384 | 解决办法: 优化各节点传输的指令, 降低服务间的通信 385 | 386 | ## 如何保证缓存与数据库的双写一致性? 387 | 读取数据时, 若缓存中不存在则向数据库中查询, 然后更新缓存 388 | 389 | 修改时, 先删除缓存, 然后再更新数据库. 390 | 391 | 但上述修改方案会出现删除缓存, 数据库更新还未来得及完成时, 出现其它请求, 导致缓存中的数据是旧数据. 392 | 解决办法: 393 | - 更新时删除缓存, 更新完数据库之后再删除缓存, 但会在一段时间造成脏读现象的出现 394 | - 更新时将缓存设置为指定值, 其他请求查询时若发现缓存字段为指定值则进入循环等待, 等待数据库更新完成, 若未在指定期间更新完成则查询数据库. 395 | 396 | ## MySQL数据备份与恢复 397 | 备份: `mysqldump -u root -p dbname > dbname.sql` 398 | 恢复: `source dbname.sql` -------------------------------------------------------------------------------- /src/7-计算机基础.md: -------------------------------------------------------------------------------- 1 | > ## 计算机基础 2 | 3 | ## 栈有哪些用途? 4 | 数值计算, 树的遍历 5 | 6 | ## 原码, 反码, 补码 7 | 负数的原码左边第一位为1 8 | 9 | 正数的反码为其本身; 负数的反码为符号位不变, 其余位取反 10 | 11 | 正数的补码为其本身; 负数的补码为符号位不变, 其余为取反然后再加上1 12 | 13 | ## 进程间的通信方式? 14 | - 管道, 匿名管道 15 | - 信号 16 | - 信号量 17 | - 消息队里 18 | - 套接字 19 | - 共享文件: 效率高 20 | 21 | ## CPU占用率100%怎么查? 22 | 1. `top` # 或ps -ef | grep java 23 | 2. `ps -mp pid -o THREAD,tid,time` # 命令查看该进程的线程情况, 发现该进程有一个线程占用率很高 24 | 3. `jstack pid | grep tid -A 30` # 2步中的id要转为16进制: printf "%x" <线程id> 25 | 4. `df -h` # 查看磁盘 26 | 5. `du -sh *` # 查看文件目录占用情况 27 | 28 | ## 操作系统有哪些部分组成? 29 | 文件管理系统, 进程调度系统, 资源管理系统, 设备管理系统 30 | 31 | ## 什么是大端, 小端? 32 | 大的数据存储在地址高位称为大端, 反之称为小端 33 | 34 | ## 上下文? 35 | 指令执行的位置和寄存器中的内容 36 | 37 | ## 上下文切换步骤? 38 | - 停止当前指令, 并将信息存储到指定位置 39 | - 从内存中检索下一个指令, 并在寄存器中恢复 40 | - 跳转到该指令停止前的位置 41 | 42 | ## 进程切换步骤? 43 | ## 进程切换一定比线程切换开销大吗? 44 | 不一定 45 | 46 | ## 引起线程上下文切换的原因? 47 | - 线程时间片用完, 系统调度下一个任务 48 | - IO阻塞, 调度器将此任务挂起, 继续下一个任务 49 | - 用户代码挂起当前线程 50 | - 多线程抢占资源, 当前任务没有抢占到资源被挂起 51 | - 硬件终端 52 | 53 | ## 程序计数器? 54 | 指令序列中CPU正在执行的位置 55 | 56 | ## PCB-切换帧? - 57 | 线程上下文切换过程中信息存储的位置 58 | 59 | ## 线程调度算法? 60 | - 抢占式: 都分一点时间片 61 | - 协同式: 轮流执行完任务, 可能会造成系统阻塞 62 | 63 | ## JVM如何实现线程调度? 64 | 使用抢占式线程调度算法实现 65 | 66 | ## 进程调度算法? 67 | - 短作业 68 | - 先来先服务 69 | - 抢占式 70 | - 协同式 71 | - 时间片轮询 72 | - 多级反馈队列 73 | 74 | ## 死锁处理方法? 75 | - 鸵鸟法 76 | - 死锁检测与发现 77 | - 银行家算法 78 | 79 | ## 分页与分段的比较? 80 | - 分段方便管理 81 | - 分段包括多个分页 82 | 83 | ## 虚拟内存? 84 | ## 页面置换算法? 85 | - LRU 86 | - LFU 87 | - FIFO 88 | - OPT(最佳) 89 | 90 | ## I/O复用 91 | 即IO多路复用, java中为Reactor事件分发器 92 | 93 | C++中为poll,epoll 94 | 95 | ## 线程和进程的区别? 多线程和单线程的区别? 96 | 线程与进程的区别: 97 | - 进程由一个或多个线程组成 98 | - 进程是系统资源调度的单位 99 | - 进程上下文切换需要更改多个资源, 而线程只需修改部分寄存器内容 100 | - 进程间通信麻烦, 线程共享地址空间 101 | 102 | 多线程与单线程区别: 103 | - 在单个CPU上单线程运行速度快于多线程 104 | - 在单个CPU上多线程是分配时间片来实现 105 | - 线程之间共享资源有时需要其它复杂操作 106 | - 多线程可以避免用户在等待复杂计算时不能进行其它操作 107 | - 多CPU下, 多线程可以充分利用CPU资源 108 | 109 | ## 计算机判断是否有中断应该是什么时候? 降低进程优先级的时机? 110 | 111 | ## 实时操作系统与分时操作系统的区别? 112 | - 实时操作: 硬件实时与软件实时 113 | - 分时操作: 当前大部分系统, 使用CPU时间切片 114 | 115 | ## 中断, 异常 116 | [链接](https://blog.csdn.net/zat111/article/details/36420903) 117 | - 中断: 为了设备与CPU之间的通讯, 如时钟中断, 硬盘读写服务请求中断, 从逻辑上来说与当前正在执行的进程无关 118 | - 异常: 当前正在执行的进程产生, 会出现出错和陷入, 出错会重新执行那条指令; 陷入就不会 119 | 120 | ## 内存碎片如何解决? 121 | 内存碎片有两种形式: 122 | 1. 内部碎片: 采用固定大小的内存, 当一个进程不能完全使用给它分配的固定内存时就会产生内存碎片, 通常难以避免 123 | 2. 外部碎片: 有些未分配的连续区域太小, 以致不能满足任意内存分配请求, 从而不能被进程利用的区域 124 | 125 | 采用分页方式解决内存碎片, 需要维护一个内存分配表. -------------------------------------------------------------------------------- /src/8-分布式.md: -------------------------------------------------------------------------------- 1 | > ## 分布式 2 | 3 | ## 集群、分布式、微服务区别? 4 | - 集群: 将一个应用复制部署到多个服务器上 5 | - 分布式: 将应用拆分为不同系统部署到不同服务器上 6 | - 微服务: 分布式的细化, 与其类似, 但不同系统可以部署到一个服务器上 7 | 8 | ## 微服务的优点与缺点? 9 | 优点: 10 | - 微服务很小, 可以聚焦到一个指定的业务功能或业务需求 11 | - 能够被小团队开发 12 | - 可以使用不同语言开发 13 | - 小团队更加关注自己的工作 14 | - 只是实现业务逻辑代码, 不会与HTML, CSS等其它界面组合 15 | 16 | 缺点: 17 | - 要理解整个系统很难 18 | - 部署、运维更加困难, 要监控多个节点 19 | - 链路跟踪困难 20 | - 数据一致性问题 21 | - 测试难度加大 22 | 23 | ## 分布式锁的实现? 24 | - zookeeper 25 | - 数据库id 26 | - 缓存Redis中的SENX指令 27 | 28 | ## CAP理论? BASE理论? 29 | - CAP: Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性) 30 | - BASE:如果一个系统不能达到一致性, 那么应该使其能够达到最终一致性 31 | 32 | ## 2PC, 3PC? 33 | - 2PC: 将事物提交分为两个阶段一是事务请求与执行; 二是提交事务与回滚 34 | - 3PC: 对2PC最主要的阻塞的缺点进行改进, 将第二个阶段进行拆分为2部分为预提交与提交 35 | 36 | ## 什么是RMI? 什么是RPC? 37 | - RMI: 远程方法调用 38 | - RPC: 远程方法控制 39 | 40 | ## RPC与REST区别? 41 | - RPC: 一般使用TCP, 效率高, 灵活性低, 适用于基础组件 42 | - REST:基于HTTP, 效率低, 灵活性高, 便于调试 43 | 44 | ## 什么是一致性哈希? 45 | 将服务器分不到环形节点上, 并将数据映射到环形节点上, 然后按照逆时针方式将数据指向第一个遇到的服务器 46 | 47 | ## 反向代理与CDN加速的区别? 48 | - 反向代理: 应用服务器机房附近 49 | - CND加速: 通信应用商缓存静态资源, 用户请求时从最近的服务器上获取该资源 50 | 51 | ## 大型网站核心架构要素? 52 | - 高可用 53 | - 高性能 54 | - 可扩展性 55 | - 可伸缩性 56 | - 安全性 57 | 58 | ## 网站性能测试的主要指标? 59 | - 响应 60 | - 并发量 61 | - 任务请求量: QPS, TPS, HPS 62 | - 性能计数: IO吞吐, CPU使用率, 内存读写 63 | 64 | ## 性能测试包括哪些? 65 | - 性能测试 66 | - 压力测试 67 | - 负载测试 68 | 69 | ## Web前端性能优化? 70 | - 浏览器端: 71 | 资源压缩; css放上面js放下面; 资源合并减少请求次数; 减少不必要的cookie传输 72 | - 反向代理服务器 73 | - CDN加速 74 | 75 | ## 应用服务器性能优化? 76 | - 集群 77 | - 分布式 78 | - 异步处理 79 | - 代码优化 80 | 81 | ## 典型的网站分层架构? 82 | - 应用层 83 | - 服务层 84 | - 数据层 85 | 86 | ## 如何实现应用层高可用? 87 | 使用集群, 无状态转移 88 | 89 | ## 应用服务的Session如何管理? 90 | - 持久化: 数据库 91 | - 粘性Session: 将用户请求转发到指定服务器, 接下来该用户的请求都会转发到该服务器上 92 | - session复制 93 | - session服务器 94 | - cookie携带 95 | - 缓存 96 | 97 | ## 如何实现高可用服务器? 98 | - 分级管理 99 | - 降级 100 | - 异步 101 | - 幂等性 102 | - 超时设置 103 | 104 | ## 如何实现高可用数据? 105 | 高可用数据要保证一致性, 可用性, 持久性, 容错性 106 | 107 | - 数据备份: 冷备份, 热备份 108 | - 失效转移 109 | 110 | ## 如何实现网站的可伸缩性? 111 | 使用集群的方式实现网站的可伸缩性 112 | 113 | ## 什么是负载均衡? 有哪些实现方式? 114 | 负载均衡是将用户请求转发到空闲的服务器上保证服务器性能均衡 115 | 116 | 实现方式: 117 | - HTTP重定向负载均衡 118 | - 反向代理服务器 119 | - DNS域名解析: 设置多个A记录 120 | - IP负载均衡: LVS-NAT 121 | - 数据链路层负载均衡: 修改MAC 122 | 123 | ## 四层负载均衡与七层负载均衡? 二层负载均衡? 三层负载均衡? 124 | - 四层负载均衡: 传输层负载均衡, 根据报文中的目的地之和端口选择内部服务器, 仅建立一次TCP连接 125 | - 七层负载均衡: 应用层的负载均衡, 需要简历两次TCP连接, 负载均衡服务器接收请求后修改目的地址发送给真正处理应用的服务器, 处理完之后发给负载均衡服务器, 负载均衡服务器接收处理完的数据并修改发送地址然后将响应发送给用户; 需要建立两次TCP连接; 是网络更加智能化 126 | 127 | ## LVS? LVS-NAT? LVS-DR? LVS-Tun? Lvs-FULLNAT? 128 | 分为Director Server, Real Server 129 | - lvs-nat:修改目的IP, 连接两次TCP连接 130 | - LVS-DR: 修改目的Mac 131 | 132 | ## Nginx与LVS比较? 133 | - Nginx相当于代理服务器在应用层进行处理 134 | - LVS在传输层和链路层进行处理 135 | 136 | ## 正向代理和反向代理? 137 | - 正向代理: 用户自己选择代理服务器 138 | - 反向代理: 应用机房附近的服务器 139 | 140 | ## Nginx负载均衡策略? 141 | - 轮询: 性能差别不大的服务器 142 | - 随机: 性能不一的服务器 143 | - 随机轮询: 初始服务器随机, 然后按照轮询的方式选择服务器 144 | - 哈希ip: 根据用户请求转发到相应服务器, 为保证可用性可以采用一致性哈希 145 | - 权重轮询: Nginx默认轮询算法, 根据服务器性能给予权重 146 | 147 | ## 网站攻击方式? 148 | - SQL注入 149 | - 路径遍历 150 | - 错误页面展示 151 | - 文件上传 152 | - XSS 153 | - CRSF 154 | - 页面代码 155 | 156 | ## 如何实现服务限流(有哪些限流策略)? 157 | 前端与服务端, 前端限流较难可以通过nginx对ip, 用户名等进行分配; 服务端如Hystrix, 以及数据库(红线, 力保数据库) 158 | 常用算法: 漏桶算法与令牌算法 159 | 具体实现: 160 | 1. Java限流工具RateLimiter 161 | 2. 使用Java的阻塞队列DelayQueue 162 | 3. 使用Redis, 使用计数器与计时器.计时器内计数器不超过指定数量即可, 否则阻塞或拒绝 163 | 164 | ## 分布式事务解决方案? 165 | - 全局id 166 | - 数据库悲观锁 167 | 168 | ## 如何实现单点登录? 169 | - cookie 170 | - 独立系统 171 | - 页面重定向 172 | 173 | --- 174 | ## 什么是zookeeper? 原理? session, ZNode, 版本, 顺序访问 175 | 一个分布式协同服务, 注册与发现, 分布式锁, 负载均衡 176 | 177 | ## 什么是Dubbo? 框架图? 有哪些节点角色? 178 | 阿里巴巴分布式框架 179 | 180 | 角色 181 | - container 182 | - provider 183 | - consumer 184 | - register 185 | - monitor 186 | 187 | ## kafka? 188 | 消息中间件 189 | 190 | ## Hbase? 191 | 列式存储 192 | 193 | ## springCloud与Dubbo区别? 194 | 前者有一系列的模块, 使用REST方式通信 195 | 196 | 后者使用RPC进行通信, 功能少, 需要自己扩展 197 | 198 | ## springCloud基本功能? 199 | - Euraka: 服务注册发现 200 | - Ribbon: 负载均衡 201 | - Hystrix: 熔断 202 | - Feign:声明式调用方法 203 | - config: 分布式配置 204 | - zuul: 网关服务 205 | - zipkin: 链路跟踪 206 | 207 | ## Eureka? 可以被什么替代? 与zookeeper比较? 还有哪些注册服务? zookeeper可以实现负载均衡嘛? 208 | 可以被zookeeper或consul替代 209 | 210 | - Euraka使用AP理论 211 | - Zookeeper使用CP理论 212 | 213 | zookeeper可以实现负载均衡 214 | 215 | ## Ribbon负载策略? 216 | 轮询, 权重, 随机Ip, 空闲 217 | 218 | ## Hystrix容错实现方式? 熔断、资源隔离、降级. 限流? 219 | - 资源隔离 220 | - 熔断: 熔断机制, 一定时间内超过一定比例请求失效后会变为开路状态, 5s中过后变为半开状态进行请求, 请求成功变为闭路, 请求失败变为开路状态 221 | - 限流: 防止请求过大 222 | 223 | ## Alibaba Sentinel 熔断降级方式? 224 | - 请求并发 225 | - 请求响应时间 226 | 227 | ## Feign? 228 | 声明式调用 229 | 230 | ## 网关服务? 什么是网关? 231 | 网关服务也是一个服务器, 用作路由, 过滤, 协议转换 232 | 233 | 网关: 网间连接器, 可以进行协议转换 234 | 235 | ## 配置中心? SpringCloud Bus? 236 | springcloud config分布式配置中心, 加上bus之后刷新服务器就可以动态更改配置 237 | 238 | - 配置原理: 配置服务中心从远端GIT拉取配置文件, 并在本地Git一份, configClient从configServer获取自己对应的配置文件 239 | 240 | - 当远端仓库Git配置文件发生改变, configServer是如何通知configClient的? 241 | Springcloud Bus会向外提供一个http借口`/bus/refresh`, 将这个接口配置到远程git的webhook上, 当git内容发生改变时会调用这个接口, Bus就会通知configServer, configServer会发布更新消息到消息总线的消息队列中, 其它服务订阅到该消息就会进行刷新, 从而实现整个微服务进行自动刷新 242 | 243 | ## zipkin? + 244 | 分布式节点服务想zipkin服务注册, 然后将自身调用数据发送给服务器, 服务器根据调用生成依赖 245 | 246 | ## 微服务设计准则? 247 | - AKF: 集群, 分布式, 区域 248 | - 无状态服务 249 | - 无状态通信 250 | - 前后端分离 251 | 252 | ## 如何保证幂等性? 253 | - 代码可重用 254 | - token机制 255 | - 唯一索引 256 | - 悲观锁 257 | - 乐观锁 258 | - 分布式锁 259 | 260 | ## RabbitMQ? 261 | 消息中间件 262 | 263 | ## 为什么使用RabbitMQ? 如何保证消息正确发送? 如何保证消息接收方消费了消息? 如何避免消费重复投递或重复消费? 基于什么传输? 消息如何分发? 如何保证消息可靠传输? 如何保证消息顺序性? 264 | - 异步, 销峰, 解耦 265 | - 通过确认机制保证消息发送 266 | - 信道确认 267 | - 全局唯一id 268 | - 基于信道传输 269 | - 轮询方式发送 270 | - 三个地方保证消息可靠传输 271 | 发送发: 通过确认机制 272 | 发送过程: 持久化 273 | 接收方: 不自动确认 274 | - 通过对消息进行编号 275 | 276 | ## 使用消息队列的好处? 使用消息队列会带来什么问题? 277 | 好处: 异步, 销峰, 解耦 278 | 坏处: 增加系统复杂度; 系统可用性降低; 一致性问题 -------------------------------------------------------------------------------- /src/9-算法.md: -------------------------------------------------------------------------------- 1 | > ## 算法 2 | 3 | ## 算法定义? 4 | ## 你了解大O吗? 你能给出不同数据结构的例子吗? 5 | ## 如何权衡使用有序数组还是无序数组? 6 | ## 五大基础算法? 7 | ## 红黑树? 8 | ## BitMap如何实现? 有哪些应用? 什么是布隆过滤? 9 | ## RSA算法? 10 | ## 动态规划的三个概念? 11 | ## 什么是前缀树? 应用? 12 | ## 对称加密和非对称加密? 13 | ## 各种排序算法时间复杂度与空间复杂度比较? 冒泡、交换、选择、插入、基数、希尔、快排、归并、堆 14 | 排序方法-时间复杂度-最差时间-稳定性-额外空间 15 | - 冒泡-O(N^2)-O(N^2)-稳定-O(1) 16 | - 交换-O(N^2)-O(N^2)-不稳定-O(1) 17 | - 选择-O(N^2)-O(N^2)-不稳定-O(1) 18 | - 插入-O(N^2)-O(N^2)-稳定-O(1) 19 | - 基数-O(N)-O(N)-稳定-O(N) 20 | - 希尔-O(NlogN)-O(N^2)-不稳定-O(1) 21 | - 快排-O(NlogN)-O(N^2)-不稳定-O(logN)[最差O(N)] 22 | - 归并-O(NlogN)-O(NlogN)-稳定-O(N) 23 | - 堆-O(NlogN)-O(NlogN)-不稳定-O(1) 24 | 25 | ## 二叉树中两个节点的公共祖先? 26 | 27 | ## 从100亿条记录中找出重复数最多的前10条? 28 | - 每条记录按hash分到不同的小文件 29 | - 对每个小文件统计重复数最多的前10条 30 | - 合并统计结果并返回最终结果 31 | 32 | ## 一个文本行, 大约有一万行, 每行一个单词, 要统计最频繁的前10个? 33 | 先统计单词重复数, 然后使用最大堆算法 34 | 35 | ## 100万个数中找出最大的100个数? 36 | 使用快排或最大堆算法 37 | 38 | ## 动态规划与贪心算法的区别 39 | 40 | -------------------------------------------------------------------------------- /src/简历.md: -------------------------------------------------------------------------------- 1 | ## 项目经历 2 | ### 2019.05 - 2019.06 基于微服务的文章发布系统Java开发 3 | 1. 实现业务拆分将整个应用拆分为应用层,服务层,数据层 4 | 2. 使用Redis实现单点登录 5 | 3. 客服端负载均衡、网关服务、容错保护、分布式配置管理、服务链路追踪、断路器监控 6 | 7 | ### 2019.04 - 2019.05 基于SSM的文章管理Java开发 8 | 1. 使用Pjax局部刷新 9 | 2. 前端使用模板减少代码重写 10 | 3. 使用Solr实现搜索功能 11 | 12 | ### 2018.12 - 2019.07 Kaggle-Bone Age深度学习图像处理 13 | 1. 通过数据可视化对数据进行筛选清理 14 | 2. 特征工程处理,对图像进行增强处理 15 | 3. 使用网格搜索策略对单个模型选择最优参数 16 | 4. 通过stacking组合单个训练模型,并选用softmax作为融合层模型 17 | 5. 实现数据清洗,特征工程处理,模型训练,图像预测自动化 18 | 19 | ### 2018.10 - 2018.12 博客管理系统后台开发 20 | 1. 基于Django实现项目自动化部署 21 | 2. 邮箱推送评论与文章 22 | 3. 利用ECharts实现用户活跃信息可视化 23 | 4. 网站参数化配置、MySQL数据备份管理、简洁网盘 24 | 25 | ### 2018.10 - 2019.02 手骨分割[J].匿名处理 26 | 1. 通过数据可视化对数据进行筛选清理 27 | 2. 特征工程处理,对图像进行增强处理 28 | 3. 基于机器学习将图像分割阈值预测问题转变为分类问题 29 | 4. 实现预测模型持久化 30 | 5. 使用多线程加快分割速度。 31 | 32 | ### 2018.04 - 2018.05堡垒机运维 33 | 1. 实现项目在Linux上自动化部署 34 | 2. 实现网页版SSH连接以及跳板机功能 35 | 3. 通过日志记录用户对服务器操作,实现责任划分 36 | 4. 过滤用户敏感操作 37 | 38 | ### 2018.01 - 2018.04博客管理系统后台开发 39 | 1. 基于ThinkPHP,分为前台展示和后台管理系统 40 | 2. 前后台都使用Pjax技术实现局部刷新以减少资源加载 41 | 3. 系统拥有文章发布、管理、用户活跃信息可视化、用户管理、网站参数化配置、数据备份等功能 42 | 43 | ## IT技能 44 | 1. 全国计算机等级考试C语言二级 45 | 2. 熟悉基本的数据结构及算法,熟悉计算机网络知识,熟悉常用的设计模式如单例模式、工厂模式等 46 | 3. 熟悉Java编程,熟悉常用的Java API包括集合框架、多线程,熟悉JVM虚拟机基本原理,了解Java虚拟机内存的划分,了解GC算法 47 | 4. 熟悉网站开发及部署流程、SSM、SpringBoot、SpringCloud、微服务架构 48 | 5. 熟悉HTML、CSS、BootStrap、Layui、Zui、JavaScript、Ajax、Pjax、JSP、Thymeleaf 49 | 6. 熟悉MySQL、Redis、MyBatis、Linux操作、ThinkPHP网站开发 50 | 7. 熟悉Python编程、Django、TensorFlow;熟悉机器学习、图像处理、C++图像编程 -------------------------------------------------------------------------------- /src/自我介绍.txt: -------------------------------------------------------------------------------- 1 | 面试官您好, 我是xx.我十分热爱编程, 在高中时期就已经接触到了编程.在现在, 我比较熟悉 2 | 网站制作, Java编程, Python编程, Mysql等.也做了不少的项目, 比如使用thinkPHP框架实现一 3 | 个博客管理系统, 该系统分为前台和后台, 后台包括文章、用户、网站配置管理等功能; 前台与CSDN 4 | 类似.并且整个系统使用pjax减少资源加载. 5 | 6 | 由于网站部署在Linux上, 我学习了linux相关操作与python脚本语言.并且了解了运维与跳板机, 7 | 由于对技术比较着迷, 所以阅读了跳板机的一个项目jumpserver, 了解了项目在linux自动部署的 8 | 流程并且自己做了轻量的运维平台. 9 | 10 | 我还做了基于Java SSM框架的论坛, 实现了基本功能并使用solr技术加快检索速度.随着学习的深入, 11 | 基于微服务springcloud将之前SSM实现的论坛进行重新架构将整个业务拆分为三个部分, 分别为 12 | 应用层, 服务层, 数据层.其中应用层实现业务逻辑处理用户请求.服务层分为文章服务、评论服务、 13 | 用户服务.其中文章服务提供文章的查询与添加接口; 评论服务提供评论的查询与添加等操作接口; 14 | 用户服务提供用户注册、 登录、token验证等接口. 数据层使用MySQL和redis, 并使用RabbitMQ 15 | 作为分布式配置的消息中间件.整个服务使用zuul实现网关, 负责接收用户请求并转发请求到相应 16 | 服务器; 使用Eureka作为服务的发现与注册中心; 使用Feign实现服务间的调用与负载; 使用Hystrix 17 | 实现服务的容错与限流; 并且利用消息总线与分布式配置中心提供动态配置服务; 还有其余一些辅 18 | 助功能比如, Hystrix面板, zipkin服务调用链路查看等功能.做完这个项目之后对微服务的实现 19 | 有了更深的理解, 也了解到为服务之间提供高效可靠并且安全的调用管理, 提供健壮的容错机制才 20 | 是微服务实现最重要的地方. 21 | 22 | 我还比较熟悉图像处理以及机器学习, 并帮同学做了三个图像处理机器学习相关项目, 熟悉Python 23 | 脚本编写与c++图像编程.随着项目深入也在编写代码过程中也考虑的更多, 包括代码架构, 日志记录, 24 | 计算结果持久化, 代码可重用性, 多线程的使用等. 25 | 26 | 【没用】 27 | ------------------------------------------- 28 | 我叫yauno, 现在就读于xx, 十分热爱计算机编程, 在高中就已经开始接触编程. 现在 29 | 熟悉网站制作, 计算机网络知识, 熟悉Java编程, Python编程, MySQL等. 在研究生期间也做 30 | 几个项目, 比如堡垒机, 实现了一个轻量的运维平台; 在Linux端自动化部署的博客系统; 31 | 使用SSM框架编写的论坛以及基于微服务的文章发布系统(介绍具体内容).我还比较熟悉图像处理以 32 | 及机器学习, 并帮同学做了三个图像处理机器学习相关项目, 熟悉Python脚本编写与c++图像编程. 33 | 34 | 我对软件开发有很强的兴趣, 乐于接受新的知识, 对新技术有求知欲. 而且每当我完成一个功能后, 35 | 都会有十分强的成就感, 很享受编写代码的过程. 36 | 37 | 【没用】 38 | ------------------------------------------- 39 | Hi, my name is xx.I love programming very much. Now, I'm familiar with 40 | Website Developement, Java programming, Python programming, Mysql and so on. 41 | I have also done a lot of projects, such as blog management system using the 42 | thinkPHP framework, the system is divided into the foreground part 43 | and the background part, background part including articles, users, website 44 | configuration management and other functions;The function of foreground is similar 45 | to CSDN. The whole system use pjax to reduce resource loading. 46 | 47 | I also did a project about BBS based on Java SSM framework, i implemented the 48 | basic functions and used solr technology to speed up search velocity. And i 49 | also do a project based on micro-service, i recontruct BBS project into three 50 | parts, namely application layer, service layer, data layer. The application 51 | layer implements business logic to handle user requests. The service layer is 52 | divided into article service, comment service,and user services. Article service 53 | provides article query and add operation interface; Comment service provides 54 | comment query and add operation interface. User services provide user registration, 55 | login, token authentication /ɔː,θentɪ'keɪʃən/ operation interface. The data 56 | layer use MySQL and Redis. The entire service use zuul to implement the 57 | gateway server, which is responsible for receiving user requests and forwarding 58 | them to the appropriate /əˈprəʊprɪeɪt/ server; I also use Eureka as the center 59 | of discovery and registry services; Use Feign to implement method call. Using 60 | Hystrix to implement fault-tolerant mechanism and flow limitation of service; 61 | It also provides dynamic configuration service by using message bus and distributed 62 | configuration center. 63 | 64 | I am also familiar with image processing and machine learning, and I helped my 65 | classmates complete three image processing machine learning related projects, and 66 | I am familiar with Python Scripting and c++ image programming. While i implement 67 | the project, i consider more about software architecture, logging, result persistance, 68 | code reusability, multithreading and so on. 69 | 【没用】 -------------------------------------------------------------------------------- /src/面经.md: -------------------------------------------------------------------------------- 1 | > 盒马, 中兴, 阿里测开, 腾讯, 浦发, 多益, 猿辅导, 微策略, 联影, 极米, 跟谁学, 商汤, 有赞, 小米, 农行, BIGO, 华为 2 | 3 | ## 盒马生鲜提前批一面 时间为7月20多号 【凉】 4 | 人生第一次工作面试, 没在状态... 5 | - 单点登录 6 | - HTTP状态 7 | - 负载均衡分类 8 | - 熔断保护 9 | - java基本数据类型/具体 10 | - String属于什么类型 11 | - goto 12 | - 重写equals为什么要重写hashcode 13 | - TCP三次连接 14 | - 七层网络四层网络 15 | - IP,TCP属于哪个层 16 | - HTTP属于哪一层 17 | - hashmap和hashtable 18 | - 什么是线程安全 19 | - volatile 20 | - 什么是可见性 21 | - synchronized和lock区别 22 | - 栈和堆的区别 23 | - 垃圾回收算法 24 | - CMS 25 | - spring特点 26 | - 设计模式 27 | - 数据库事务隔离 28 | - ACID 29 | - 你有什么问题 30 | --------------------------- 31 | 32 | ## 中兴提前批-2019/7/31 100min 33 | - 项目介绍 34 | - 项目问题: 分布式, 单点登录实现过程, 网关服务, 负载均衡, 有哪些负载均衡策略, zipkin如何实现, 熔断如何实现, 熔断机制 35 | - 多线程有哪些实现方式, FutureTask有哪些特性 36 | - 进程和线程的区别, 协程 37 | - python协程如何实现 38 | - 造成死锁的原因, 如何解决 39 | - ==和equals比较 40 | - Linux有哪些内存 41 | - top指令介绍, 查看网络端口指令 42 | - 用过哪些前端工具, css干什么的 43 | - 什么是ajax 44 | - 事务有哪些, 具体一点, Redis事务有回滚吗 45 | - 矩阵翻转 46 | - 数组和链表的区别 47 | - 双向链表删除节点手写代码, 并发情况下如何考虑 48 | - JAVA与C++区别 49 | 50 | ## 综合面: 51 | - 自我介绍 52 | - 对中兴的理解 53 | - 个人优缺点 54 | - 对加班的看法 55 | - 工作地点 56 | - 如何选择工作的公司 57 | - 薪资如何 58 | - 你有什么问题 59 | 60 | ## offer洽谈-2019/9/1 61 | 分两部分 62 | - 对薪酬及岗位介绍 63 | - 单独面谈offer, 问一些基本情况, 面试官填一些内容向上申请月薪, 确认后自己问了一些问题 64 | 65 | -------------------------------- 66 | 67 | ## 阿里巴巴-质量测评软件开发-2019/7/31 35min 68 | ## 一面 69 | - 自我介绍 70 | - 项目介绍, 单点登录, 链路跟踪 71 | - Linux查看系统进程, 查看网络接口, 查看内存, load三个指标 72 | - spring中IOC/DI, AOP如何实现 73 | - RabbitMQ 74 | - Redis 75 | - 多路复用, Reactor事件分发器 76 | - 数据库如何查询大数据 77 | - 数据库建立索引有哪些注意的地方 78 | - 数据库索引有哪些 79 | - 左连接和右连接的区别 80 | - 数据序列化 81 | - Java中HashMap与HashTable区别 82 | - Java中HashMap底层数据结构 83 | - Java中volatile有什么用, 能保证原子性吗 84 | - 有哪些排序算法, 堆的时间复杂度 85 | - 跨域 86 | - 微信发红包如何测试 87 | - 100亿数据获取第K个大的值 88 | - 你有什么问题 89 | 90 | ## 二面-2019/8/5 40min 91 | - 自我介绍 92 | - 项目 93 | - 能不能来不来实习 94 | - 请求过多如何解决 95 | - 单点登录如何存储token, 每个地方都存储嘛 96 | - 在线编程题 97 | - 你有什么问题 98 | 99 | ## 三面-2019/8/13 56min 100 | - 自我介绍 101 | - 项目介绍 102 | - SSH如何保持连接, 连接过程 103 | - 你对分布式看法 104 | - 注册服务, zookeeper能否实现负载均衡 105 | - 如何实现容错 106 | - 链路跟踪怎么做 107 | - 单点登录怎么做的? 为什么想到会这么做? 多个请求会出现什么 108 | - springcloud与springboot的区别 109 | - ArrayList与LinkedList区别? 多线程安全吗? 如何实现多线程安全? 110 | - 类加载机制, 如何打破该机制 111 | - 什么是ORM 112 | - 冒泡排序过程? 比较多少次? 113 | - 项目中神经网络模型用了哪些? 数据可视化怎么做? 114 | - 你有什么问题 115 | 116 | ## 四面-2019-8-20 39min 117 | - 没有自我介绍 118 | - 能不能来实习 119 | - 哪些项目你认为做的很好, 推销一下 120 | - 淘宝生成订单向支付宝发送, 支付宝处理订单后返回凭证.这一过程如何设计系统架构? (面试的是测试岗位...) 121 | - 接着上一个问题, 消息传输过程中会有哪些问题 122 | - 有没有发表论文 123 | - 你有什么问题 124 | - 你喜欢那个方向? 你觉得你能行吗? 125 | 126 | ## 五面-2019/8/28 55min 127 | 实际上是第三面, 前面四面只记录了两面 128 | - 你认为做的最好的项目 129 | - 微服务的优点缺点 130 | - 为什么能保证高性能 131 | - 服务注册时上传了一些什么内容 132 | - 方法调用时获得的什么内容 133 | - 如何实现负载均衡 134 | - 为什么采用轮询的方式进行负载均衡 135 | - 负载均衡提升了什么 136 | - 如何实现网关服务, 网关服务的路由与负载均衡的区别 137 | - 容错保护机制 138 | - 如何判断什么时候进行降级服务 139 | - 如何进行降级服务 140 | - 如果不考虑降级会怎么 141 | - 如果不考虑容错保护而在应用层考虑失败会怎么样 142 | - 限流机制 143 | - 什么是超时 144 | - 项目过程中难点是什么, 是怎么解决 145 | - 你做的项目之间有什么关联 146 | - 项目压缩的话实际做多久 147 | - 机器学习项目 148 | - 你有什么问题 149 | 150 | ## 实习OC 2019/9/29 151 | - 打电话问去不去实习 152 | 153 | -------------------------------- 154 | 155 | ## 腾讯-后台开发-2019/8/6 55min 【问我几次C++都说不怎么会-凉】 156 | - 自我介绍 157 | - 上课学习了哪些内容 158 | - c++中class, struct, union 159 | - c++中&和*区别 160 | - TCP与UDP的区别, 场景, TCP如何实现可靠传输 161 | - TCP粘包现象, TCP分别传输10字节, 20字节, 30字节能够一下接收到60字节码 162 | - TCP三次握手, 四次挥手, 具体状态, 为什么要2MSL 163 | - 多线程与多进程区别 164 | - 多线程与多进程之间的通信 165 | - 输入网址到获得页面过程, 用了哪些网络协议 166 | - 如何获得域名 167 | - DNS用的什么端口, 协议, 使用UDP吗 168 | - 什么是ARP 169 | - HTTP与HTTPS区别, HTTPS端口一定是443吗 170 | - Redis使用介绍(回答完后没有反应, 继续介绍底层数据结构, 持久化, 缓存策略, 淘汰策略) 171 | - 什么是二范式, 具体例子 172 | - MySQL中MySIM与InnoDB结构, 聚集索引与非聚集索引区别 173 | - 事物四种隔离级别, MySIM与InnoDB分别是什么(emmm, InnoDB不支持事物) 174 | - MySIM与InnoDB区别 175 | - left join 过程 176 | - 快排 177 | 178 | -------------------------------- 179 | 180 | ## 浦发-系统开发-2019/8/23 20min面试+50min笔试 181 | 成都地区2000人左右面试...... 182 | 问成绩 183 | 184 | 针对项目问: 185 | - 微服务实现怎样的功能 186 | - 如何实现负载均衡 187 | - 如何实现网关服务 188 | - 事务一致性问题 189 | - ... 190 | 191 | 基础知识: 192 | - 有哪些设计模式 193 | - Spring中有哪些设计模式 194 | - SpringCloud和SpringBoot的区别 195 | - 路由器属于七层模型中的什么层 196 | - 快排 197 | - 如何快速查找指定文件名, 文件内容 198 | - Java的HashMap遍历方式 199 | - MySQL端口号 200 | - 主键外键 201 | - 行转列 202 | 203 | - 总结: 面试较轻松 204 | 205 | ## 体检 成都 2019/9/22 206 | 207 | ## 录用通知 2019/10/15 208 | - 邮箱通知11月30日截止去签三方 209 | 210 | -------------------------------- 211 | 212 | ## 多益网-游戏开发(投的后台开发) 26min 213 | - 项目介绍 214 | - 平时玩不玩游戏 215 | - 地图导航算法... 216 | - 函数指针 217 | - C指针 218 | - C中定义与声明区别 219 | - python引用计数对象如何实现(???) 220 | - 线程与进程区别 221 | - 在线笔试: 数组往右移动K位 222 | 223 | ## offer 2019/9/2 224 | - 13k, 广州 225 | 226 | - 总结: 很缺人, 但是工资太低 227 | -------------------------------- 228 | 229 | ## 猿辅导-后端服务 230 | ## 一面 2019/8/23 50min 231 | - 项目实现哪些功能, 问项目细节 232 | - 线程安全 233 | - 多线程synchronized锁住类方法是锁住的什么? 234 | - 线程池有哪些 235 | - 线程与进程区别 236 | - Java内存模式(忘记问的是JVM内存模型还是JMM了, 可能回答错了) 237 | - SpringBoot中如何写starter 238 | - MySQL索引有哪些 239 | - 聚集索引与非聚集索引的区别 240 | 在线笔试: 241 | - 删除链表倒数第k个节点(双指针) 242 | - 判断树是否为完全二叉树 243 | 244 | ## 二面 2019/8/30 56min 245 | - 项目介绍 246 | - 如何实现服务发现 247 | - 如何实现负载均衡 248 | - 如何实现路由配置 249 | - 服务之间如何通讯 250 | - 服务如何调用 251 | - 序列化是如何实现 252 | - final修饰符的作用 253 | - Redis数据结构 254 | - Redis中的字典与Java中HashMap字典区别 255 | - HashMap为什么不是线程安全(安全失败与快速失败) 256 | - 了解hashCode和equals吗 257 | - TCP与UDP的区别 258 | - 常用的单例模式, 细讲几个 259 | - 手写单例模式(双重校验锁), 为什么要加volatile, synchornized锁住的是什么 260 | - 环形链表实现队列, 删除后需要保存原队列, 这样就不用频繁地进行创建[代码](../../LeetCode/otherQuestion/猿辅导/面试/Q2.py) 261 | 262 | ## 三面 2019/9/3 60min 现场面 263 | - 问项目 264 | - 两个线程一个打印奇数一个打印偶数 【凉】 265 | - 有序链表合并 266 | - 猿辅导最近一个笔试第二题, 3个人一个组合, 输出有几个组合 267 | - 二分法求一个数的平方根 268 | 269 | - 总结: 面试体验很好, 菜是原罪 270 | -------------------------------- 271 | 272 | ## 微策略-后端开发 273 | ## 一面-2019/8/27 60min 【英文凉】 274 | - 没有自我介绍, 没有项目提问 275 | - 你在之前的工作中有哪些地方你觉得可以提升的 276 | - 你认为计算机中什么技术最重要 277 | - 如果有多个任务需要去做, 你怎么安排任务 278 | - [两道编程题](https://github.com/YangXiaoo/Lookoop/tree/master/LeetCode/otherQuestion/MSTR/interview) 279 | 1. 链表翻转 280 | 2. 位操作: 281 | - We have an integer array where all the elements appear twice while only 1 element appears once. Please find that element. 282 | - We have an integer array where all the elements appear twice while only 2 elements appears once. Please find the 2 elements. 283 | 284 | - 总结: 英文问题, 菜是原罪 285 | -------------------------------- 286 | 287 | ## 联影-AI软件开发-成都 288 | ## 简历面-2019/8/29 13min 289 | - 哪个项目做的好 290 | - goto是关键字吗 291 | - char能够表示中文字符吗 292 | - 多线程同步有哪些方式 293 | - sleep和yield的区别 294 | - try-catch-finally执行 295 | - 常用的设计模式 296 | - 垃圾回收算法有哪些 297 | - 线程池用过吗 298 | - MySQL索引 299 | - MySQL中自增主键, 删除数据重启后插入数据的主键值 300 | - MySQL中的heap表 301 | - MySQl中怎么区分float与double 302 | - MySQL中varchar与char区别 303 | 304 | ## 一面 2019/9/7 30min 305 | - 项目介绍 306 | - TCP与UDP的区别 307 | - 三次握手过程, 为什么要三次握手 308 | - 多态 309 | - 为什么要用多态 310 | - 梯度斜率 311 | - 设计模式的开闭原则 312 | - djikstr最短路径 313 | - 一些其他问题 314 | 315 | ## HR面 2019/9/8 20min 316 | - 自我介绍 317 | - 择业标准 318 | - 了解联影吗 319 | - 自我评价 320 | - 性格上优缺点 321 | - 有哪些offer 322 | 323 | ## OC 2019/9/30 324 | - 邮箱发放录用offer 325 | 326 | ## MC 2019/10/11 327 | - 拒 328 | 329 | -------------------------------- 330 | ## 极米-Java软件开发-成都 【凉】 331 | ## 一面-2019/9/2 20min 332 | - 自我介绍 333 | - 什么是微服务 334 | - 微服务优缺点 335 | - 注册发现如何实现 336 | - TCP三次握手四次握手 337 | - TCP连接中, 如果客户端挂掉之前没有关闭连接, 会怎么样 338 | - 乐观锁与悲观锁 339 | - 一个对象有两个方法被synchronized修饰, 可以同时调用两个方法吗 340 | - 快排 341 | - 二叉排序 342 | 343 | -总结: TCP挂掉的问题按照网上来回答的但应该不是面试官想要的; 倒数第三个问题栽了, 答案是不可以, 因为synchronized锁住对象或类, 所以不允许同时调用一个对象的两个synchronized方法 344 | 345 | -------------------------------- 346 | ## 跟谁学 347 | ## 一面 2019/9/3 70min 348 | - 自我介绍 349 | - 写代码: 树定义 350 | - 写代码: 从左到右打印树的叶子节点 351 | - 写代码: 打印树最左边节点同一层的节点 352 | - 链表和数组的区别 353 | - 为什么数组可以直接定位到索引 354 | - Java中有哪些数组与链表类 355 | - ArrayList如何插入一个元素, 底层实现 356 | - 实现一个线程池需要注意一些什么 357 | - 用过servlet吗, servlet是单例模式吗 358 | - 单例模式是什么 359 | - 写代码: 写单例模式; 为什么要判断两次, 为什么要用volatile 360 | - 写代码: 实现一个线程安全方法; synchronized锁住的是什么 361 | - TCP/IP区别, TCP/IP的首部结构, TCP大还是IP大 362 | - 写代码: left join查询, 举例说明 363 | - 数据库查询过程 364 | - 一条更新语句需要开启事务吗, 为什么 365 | - 什么是幻读 366 | - 什么是间隙锁, 什么时候上间隙锁 367 | - 什么是B+树, 为什么不用二叉树 368 | - 为什么Windows上的程序不能在Linux上使用 369 | - 计算费CPU还是I/O费CPU 370 | - CPU计算中加法快还是乘法快 371 | - Session复制如何实现, 如何实现持久化 372 | - 项目调用失败如何排查 373 | 374 | - 总结: 问的挺难的 375 | 376 | 377 | ## 二面 2019/9/9 44min 378 | - 写代码: 链表排序, 只能使用辅助接点 379 | - 内部类与匿名类在使用上有什么区别 380 | - HTTP与HTTPS的区别 381 | - 自我优点与评价 382 | - 学习了哪些书籍 383 | - 能不能来实习 384 | - 薪资预期是多少 385 | - 其他问题忘了 386 | 387 | 总结: 谈薪资 388 | 389 | ## 2019/9/27 390 | - 微信拒Offer 391 | 392 | -------------------------------- 393 | ## 商汤科技 【凉】 394 | ## 一面 2019/9/6 38min 395 | - 如何实现负载均衡 396 | - 负载均衡有哪些策略 397 | - 如何设计权重轮询 398 | - 如何熔断处理 399 | - 服务注册, Eurake与zookeeper的区别, RPC与REST的区别 400 | - 网关服务 401 | - 网关服务与nginx的区别 402 | - OOP思想分析抽象与接口 403 | - concurrentHashMap与HashMap的区别 404 | - 如何实现线程安全 405 | - synchronized与volatile的区别 406 | - 乐观锁与悲观锁的区别 407 | - 库存扣减问题 408 | 409 | ## 二面 2019/9/6 22min 410 | - 什么时候学习Java的, 为什么学习运维, 学多久的Python 411 | - SSM框架中如何实现用户登录, 从底层到实现 412 | - Cookie与Session的区别 413 | - 如何获取用户输入 414 | - 如何区分post与get 415 | - 如何区分返回的是Josn还是HTML 416 | - 如何获取`user/1`中的id 417 | - Redis怎么使用的 418 | - 多线程下Redis安全吗 419 | 420 | 总结: 有些问题很基础, 也很刁钻, 从这个面试看到了自己许多薄弱点 421 | 422 | -------------------------------- 423 | ## 有赞 【凉】 424 | ## 一面 2019/9/7 30min 425 | - 自我介绍 426 | - hashmap底层结构, 红黑树什么时候退化, 如何扩容 427 | - concurrentHashMap底层结构, 锁的个数是固定的吗 428 | - Java中有什么锁 429 | - 可重入锁是怎么实现可重入的 430 | - AQS怎么实现的, 怎样锁住线程的 431 | - 什么叫双亲委托, 为什么叫双亲委托(???), 自定义classLoader重写什么方法 432 | - JVM内存划分 433 | - 垃圾清除算法 434 | - 老年代与新生代比例 435 | - JMM 436 | - young gc与full gc发生在什么时候 437 | - HTTP中post与get区别, post能够在URL中添加参数嘛 438 | - 设计模式, 模板模式用于什么情况 439 | - OOP设计原则, 开闭原则举例说明 440 | - springboot中的run方法流程(???) 441 | - springcloud用到了哪些模块, springcloud config是怎么实现刷新配置的 442 | 443 | - 之前鸽了面试官 444 | 445 | -------------------------------- 446 | ## 小米 447 | ## 一面 2019/9/9 27min 448 | - 编程题: 链表翻转 449 | - HashMap底层结构, 插入操作, 扩容操作, 为什么要扩充2倍长度 450 | - hash表与二叉树的区别 451 | - static从加载到使用, `static int a = 10;`会直接初始化为10吗 452 | - ArrayList与LinkedList的区别 453 | - ArrayList插入无序数后如何排序 454 | - 讲一讲volatile, 为什么单例模式二重校验锁下实例要声明为volatile 455 | - 讲一讲synchronized, 锁升级, 讲一讲轻量锁与偏向锁, 两个线程在轻量锁下有什么操作 456 | - 讲一讲gc, CMS有哪些步骤 457 | - 项目是自己做的还是跟别人一起合作的 458 | - 如果你和同事对开发意见不一, 你会怎么处理 459 | - 有同事想要把代码写的很完善, 你想把代码写的简单, 如何处理 460 | - 能来实习吗 461 | 462 | ## 二面 2019/9/10 35min 463 | - 自我介绍 464 | - 编程: 使用堆实现队列【思路是对的, 两个堆弄错变量名了, 面试结束才发现....】 465 | - 微服务如何实现负载均衡, 如何判断服务是否为空闲 466 | - Redis有哪些数据结构 467 | - 订阅发布有用过吗 468 | - 哈希一致性当两个节点邻近如何处理 469 | - CAS 470 | - volatile 471 | - JVM, JMM 472 | - 字符串常量池, 多个字段拼接用`+`好还是`StringBuilder.append()`好 473 | 474 | ## 三面 2019/9/13 40min 475 | - 自我介绍 476 | - HashMap底层, 数组长度为什么2的幂次方, 扩容后原数据索引会变吗 477 | - 事物隔离级别以及相应的处理方法 478 | - Linux中某个Java程序内存消耗大, 如何查找 479 | - Hystrix如何实现熔断, 如何实现限流 480 | - 回去耍了一天其余的都忘记了...... 481 | - 编程题: 打印树的第k层节点 482 | 483 | ## Offer Call 2019/9/26 484 | - 10月10号之前确认去或不去 485 | - 已拒 486 | 487 | -------------------------------- 488 | 489 | ## 农行 490 | ## 笔试 2019/8/31 491 | - 图形数字推理, 英语, 专业知识(数据库, 网络, 操作系统, 测试, 算法), 心理测评 492 | 493 | ## 现场面 2019/9/11 494 | 整体流程: 签到->分组->机试->自我介绍->公共题->专业知识 495 | - 机试题: 给定字符串, 字符串包含数组, 求字符串中数字能组成的最大值 496 | - 自我介绍 497 | - 公共问题回答: 微服务设计模式; SpringBoot优点; 系统架构风格有哪些, 优缺点 498 | 499 | 专业问题会根据技术栈来问, 以下为Java专业问题 500 | - Java容器有哪些 501 | - 有哪些Map, HashTable与HashMap区别(问了别人concurrentHashMap与HashTable底层) 502 | - Seesion与Cookie的区别 503 | - Java下用过Redis吗 504 | - RESTFULL风格如何保证安全 505 | - 分布式下Session如何解决 506 | 507 | ## 现场签两方 508 | 509 | ## 体检 2019/9/19 510 | - 成都第三人民医院体检 511 | 512 | ## 三方签订通知 2019/9/24 513 | 514 | ## 签三方 2019/10/8 515 | 516 | -------------------------------- 517 | ## BIGO 518 | ## 一面 2019/9/18 48min 519 | - 如何实现负载均衡, 还有哪些负载均衡方法 520 | - Ribbon如何实现方法调用, 会缓存数据么 521 | - zipkin底层如何实现 522 | - 对ReentrantLock有没有什么了解 523 | - 有哪些线程安全的集合 524 | - 集合下面有哪些类 525 | - TreeSet底层原理 526 | - HashMap底层原理, 扩容机制, 什么时候扩容, 为什么扩充2倍, 线程安全情况 527 | - 有哪些线程安全的字典, concurrentHashMap底层结构, 插入时cas与synnchronized使用场景 528 | - String如何保证不可变 529 | - ==与equals的区别 530 | - 对象创建到回收的过程 531 | - CMS的缺点, 如何防止浮动碎片, 介绍G1算法 532 | - synchronized的优化有哪些 533 | - CAS的缺点有哪些, 超时如何处理 534 | - 还有其它问题, 忘记了 535 | 536 | 接近一周没有复习, 好多东西都忘记了... 537 | 538 | ## 二面 2019/9/23 34min 539 | - 重写和重载的区别 540 | - 泛型能够重载吗 541 | - final和finally使用区别 542 | - try中有return会执行finally吗 543 | - 并发你了解多少, 线程池你用过哪些, 线程池工作原理 544 | - MySQL索引创建需要注意哪些, 索引结构 545 | - 三个字段a、b、c, 在写SQL时有两种使用a、b、c和b、c, 请问如何创建最简索引 546 | - 客户端负载均衡如何实现, 有哪些负载均衡策略 547 | - 分布式配置如何实现 548 | - Linux一些操作, jmap你如何分析 549 | - 代码: 将一颗二叉搜索树变为一个双向链表 550 | - 你有什么问题吗 551 | 552 | ## 三面 2019/9/26 临时拒绝 553 | - 已经决定不去省外了, 面了也不会去, 浪费别人时间, 所以拒绝了 554 | 555 | -------------------------------- 556 | 557 | ## 华为 558 | ## 一面 2019/9/19 40min 559 | - 自我介绍 560 | - 微服务项目详细介绍 561 | - 有哪些集合具体说一下, HashMap与concurrentHashMap区别 562 | - final, finally, finalized区别 563 | - 线程池运行过程 564 | - Python如何远程登录调用Linux上的指令, Python定时执行 565 | - 代码: 给定字符, 给出出现频率最高的前K个字符 566 | - 还有问题我忘记了 567 | 568 | ## 二面 2019/9/19 60min 569 | - 自我介绍 570 | - 微服务如何实现服务注册, zipkin底层原理 571 | - 如何实现路由 572 | - 代码: 使用BFS序列化与反序列化树 573 | - 其余问题忘记 574 | 575 | ## HR面 2019/9/19 30min 576 | - 自我介绍 577 | - 项目讲解 578 | - 优缺点 579 | - 提问 580 | 581 | > 排序录用 582 | 583 | ## 2019/9/27 offer发放 584 | 585 | ## 2019/9/29 586 | - 成都研究所去签三方, 未签 -------------------------------------------------------------------------------- /util/__pycache__/replaceChineseCharacer.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoo/Java-Note/39ae3c1873e5289dd17b59e6f11d040f3148edcc/util/__pycache__/replaceChineseCharacer.cpython-36.pyc -------------------------------------------------------------------------------- /util/__pycache__/replaceChineseCharacer.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoo/Java-Note/39ae3c1873e5289dd17b59e6f11d040f3148edcc/util/__pycache__/replaceChineseCharacer.cpython-37.pyc -------------------------------------------------------------------------------- /util/__pycache__/util.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoo/Java-Note/39ae3c1873e5289dd17b59e6f11d040f3148edcc/util/__pycache__/util.cpython-36.pyc -------------------------------------------------------------------------------- /util/__pycache__/util.cpython-37.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YangXiaoo/Java-Note/39ae3c1873e5289dd17b59e6f11d040f3148edcc/util/__pycache__/util.cpython-37.pyc -------------------------------------------------------------------------------- /util/mergeFiles.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | """ 3 | @Author yangxiao.online 4 | 将多个md文件放到一起 5 | """ 6 | import os 7 | import replaceChineseCharacer as rep 8 | from util import getFiles 9 | 10 | class MergeFileHander(object): 11 | def __init__(self, inputFilePath, outputFilePath=None): 12 | self.inputFileList = self.setInputFileList(inputFilePath) 13 | self.outputFilePath = outputFilePath 14 | self.count = 0 15 | self.outputData = [] # 数据缓存 16 | 17 | def setInputFileList(self, inputFilePath): 18 | """获得待合并文件路径""" 19 | if inputFilePath == None: 20 | assert False, "指定路径不存在" 21 | fileList = [] 22 | if not isinstance(inputFilePath, list): 23 | inputFilePath = [inputFilePath] 24 | 25 | for file in inputFilePath: 26 | if os.path.isdir(file): 27 | fileList.extend(getFiles(file)) 28 | else: 29 | fileList.append(file) 30 | 31 | fileList = self.sortValue(fileList) 32 | 33 | return fileList 34 | 35 | def sortValue(self, data): 36 | """对`1-xx.md`格式文件根据序号进行升序""" 37 | # 排序 38 | tmpDict = {} 39 | for f in data: 40 | try: 41 | tmpDict[int(os.path.basename(f).split('-')[0])] = f 42 | except Exception as e: 43 | print("[error] info:{}".format(e)) 44 | 45 | 46 | tmpList = sorted(tmpDict.items(), key=lambda x : x[0]) 47 | retData = [] 48 | for f in tmpList: 49 | retData.append(f[1]) 50 | 51 | return retData 52 | 53 | def getData(self, filePath): 54 | retData = [] 55 | with open(filePath, encoding="utf-8") as f: 56 | data = f.readlines() 57 | flag = False 58 | for line in data: 59 | if '##' in line.lstrip(): 60 | self.count += 1 61 | if len(line.strip()) > 0 and line.strip()[0] == ">": 62 | retData.append("\n") 63 | if len(line.lstrip()) == 0: 64 | preLine = retData[-1].strip() 65 | if preLine[0] == ">": 66 | retData.append(line) 67 | elif ("##" in line.lstrip() or "---" in line.lstrip()) and not flag: 68 | retData.append(line) 69 | else: 70 | if "```" in line: 71 | retData.append(line) 72 | if flag == False: 73 | flag = True 74 | else: 75 | flag = False 76 | elif flag: 77 | retData.append(line) 78 | return retData 79 | 80 | def merge(self, outputFilePath=None): 81 | if outputFilePath == None and self.outputFilePath == None: 82 | assert False, "保存路径不存在" 83 | if outputFilePath : 84 | self.outputFilePath = outputFilePath 85 | for file in self.inputFileList: 86 | curData = self.getData(file) 87 | curData.append("\n---\n\n") 88 | self.outputData.extend(curData) 89 | with open(self.outputFilePath, "w", encoding="utf-8") as outf: 90 | outf.write("".join(self.outputData)) 91 | 92 | print("[INFO] question count: {}".format(self.count)) 93 | print("[INFO] write successful!") 94 | 95 | 96 | class MergeFile(MergeFileHander): 97 | def __init__(self, inputFilePath, outputFilePath=None): 98 | super(MergeFile, self).__init__(inputFilePath, outputFilePath) 99 | 100 | def addHeader(self, text): 101 | """在头部添加字段""" 102 | self.outputData.append(text) 103 | 104 | if __name__ == '__main__': 105 | inputFilePath = r"C:\Study\github\Java-Note\src" 106 | outputFilePath = r"C:\Study\github\Java-Note\README.md" 107 | headerText = """> 关于Java基础知识,JVM,多线程,计算机网络,数据库,分布式,算法,Java框架,测试,Linux等知识,详细答案见`/src/`目录下的细分内容,里面附有面经\n""" 108 | 109 | mergeTool = MergeFile(inputFilePath, outputFilePath) 110 | mergeTool.addHeader(headerText) 111 | mergeTool.merge() 112 | 113 | re = rep.Exg(outputFilePath) 114 | re.addRegx([",", "?", ":", ";", '(', ')', '”', '。', "##", "> -"], [", ", "? ", ": ", "; ", '(', ')', '"', '.', "-", "> ##"]) 115 | re.write(outputFilePath) 116 | # [INFO] question count: 630 117 | # [INFO] write successful! -------------------------------------------------------------------------------- /util/replaceChineseCharacer.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | """ 3 | 转换文件中的中文格式 4 | """ 5 | import os 6 | from util import getFiles 7 | 8 | class Exg(object): 9 | def __init__(self, oldFilePath, outputFilePath=None, 10 | oldList=None, newList=None): 11 | """初始化 12 | @param oldFilePath 必须填写 13 | """ 14 | self.filePath = oldFilePath 15 | self.outputFilePath = outputFilePath 16 | self.oldList = None 17 | self.newList = None 18 | self.addRegx(oldList, newList) 19 | 20 | 21 | def addRegx(self, oldList=None, newList=None): 22 | """添加规则 23 | 添加列表规则, 需对应: [",", "?", ":"], [", ", "? ", ": "] 24 | or 添加单个规则, 不用列表: addRegx(",", ", ") 25 | @param oldList 待替换的字符串 26 | @param newList 新字符串 27 | 28 | @return None 29 | """ 30 | if oldList == None or newList == None: 31 | return 32 | if not isinstance(oldList, list): # 判断一个即可 33 | oldList = [oldList] 34 | newList = [newList] 35 | 36 | if not self.oldList: # 只用判断一个就行 37 | self.oldList = oldList 38 | self.newList = newList 39 | else: 40 | self.oldList.extend(oldList) 41 | self.newList.extend(newList) 42 | 43 | def write(self, outputFilePath=None): 44 | if self.outputFilePath == None and outputFilePath == None: 45 | assert False, "确定输出路径" 46 | return 47 | 48 | self.outputFilePath = outputFilePath 49 | 50 | newData = [] 51 | with open(self.filePath, encoding="utf-8") as f: 52 | data = f.readlines() 53 | for line in data: 54 | for regxIndex, regx in enumerate(self.newList): 55 | line = line.replace(self.oldList[regxIndex], regx) 56 | newData.append(line) 57 | 58 | newFile = open(self.outputFilePath, "w", encoding="utf-8") 59 | newFile.write("".join(newData)) 60 | newFile.close() 61 | 62 | 63 | def mkfile(filePath, midffix=""): 64 | """创建新文件路径,在文件名的后面,格式前面添加新的字符 65 | @param filePath 原文件路径 66 | @param midffix 文件名添加的字符 67 | 68 | @return 新文件路径 69 | """ 70 | fileDirName = os.path.dirname(filePath) 71 | fileBaseName = os.path.basename(filePath) 72 | filePreffix = fileBaseName.split(".")[0] 73 | fileSuffix = fileBaseName.split(".")[-1] 74 | outputFileName = os.path.join(fileDirName, filePreffix + midffix + "." + fileSuffix) 75 | 76 | return outputFileName 77 | 78 | if __name__ == '__main__': 79 | fileDir = r"C:\Study\github\Java-Note\src" 80 | fileList = getFiles(fileDir, None) 81 | for filePath in fileList: 82 | re = Exg(filePath) 83 | re.addRegx([",", "?", ":", ";", '(', ')', "###", '”', '。'], [", ", "? ", ": ", "; ", '(', ')', "##", '"', '.']) 84 | re.write(filePath) -------------------------------------------------------------------------------- /util/util.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | import os 3 | 4 | def getFiles(dirpath, suffix=["md"]): 5 | """获取指定目录下所有文件完整路径 6 | @param dirpath 目录 7 | @param suffix 文件格式 8 | 9 | @return list 10 | """ 11 | fileList = [] 12 | for root, dirs, files in os.walk(dirpath, topdown=False): 13 | for name in files: 14 | path = os.path.join(root, name) 15 | if suffix == None: 16 | fileList.append(path) 17 | elif name.split(".")[-1] in suffix: 18 | fileList.append(path) 19 | return fileList --------------------------------------------------------------------------------