From 667f850743619314252cbebb107f67ac2661844c Mon Sep 17 00:00:00 2001 From: xiongraorao Date: Fri, 24 Aug 2018 14:37:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/build.gradle | 3 +++ interview/answer.md | 25 +++++++++++++++++++++++++ interview/java/base.md | 27 +++++++++++++++++++++++++++ interview/java/thread.md | 19 +++++++++++++++++++ interview/note.md | 1 + interview/question.md | 2 ++ 6 files changed, 77 insertions(+) diff --git a/code/build.gradle b/code/build.gradle index 7f9d8d38..cd3c6eef 100644 --- a/code/build.gradle +++ b/code/build.gradle @@ -40,6 +40,9 @@ dependencies { // https://mvnrepository.com/artifact/org.apache.hbase/hbase-client compile group: 'org.apache.hbase', name: 'hbase-client', version: '1.2.6' + // https://mvnrepository.com/artifact/mysql/mysql-connector-java + compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.46' + } jar { diff --git a/interview/answer.md b/interview/answer.md index d6977b3c..520c2c7f 100644 --- a/interview/answer.md +++ b/interview/answer.md @@ -10,6 +10,7 @@ - [数据库](#数据库) - [truncate与 delete区别](#truncate与-delete区别) - [B+树索引和哈希索引的区别](#b树索引和哈希索引的区别) + - [mysql 分库分表](#mysql-分库分表) - [Linux](#linux) - [Top 查看系统信息](#top-查看系统信息) - [Linux 内核空间和用户空间](#linux-内核空间和用户空间) @@ -113,6 +114,30 @@ B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差 说白了,等值查询的时候,Hash索引才有用武之地。 +## mysql 分库分表 + +**分表:** +分表策略可以划分为垂直拆分和水平拆分。 + +垂直拆分:把表的字段进行拆分。一方面,减少客户端和数据库之间的网络传输。一方面,单个数据块存放的数据更多,查询的时候就可以减少I/O次数。 + +垂直拆分建议: +1. 将不常用的字段单独拆分到林外一张扩展表。 +2. 将大文本的字段单独拆分到另外一张扩展表。 +3. 将不经常修改的字段放在同一张表中,经常改变的字段放在另一张表中。 +4. 对于需要经常关联查询的字段,建议放在同一张表中。不然联合查询的时候,会给数据库带来额外压力。 + +水平拆分:拆分表的行。 + +水平拆分策略:取模分表,时间维度分表,自定义hash分表等。 + +取模分表和自定义hash分表属于随机分表。时间维度分表属于连续分布表。随机分表可以避免热点问题,读写相对均匀,连续分表有热点问题,但是避免了跨表查询的复杂问题。 + +**分库:** +垂直拆分:按照业务和功能划分数据库 + +水平拆分:两个数据库的表结构一样,划分方法同水平拆分表。 + # Linux ## Top 查看系统信息 diff --git a/interview/java/base.md b/interview/java/base.md index 4774f4b5..11187944 100644 --- a/interview/java/base.md +++ b/interview/java/base.md @@ -12,6 +12,7 @@ - [抽象类和接口](#抽象类和接口) - [java 重写和重载的区别](#java-重写和重载的区别) - [Synchronized 和 volitate区别](#synchronized-和-volitate区别) +- [Synchronized 的内部实现](#synchronized-的内部实现) - [异常](#异常) - [String StringBuffer StringBuilder的区别](#string-stringbuffer-stringbuilder的区别) - [运行速度:](#运行速度) @@ -40,6 +41,9 @@ - [接口默认方法](#接口默认方法) - [socket 编程](#socket-编程) - [Java 集合类的底层实现](#java-集合类的底层实现) +- [.class 和 getclass的区别](#class-和-getclass的区别) + - [加载时机不同](#加载时机不同) + - [静态内部类](#静态内部类) - [参考文档](#参考文档) @@ -379,6 +383,10 @@ java 类可以继承一个抽象类,实现多个接口,都不能被实例化 5) 当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1,n++等。如果某个域的值受到其他域的值的限制,那么volatile也无法工作,如Range类的lower和upper边界,必须遵循lower<=upper的限制。 6) 使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。 +# Synchronized 的内部实现 + +通过javap反编译代码可以看到,对于同步方法,JVM采用**ACC_SYNCHRONIZED**标记符来实现同步。 对于同步代码块。JVM采用**monitorenter、monitorexit**两个指令来实现同步。 + # 异常 Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: Error 和 Exception。其中 Error 用来表示 JVM 无法处理的错误,Exception 分为两种: @@ -909,6 +917,25 @@ private interface DefaulableFactory { [参考文档](https://blog.csdn.net/qq_25868207/article/details/55259978) +# .class 和 getclass的区别 + +最明显的一个区别是,.class 可以直接从类名获取,.getClass() 是一个对象实例的方法。 + +## 加载时机不同 + +Class.forName(),getClass()在运行时加载; + +Class.class是在编译器加载,即.class是静态加载, + +.getClass()是动态加载。 + +## 静态内部类 + +Iterator it = s.iterator();得到的it的真正类型是KeyIterator,是Iterator的子类,按常理来说应该可以执行next()方法,但是值得注意的是,KeyIterator是hashmap的内部类,JAVA给的提示是cannot access a member of class java.util.HashMap$KeyIterator withmodifiers "public" + +从上面的那些例子上也能看出,除内部类外的其他类的应用上.class功能完全等于.getClass()!只是一个是用类直接获得的,一个是用实例获得的。 + + # 参考文档 - [HashMap? ConcurrentHashMap? 相信看完这篇没人能难住你!](https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/) diff --git a/interview/java/thread.md b/interview/java/thread.md index 64a916b1..20c304dc 100644 --- a/interview/java/thread.md +++ b/interview/java/thread.md @@ -39,6 +39,7 @@ - [LinkedList](#linkedlist) - [ArrayDeque](#arraydeque) - [Vector](#vector) +- [线程间通信](#线程间通信) - [参考文档](#参考文档) @@ -1043,6 +1044,24 @@ ArrayDeque: 数组实现的双端队列,默认队列长度为16,队列满了 Vector 是一个线程安全的动态数组,内部采用数组实现,和ArrayList的区别在于,ArrayList的增长速度是50%,而 Vector 的增长速度为100% +# 线程间通信 + +1. 同步方法 + +synchronized或者ReentrantLock + +2. while 轮询 + +3. wait/notify机制 + +4. 管道通信 + +PipedInputStream + +5. 共享内存(共享对象) + +6. volitale、原子类 + # 参考文档 - [java并发编程--Executor框架](https://www.cnblogs.com/MOBIN/p/5436482.html) \ No newline at end of file diff --git a/interview/note.md b/interview/note.md index 11482a43..049e8064 100644 --- a/interview/note.md +++ b/interview/note.md @@ -41,6 +41,7 @@ Java后端开发(大数据、分布式应用等) 华为 |8.1 | 8.21 百度 | 8.22 | 8.22(新投递) | 网易 | 8.22 | 8.22(新投递) | +腾讯 | 8.22 | 8.22(新投递) # 2 复习内容 diff --git a/interview/question.md b/interview/question.md index 996bb67b..b8d4479e 100644 --- a/interview/question.md +++ b/interview/question.md @@ -145,6 +145,8 @@ - 数据库事务 - 四大基本特性?什么是隔离性?数据库并发有几个隔离级别? - MySQL默认级别? +- mysql 分库分表 +- # Linux