Git Product home page Git Product logo

tutorial's Introduction

声明 本项目为个人学习之总结,内容大多来源网上、书籍、视频,若引用不当,麻烦告知,我定删除。喜欢的话可以Star下,生活不易,希望对读者有帮助。祝好!!!

目录

英语 Java生态 Golang生态 中间件 持久化 服务器 网络/系统 内功 程序人生
英语 Java Basic
JVM
Web
Spring
Spring Boot
Spring Cloud
Go Basic
Go Web
Keepalived
ActiveMQ
RabbitMQ
RocketMQ
MQTT
Netty
Mybatis
Redis
Log
MySQL
Postgresql
Mongodb
Tomcat
Nginx
网络
Linux
数据结构
算法
设计模式
软文
规范
工具
面试集锦
实战训练

英语

Java

Golang

中间件

数据库

服务器

架构设计

内功

网络

程序人生

软文

规范

工具

面试集锦

实战训练

技术栈

tutorial's People

Contributors

joshaber avatar zhonghuasheng 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

tutorial's Issues

拜占庭将军问题

拜占庭将军问题

拜占庭将军问题(Byzantine Generals Problem),是由莱斯利·兰波特在其同名论文中提出的分布式对等网络通信容错问题。在分布式计算中,不同的计算机通过通讯交换信息达成共识而按照同一套协作策略行动。但有時候,系统中的成员计算机可能出错而发送错误的信息,用于传递信息的通讯网络也可能导致信息损坏,使得网络中不同的成员关于全体协作的策略得出不同结论,从而破坏系统一致性。拜占庭将军问题被认为是容错性问题中最难的问题类型之一。

我们来讲一个故事来帮助理解:拜占庭帝国是一个古老而强大的帝国,这次他们想攻打另一个强大的敌人,所以派出了10支军队想要包围敌人。并且这10支军队约定,互相依靠轻骑兵通信协商,在包围敌人之后同时进攻。那么问题来了,如果这其中有人叛变,传递错误的信息,那么怎么同时进攻来取得胜利呢?

我们再来说一个故事,大家都看过《哆啦A梦》吧,胖虎是个孩子王,但他其实很怕事,遇到比自己更强大的对手立刻就怂。所以,有一天,常常遭到胖虎欺负的哆啦A梦、大熊、静香、小夫一起开了一次小型的会议,决定联合起来去找胖虎谈判)。他们偷偷的给胖虎扔了一张小纸条,气势汹汹的约胖虎放学不走。下课铃响起,胖虎悠哉悠哉的等着谁找他麻烦,而其他四位小伙伴计划先各自回家,放下书包,再去集合。大熊刚到家,哆啦A梦突然说:“小夫一直是个胆小鬼,万一他不去怎么办?”大熊迟疑了,他想:“对啊,静香又是个女孩子,万一也不想去,我们两个去了一定会被胖虎揍一顿,我有点不想去了。”于是哆啦A梦和大雄在家里踌躇着,静香和小夫其实也在家里考虑着,都认为大熊胆小,也极可能不会去。就这样,胖虎等了一小时也不见其他人。

这就是拜占庭将军问题。这个问题的本质就是如何让众多完全平等的节点针对某一状态达成共识。

比特币的解决方案

这个问题的提出时间是1982年,直到2009年,比特币的出现才算解决了这一问题。

比特币拥有其创造性的 PoW 机制,即工作量证明。工作量证明系统的主要特征就是众多参与节点需要做一定难度的工作得出一个结果,谁先得出立即全网广播,其他节点很容易通过结果来检查出之前节点是不是做了相应的工作,一旦结果被证明正确,其他节点会把之前节点的结果添加到各自的账单中,为争取下一笔的交易记录做好计算的准备。

这个过程就像一位将军A在向其他的将军发起一个进攻提议一样,之后的将军看到将军A签过名的进攻提议书,而如果其他将军也打算进攻,则在将军A的消息后面跟上自己的签名信息:“进攻 + 将军B”,以此类推。当此类消息达到十个,他们必将一同进攻。

这时也会出现一种情况,将军A发出消息后,可能会有两个或多个将军同时跟上“进攻+签名”的消息,这时,各个节点会严格按照广播的精确时间进行排序,确保一条链的完整性。也有完全同时广播出来的情况,这时就是“分叉”,出现一个分开的两条链,之后,哪条链上添加的账本多(共识多),哪条就成为主链,另一条分叉链就此中断或被部分矿工认可继续添加(例如以太坊和以太坊经典)。

解决方案的原理

工作量证明(PoW)其实相当于提高了做叛徒(发布虚假区块)的成本,在这个系统下,只有第一个完成证明的节点才能广播区块,竞争难度非常大,需要很高的算力,如果不成功的话算力就白白耗费了。如果有这样的算力作为诚实的节点,同样也可以获得很大的收益,这就不会有做叛徒的动机,整个系统也因此而更稳定。

Java中equals和==的区别

  • 通俗点讲:
    • ==是看看左右是不是一个东西。equals是看看左右是不是长得一样。两个长得一样的人,只能说长的相同(equals),但是不等于他们俩是一个人。
  • 术语来讲的区别:
    • 1.==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
    • 2.==是指对内存地址进行比较,equals()是对字符串的内容进行比较
    • 3.==指引用是否相同,equals()指的是值是否相同

[Network] TCP 3-Way Handshake & 4-times close

Information:

The Transmission Control Protocol(TCP) level of the TCP/IP transport protocol is connection-oriented. Connection-oriented means that, before any data can be transmitted, a reliable connection must be obtained and acknowledged.

Why need 3-Way Handshake?

这个问题的本质是信道不可靠,但是通信双方需要就某个问题达成一致。而要解决这个问题,无论在消息中包含什么信息,三次通信是理论最小值。所以三次握手不是TCP本身的要求,而是为了满足“在不可靠信道上进行可靠的传输信息”这个需求所导致的,也就是说信道不可靠,但是数据传输要可靠。三次握手达到了,那么后面你想接着握手也好,发数据也好,跟进行可靠信息传输的需求就没有关系了(三次握手之后没必要再握手)。So,如果信道是可靠的,即无论什么时候发出消息,对方一定能收到。

在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次握手”的目的是为了解决“网络中存在延迟的重复分组”的问题。
在谢希仁著《计算机网络》书中同时举了一个例子,如下:

“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

如何将字符串反转?

最直接的是使用StringBuffer的reverse方法,实现方式是使用倒序遍历;另外可以将字符串转换为char[]数组(toCharArray),倒序遍历数组

equals和==有什么区别?对象的equals判断的是什么?

  1. 基础数据类型没有equals方法,只能使用==来判断,判断的时候是判断值是否相等
  2. 引用类型可以使用==和equalls。如果对象不重写Object中的equals方法,那么==和equals没有区别,因为Object中的equals也是使用==来判断;如果重写了equals方法,那就使用对象重写的equals方法来判断。==比较的是两个对象在堆中存放数据的内存地址是否相等。
  3. String需要拿来特殊说明,String是Java中不需要new就可以产生对象的特例。使用String来申明一个变量的时候,JVM会在常量池中查找是否已经存在这个值,如果存在就把内存地址返回给变量;如果不存在,会新开辟一个空间来存储这个值,然后把内存地址返回。那么我们再来看String中==和equals的区别,String中使用==比较的是内存地址是否相等,String重写了Object中的equals方法,使用equals时先比较对象是否相等,如果相等就返回true;否则比较值是否相等。
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

两个对象的hashCode值相等,则equals比较时为true,对吗?

这个问题需要分两种情况来思考:对象有没有重写equals方法。如果没有,那默认使用Object中的equals做判断,Object中的equals使用的==来判断,比较的是对象在堆中的内存地址。如果对象为String类型,那么equals为true;否则不一定相等。Java中的HashCode是通过一定的规则将与对象相关的信息(内存地址,对象的字段等)映射成一个数值,这个数值称为散列值。我们知道这个hashCode的生成规则之后就不难理解为什么JDK要求(没有强制)当重写了hashCode之后要重写equals方法,来保证当两个对象的hashCode相同时,equals也为true。

final在Java中有什么作用?

final在Java中可以用来修饰类,方法,变量。被final修饰的类表示该类不能被继承;被final修饰的方法表示该方法不能被重写;被final修饰的变量只能被赋值一次不能被修改。

Java中操作字符串都有哪些类?它们之间有什么区别?

主要有三种:String, StringBuffer, StringBuilder
String是不可变的对象,每次对String类型的改变都可能会生成一个新的对象
StringBuffer和StringBuilder是可以改变的对象。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer是线程安全的,可用于多线程(关键方法基本都使用synchronized关键字修饰);StringBuilder是非线程安全的,用于单线程
不频繁的字符串操作使用String

Java中面向过程和面向对象的区别

  • 什么是面向对象,什么是面向过程
  • 区别:
    • 面向过程:
      • 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源(类实例化的时候都干了什么),所以在一些对性能要求高的产品上会采用面向过程编程,比如单片机、嵌入式开发、Linux\Unix等一般会采用面向过程开发。常见的面向过程开发语言有哪些?
      • 缺点:没有面向对象易维护、易复用、易扩展
    • 面向对象:
      • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护
      • 缺点:性能比面向过程低

普通类,抽象类,接口有哪些区别?

  1. 普通类可以去实例化调用,抽象类不能被实例化
  2. 普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写抽象类中的抽象方法,除非自己也是抽象类
  3. 抽象类可以有具体的方法和属性,接口只能有抽象方法和不可变的常量
  4. 抽象类和接口性质不同,抽象类是对对象的抽象,接口是一种行为规范
  5. 什么时候使用抽象类,什么时候使用接口
    使用接口:
  • 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
  • 需要使用多重继承。
    使用抽象类:
  • 需要在几个相关的类**享代码。
  • 需要能控制继承来的成员的访问权限,而不是都为 public。
  • 需要继承非静态和非常量字段。
    在很多情况下,接口优先于抽象类。因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
    另外有一点是接口中有一个叫做标记接口,例如RandomAccess

如何将字符串反转

最直接的是使用StringBuffer的reverse方法,实现方式是使用倒序遍历;另外可以将字符串转换为char[]数组(toCharArray),倒序遍历数组

finally在Java中的作用

final在Java中可以用来修饰类,方法,变量。被final修饰的类表示该类不能被继承;被final修饰的方法表示该方法不能被重写;被final修饰的变量只能被赋值一次不能被修改。

JDK 和 JRE 有什么区别?

JVM :英文名称(Java Virtual Machine),就是我们耳熟能详的 Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并调用操作系统向上的 API 完成动作。所以说,jvm 是 Java 能够跨平台的核心,具体的下文会详细说明。
JRE :英文名称(Java Runtime Environment),我们叫它:Java 运行时环境。它主要包含两个部分,jvm 的标准实现和 Java 的一些基本类库。它相对于 jvm 来说,多出来的是一部分的 Java 类库。
JDK :英文名称(Java Development Kit),Java 开发工具包。jdk 是整个 Java 开发的核心,它集成了 jre 和一些好用的小工具。例如:javac.exe,java.exe,jar.exe 等。
显然,这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。

Java中操作字符串都有哪些类?它们之间有什么区别?

主要有三种:String, StringBuffer, StringBuilder
String是不可变的对象,每次对String类型的改变都可能会生成一个新的对象
StringBuffer和StringBuilder是可以改变的对象。
对于操作效率:StringBuilder > StringBuffer > String
对于线程安全:StringBuffer是线程安全的,可用于多线程(关键方法基本都使用synchronized关键字修饰);StringBuilder是非线程安全的,用于单线程
不频繁的字符串操作使用String

重载和重写的区别

  • 重载:同名不同参(参数类型,个数,顺序至少有一个不同)
  • 重写:同名同参,子类方法不能缩小父类方法的访问权限;子类方法不能抛出比父类方法更多的异常;

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.