Giter Club home page Giter Club logo

javaguide's Introduction

推荐你通过在线阅读网站进行阅读,体验更好,速度更快!地址:javaguide.cn

  • 面试专版:准备 Java 面试的小伙伴可以考虑面试专版:《Java 面试指北 》 (质量很高,专为面试打造,配合 JavaGuide 食用)。
  • 知识星球:专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 JavaGuide 知识星球(点击链接即可查看星球的详细介绍,一定确定自己真的需要再加入)。
  • 使用建议 :有水平的面试官都是顺着项目经历挖掘技术问题。一定不要死记硬背技术八股文!详细的学习建议请参考:JavaGuide 使用建议
  • 求个Star:如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star,这是对我最大的鼓励,感谢各位一起同行,共勉!Github 地址:https://github.com/Snailclimb/JavaGuide
  • 转载须知:以下所有文章如非文首说明为转载皆为 JavaGuide 原创,转载请在文首注明出处。如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!

项目相关

Java

基础

知识点/面试题总结 : (必看:+1: ):

重要知识点详解

集合

知识点/面试题总结

源码分析

IO

并发

知识点/面试题总结 : (必看 👍)

重要知识点详解

JVM (必看 👍)

JVM 这部分内容主要参考 JVM 虚拟机规范-Java8 和周志明老师的《深入理解 Java 虚拟机(第 3 版)》 (强烈建议阅读多遍!)。

新特性

计算机基础

操作系统

网络

知识点/面试题总结

重要知识点详解

数据结构

图解数据结构:

其他常用数据结构:

算法

算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:

常见算法问题总结

另外,GeeksforGeeks 这个网站总结了常见的算法 ,比较全面系统。

数据库

基础

MySQL

知识点/面试题总结:

重要知识点:

Redis

知识点/面试题总结 : (必看:+1: ):

重要知识点:

MongoDB

搜索引擎

Elasticsearch 常见面试题总结(付费)

JavaGuide 官方公众号

开发工具

Maven

Gradle

Gradle 核心概念总结(可选,目前国内还是使用 Maven 普遍一些)

Docker

Git

系统设计

基础

常用框架

Spring/SpringBoot (必看 👍)

知识点/面试题总结 :

重要知识点详解

MyBatis

MyBatis 常见面试题总结

安全

认证授权

数据脱敏

数据脱敏说的就是我们根据特定的规则对敏感信息数据进行变形,比如我们把手机号、身份证号某些位数使用 * 来代替。

敏感词过滤

敏感词过滤方案总结

定时任务

Java 定时任务详解

Web 实时消息推送

Web 实时消息推送详解

分布式

理论&算法&协议

RPC

ZooKeeper

这两篇文章可能有内容重合部分,推荐都看一遍。

API 网关

分布式 ID

分布式锁

分布式事务

分布式事务常见知识点&面试题总结

分布式配置中心

分布式配置中心常见知识点&面试题总结

高性能

数据库优化

负载均衡

负载均衡常见知识点&面试题总结

CDN

CDN(内容分发网络)常见知识点&面试题总结

消息队列

高可用

高可用系统设计指南

冗余设计

冗余设计详解

限流

服务限流详解

降级&熔断

降级&熔断详解

超时&重试

超时&重试详解

集群

相同的服务部署多份,避免单点故障。

灾备设计和异地多活

灾备 = 容灾 + 备份。

  • 备份:将系统所产生的的所有重要数据多备份几份。
  • 容灾:在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。

异地多活 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。

Star 趋势

Stars

公众号

如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。

JavaGuide 官方公众号

javaguide's People

Contributors

aaron-ge avatar casflawed avatar dongzl avatar fanofxiaofeng avatar fengwei2000 avatar guang19 avatar haiqiang0225 avatar ipofss avatar jacketfu0 avatar jun0315 avatar juzi214032 avatar liukun2634 avatar liwengu avatar lixd avatar mister-hope avatar orion2tap avatar paigeman avatar ryze-zhao avatar samho2008 avatar shahainloong avatar shark-ctrl avatar smy1999 avatar snailclimb avatar tommymerlin avatar vinterhe avatar xunzhuo avatar yamonc avatar yazhouasu avatar yellowgg avatar zbzbzzz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

javaguide's Issues

JavaGuide/Java相关/Multithread/AQS.md 5.2 CyclicBarrier 的使用示例

try {
    cyclicBarrier.await(2000, TimeUnit.MILLISECONDS);
} catch (Exception e) {
    e.printStackTrace();
    //System.out.println("-----CyclicBarrierException------");
}

前边创建线程的时候是Thread.sleep(1000);, 这里等待2000ms, 会报错

java.util.concurrent.BrokenBarrierException
        at java.base/java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:251)
        at java.base/java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:436)
        at CyclicBarrierExample1.test(CyclicBarrierExample1.java:44)
        at CyclicBarrierExample1.lambda$main$0(CyclicBarrierExample1.java:30)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
java.util.concurrent.BrokenBarrierException
threadnum:1is finish    at java.base/java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:251)

        at java.base/java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:436)
        at CyclicBarrierExample1.test(CyclicBarrierExample1.java:44)
        at CyclicBarrierExample1.lambda$main$0(CyclicBarrierExample1.java:30)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
java.util.concurrent.TimeoutException threadnum:2is finish
        at java.base/java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:258)
        at java.base/java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:436)
        at CyclicBarrierExample1.test(CyclicBarrierExample1.java:44)
        at CyclicBarrierExample1.lambda$main$0(CyclicBarrierExample1.java:30)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)

cyclicBarrier.await(2000, TimeUnit.MILLISECONDS); timeout改多一点, 比如5000, 就不会报错了

标记-清除法中被标记的对象

搞定JVM垃圾回收就是这么简单 中 标记-清除法的描述为:

首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象

我在网上搜索了一些资料,有的写的是 标记可回收对象,有的写的是 标记不可回收对象。

之后找到一个issues可供参考:

crossoverJie/JCSprout#131

参考维基百科里的说法:

The first stage is the mark stage which does a tree traversal of the entire 'root set' and marks each object that is pointed to by a root as being 'in-use'.

被标记的应为 在用(不可回收)对象

https://en.wikipedia.org/wiki/Tracing_garbage_collection#Na.C3.AFve_mark-and-sweep

CMS收集器这部分内容中描述有前后矛盾的地方:

初始标记: 暂停所有的其他线程,并记录下直接与root相连的对象,速度很快 ;
并发标记: 同时开启GC和用户线程,用一个闭包结构去记录可达对象。但在这个阶段结束,这个闭包结构并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。
重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短
并发清除: 开启用户线程,同时GC线程开始对为标记的区域做清扫

标记阶段对不可回收对象标记,在清除时对标记区域清扫。不就是把不可回收对象清除掉了?

《这几道Java集合框架面试题几乎必问》ConcurrentHashMap比Hashtable 效率提高16 倍的疑问

《这几道Java集合框架面试题几乎必问》中“ConcurrentHashMap 和 Hashtable 的区别”关于“默认分配16个Segment,比Hashtable效率提高16倍。”的疑问。

ConcurrentHashMap默认将hash表分为16个桶,诸如get、put、remove等常用操作只锁住当前需要用到的桶。这样,原来只能一个线程进入,现在却能同时有16个写线程执行,并发性能的提升是显而易见的。但此处并不能说效率就是提高了16倍。
ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一个可重入锁(ReentrantLock),在ConcurrentHashMap里扮演锁的角色;HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组。Segment的结构和HashMap类似,是一种数组和链表结构。一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素,每个Segment守护着一个HashEntry数组里的元素。当对HashEntry数组的数据进行修改时,必须首先获得与它对应的segment锁。
因为一个Segment里包含一个HashEntry数组,故锁住一个Segment时即锁住了该Segment下的HashEntry数组。

Object的hashcode的问题

在文中讲述hashcode和equals的部分,作者说hashcode是内存地址,这个说法是不准确的.在jdk中Object类的注释中说到,

As much as is reasonably practical, the hashCode method defined by
class {@code Object} does return distinct integers for distinct
objects. (This is typically implemented by converting the internal
address of the object into an integer, but this implementation
technique is not required by the
Java™ programming language.)

hashcode是内存地址转成了int,转换的方法是其他语言实现的,不能直接说是内存地址
楼主觉得呢?

LinkedList是双向链表不是双向循环链表

jdk1.8中
/** * Links e as last element. */ void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; }
newNode的next并没有指向first而是null

LinkBefore方法中还用pred == null来判断是否插入到第一个node
/** * Inserts element e before non-null Node succ. */ void linkBefore(E e, Node<E> succ) { // assert succ != null; final Node<E> pred = succ.prev; final Node<E> newNode = new Node<>(pred, e, succ); succ.prev = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; modCount++; }
所以没看出来循环

链表不是随机访问的,概念上有点错误。

Java相关/这几道Java集合框架面试题几乎必问.md
里的

ArraysList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所以称为快速随机访问。实际上链表也是支持的,不过需要遍历到特定位置才行,时间复杂度为 O(n)。

这句,链表也是支持的, 如果理解为 支持快速随机访问,那么则是错误的。需要遍历的就不叫快速随机访问了

关于值传递与引用传递

java中没有引用传递,只有值传递。作者最好改一下,以免误导新人。具体关于什么是引用传递,可以去复习下C语言的指针,对比着看。PS:java的引用不可简单的与C的指针划等号

欢迎大家提建议啊~~~

欢迎大家提建议啊~~~
一个好的开源文档的诞生一个人的努力肯定是不够的,所以在这里希望能有人帮忙一起完善。

有个问题请教

// 当桶(bucket)上的结点数大于这个值时会转成红黑树
    static final int TREEIFY_THRESHOLD = 8; 
    // 当桶(bucket)上的结点数小于这个值时树转链表
    static final int UNTREEIFY_THRESHOLD = 6; 

这两个值大神知道是什么依据吗?

项目介绍存在语法问题

A core knowledge that most Java programmers need to master https://github.com/Snailclimb/JavaGuide

请务必将这里改对

错别字

面试必备/最最最常见的Java面试题总结/第一周(2018-8-7)里,
发现一个错别字:
加载进局部变量表一个slot中

Add demo gif to README

Disclaimer: This is a bot

It looks like your repo is trending. The github_trending_videos Instgram account automatically shows the demo gifs of trending repos in Github.

Your README doesn't seem to have any demo gifs. Add one and the next time the parser runs it will pick it up and post it on its Instagram feed. If you don't want to just close this issue we won't bother you again.

Java版本问题

在看Java集合框架源码的时候发现部分代码有细微差别,能麻烦注明一下Java的版本号吗?

English version?

Hi! First of all, I just want to say that this is an amazing resource for learning Java. You have done a very good job.

I'm just wondering if an English version will ever be available? Or if translated versions of the pictures and diagrams would be available? I've currently been using Google translate and it works, but I'm just asking :)

Thank you for this!

.....

本来不想看的, 不知怎么了看着看着就看的差不多,感觉挺好的,就加个星吧! 哈哈

有几处觉得不太妥当的地方~

感谢提供如此详尽的材料~

hasmmap源码分析这一节中,我觉得有几处不妥,请大佬们指教

内部结构分析-->JDK1.8之前--> JDK1.8之前HashMap底层是数组和链表结合在一起使用也就是链表散列。HashMap通过key的hashCode来计算hash值,当hashCode相同时,通过“拉链法”解决冲突。

这里我觉得表述不是很妥当,"HashMap通过key的hashCode来计算hash值,当hashCode相同时,通过“拉链法”解决冲突" hashmap 通过key的hashCode经过扰动函数处理过后得到hash值,当hash值相同时,通过拉链法解决冲突,不是hashCode相同时。因为不同的hashCode也可能扰动处理成相同的hash值。

下面一段:简单来说,JDK1.8之前HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为O(1),因为最新的Entry会插入链表头部,急需要简单改变引用链即可,而对于查找操作来讲,此时就需要遍历链表,然后通过key对象的equals方法逐一比对查找.

这里 "如果定位到的数组位置不含链表(当前entry的next指向null)" 括号里“当前entry的next指向null”描述不当,如下源码,for循环进入的条件是e!=null ,即判断数组有没有元素,只要有,就会开始链表的判断,不管链表有多长。
这里 "如果定位到的数组包含链表,对于添加操作,其时间复杂度依然为O(1)" 这个表述不太合理,因为不管插入,删除还是查询,都是先遍历一遍链表,所以复杂度应该是一样的。具体可以看下面的源码~~

public V put(K key, V value)
    if (table == EMPTY_TABLE) { 
    inflateTable(threshold); 
}  
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) { // 先遍历
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue; 
        }
    }

    modCount++;
    addEntry(hash, key, value, i);  // 再插入
    return null;
}

再次感谢,希望不要把我当杠精~。~

Java基础知识18.4成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰但没有被 static 修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。

Java基础知识18.4
原文:成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被 final 修饰但没有被 static 修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。
我试了一下 同时被final 和 static修饰的变量也需要被显示地赋值?这里是作者笔误吗?还是我理解的不对?

算法总结——几道常见的子符串算法题------把字符串转换成整数

https://github.com/Snailclimb/JavaGuide/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/%E6%90%9E%E5%AE%9ABAT%E9%9D%A2%E8%AF%95%E2%80%94%E2%80%94%E5%87%A0%E9%81%93%E5%B8%B8%E8%A7%81%E7%9A%84%E5%AD%90%E7%AC%A6%E4%B8%B2%E7%AE%97%E6%B3%95%E9%A2%98.md
把字符串转换成整数如果传入的字符串没有 + 或者 - 号则 flag=0,那样会默认返回负数结果。
int flag = 0;
if (chars[0] == '+')
flag = 1;
else if (chars[0] == '-')
flag = 2;
return flag == 1 ? res : -res;

如 “123” flag = 0 返回 -123

为什么不整个gitbook呢

像这种文章篇幅较长的集合,想用kindle来看,所以想用gitbook的导出mobi功能,建议同步到gitbook上

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.