自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 Java基础

1.String,StringBuffer和StringBuliderString是字符串常量,StringBuffer和StringBuilder都是字符串变量。String类型是不可改变的对象,由于这种机制,每当用String对字符串做拼接时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,执行效率就会很低。特殊情况:String str = “This is ...

2018-09-18 10:31:28 358

原创 “二叉树的深度”和“平衡二叉树”

题目描述二叉树的深度:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树的节点定义如下:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public Tre...

2018-09-10 09:38:35 2165

原创 输入一个网址后发生了什么

当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?请从技术的角度描述,如浏览器、网络(UDP、TCP、HTTP等),以及服务器等各种参与对象上由此引发的一系列活动,请尽可能的涉及到所有的关键技术点。1.DNS解析DNS解析的过程就是寻找哪台机器上有你需要资源的过程,寻找的过程遵循就近原则。输入一个网址并按回车的时候浏览器会根据输入的URL去查...

2018-09-09 13:42:40 26751 2

原创 “和为S的两个数字”和“和为S的连续正数序列”

题目描述和为S的两个数字:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。因为给出的数组是排好序的,所以我们就可以在有序数组中放两个指针用于查找符合条件的两个数字。首先定义两个指针,第一个指针指向数组的第一个(最小的)数字,第二个指针指向数组的第二...

2018-09-09 09:36:42 266

原创 序列化二叉树

题目描述请实现两个函数,分别用来序列化和反序列化二叉树。根据树的前序遍历序列和中序遍历序列可以唯一的构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和中序遍历序列,然后在反序列化时通过这两个序列重构出原二叉树。这种思路有两个缺点:一是该方法要求二叉树中不能有重复的节点,二是只有当两个序列中的所有数据都读出后才能开始反序列化。如果两个遍历序列的数据是从一个流里读...

2018-09-08 21:09:58 795

原创 连续子数组的最大和

题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...

2018-09-05 23:06:04 20420 5

原创 对称的二叉树

题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。例如,在下图所示的三棵二叉树中,第一棵二叉树是对称的,而另外两棵不是。我们通常有3种不同的二叉树遍历算法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左子结点再遍历右子结点。那么我们是否可以定义一种遍历算法,先遍历右子结点再遍历左子结点?比如我们针...

2018-09-02 17:56:02 370

原创 二叉树的镜像

题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述:二叉树的镜像定义:  源二叉树 镜像二叉树 8 8 / \ / \ 6 10 10 6 / \...

2018-09-02 16:25:15 730

原创 两个链表的第一个公共节点

问题描述输入两个链表,找出它们的第一个公共结点。含有公共节点的两个链表的结构类似于下图中的链表:可以看到两个链表中有一个公共节点,其中橙色的节点就是这两个链表的公共节点。  看到这个题目,容易想到的方法是使用蛮力法解决:在第一个链表上顺序遍历每一个节点,每遍历到一个节点,就在第二个链表上顺序遍历每个节点。如果在第二个链表上有一个节点与第一个链表上的节点一样,则说明两个链表在这个...

2018-09-02 15:34:28 18472 13

原创 链表中环的入口节点

问题描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。有环链表类似于下图中的链表:可以看到该链表中有一个环,其中橙色的节点就是这个链表中环的入口节点。 解决这个问题可以分三步。(1)第一步是确定一个链表中是否包含环。我们可以用两个指针来解决这个问题。定义两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走得快的指针追...

2018-09-02 13:44:11 5538 3

原创 判断链表是否有环?

题目描述有一个单向链表,链表当中有可能出现“环”,就像下图这样。如何用程序判断出这个链表是有环链表? 方法一:首先从头节点开始,依次遍历单链表的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节点当中存在相同节点ID,则说明该节点被遍历过两次,链表有环;如果之前的所有节点当中不存在相同的节点...

2018-09-02 11:03:52 1411

原创 Bitmap算法简介

Bitmap算法中文又叫做位图算法。那么什么是Bitmap算法呢?位图算法中的位图是内存中连续的二进制位(bit),用于对大量整形数据做去重和查询。举个例子,给定一块长度是10bit的内存空间,想要依次插入整形数据4,2,1,3。我们需要怎么做呢?1. 给定长度是10的bitmap,每一个bit位分别对应着从0到9的10个整型数。此时bitmap的所有位都是0。2. 把整型数4...

2018-09-01 23:23:16 15589 3

原创 BitSet的应用

1.BitSet介绍BitSet是用于存储二进制位和对二进制进行操作的Java数据结构,BitSet从jdk1.0开始就有了。它存储的是二进制位在BitSet中状态,根据对这些状态的判断,可以有很多应用。以前对数据的操作都是先把数据都是存储在内存中间的,现在可以通过设置BitSet的相应位达到存储数据信息的目的,极大的节省了内存空间。2.BitSet应用BitSet可以做的事情主要分为...

2018-09-01 22:32:28 3413 1

原创 BitSet的实现原理

1.BitSet介绍Bitset是Java中的一种数据结构。Bitset中主要存储的是二进制位,做的也都是位运算,每一位只用来存储0,1值,主要用于对数据的标记。Bitset的基本原理是,用1位来表示一个数据是否出现过,0为没有出现过,1表示出现过。使用的时候可以根据某一个位是否为0表示此数是否出现过。JDK中的BitSet集合对是布隆过滤器中经常使用的数据结构Bitmap的相对简单的实现...

2018-08-31 15:19:35 21574 2

原创 反转链表

题目描述输入一个链表,反转链表后,输出新链表的表头。链表的数据结构如下:public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}[反转链表]也叫做[链表逆置].比如一个链表是这样的:1->2-&...

2018-08-30 12:36:31 151

原创 青蛙变态跳台阶问题

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:因为n级台阶,第一步有n种跳法:跳1级、跳2级、到跳n级跳1级,剩下n-1级,则剩下跳法是f(n-1)跳2级,剩下n-2级,则剩下跳法是f(n-2)所以f(n) = f(n-1) + f(n-2) + ... + f(1)因为f(n-1) = f(n-2)...

2018-08-29 23:17:21 3179 2

原创 青蛙跳台阶问题

题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有两级台阶,那就有两种跳法:一种是分两次跳,每次跳1级;另一种就是一次跳2级。接着我们再谈论一般情况。我们把n级台阶时的跳法看成n的函数,记为f(n)。当n>2 时,第一次跳的时候就有两种...

2018-08-29 21:41:45 2342

原创 MYSQL存储引擎

1.什么是存储引擎?有什么作用?MySQL是用来保存数据的,MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者特定的功能,从而改善你的应用的整体功能。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。因此我们就可...

2018-08-29 16:25:48 744

原创 MYSQL索引

1.什么是索引?怎么样创建索引?索引是对数据表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。(1)直接创建索引CREATE INDEX index_name ON table(column(length))(2)修改表结构的方式添加索引ALTER TABLE table_name ADD INDEX index_name ON (column(...

2018-08-29 14:42:44 191

原创 数据库中的事务

1.事务的特性:ACID如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性:(1)原子性( Atomicity):事物作为单个逻辑单元执行的一组操作, 事务中的所有操作要么全部执行成功,要么全部执行失败。要么全都执行,要么全都不执行。(2)一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须...

2018-08-29 12:28:01 234

原创 HTTP报文的结构

1.HTTP报文HTTP通信过程包括客户端往服务器端发送请求以及服务器端给客户端返回响应两个过程。在这两个过程中就会产生请求报文和响应报文。那么什么是HTTP报文呢?HTTP报文是用于HTTP协议交互的信息,HTTP报文本身是由多行数据构成的字符串文本。客户端的HTTP报文叫做请求报文,服务器端的HTTP报文叫做响应报文。HTTP报文由哪几部分构成?各部分都有什么作用?HTTP...

2018-08-29 09:52:01 50609 2

原创 Java中的序列化

什么是Java对象序列化?Java中的序列化主要是指对Java对象的序列化。Java对象的序列化就是把Java对象转换成跟平台无关的二进制流,反序列化就是把序列化的二进制流恢复成原来的JAVA对象。为什么要进行序列化?当虚拟机停止运行之后,内存中的对象就会消失,Java对象经过序列化可以将对象转换成二进制流保存下来,比如保存在磁盘中,一般是保存到文件中,或者将对象的序列化为字符串保存到...

2018-08-28 21:09:33 302

原创 TCP协议的三次握手和四次挥手

TCP协议是面向连接的,所以在传输数据前必须先建立连接。在建立连接的过程中用到了TCP报文的两个序号和三个标志位:这些序号和标志位在TCP报文的首部定义。下面先来看一下TCP报文段的首部格式:两个序号和三个标志位的描述如下:两个序号:seq和ack。(1)发送序号:seq序号,占32位。TCP连接中传送的字节流中的每一个字节都按顺序编号,TCP首部中的序号字段的意思是本报文...

2018-08-28 11:19:54 285

原创 ConcurrentHashMap的实现原理

HashMap是Java当中很常用的数据结构。但是HashMap不是线程安全的,单线程环境下还可以正常使用,不过在并发插入元素的时候有可能出现带环链表,让下一次读操作出现死循环。那么什么样的哈希数据结构可以保证线程安全呢?线程安全的哈希数据结构主要有HashTable和ConcurrentHashMap。而ConcurrentHashMap比HashTable的扩展性更好。在多并发...

2018-08-27 14:08:56 2663 1

原创 HashMap和线程安全

HashMap是Java当中很常用的数据结构。那么HashMap是线程安全的吗?高并发情况下HashMap会出现什么问题?为什么HashMap在高并发情况下会出现死锁?Java8中,HashMap的结构有什么样的优化呢?下面我们一起来看一下高并发情况下,HashMap可能出现的致命问题。在分析高并发场景之前,我们需要先搞清楚[rehash]这个概念。Rehash是HashMap...

2018-08-27 12:36:02 8130

原创 HashMap的实现原理

HashMap是Java当中很常用的数据结构。众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。HashMap数组每一个元素的初始值都是Null。对于HashMap,我们最常使用的是两个方法:Put( )和Get( )。1.Put方法的原理调...

2018-08-27 09:25:14 194

原创 Zookeeper实现分布式锁

如何用Zookeeper实现分布式锁?在学习分布式锁之前,需要首先了解一下Zookeeper的[临时顺序节点]。什么是临时顺序节点?让我们来回顾一下Zookeeper节点的概念:Zookeeper的数据存储结构就像一棵树,这棵树由节点组成,这种节点叫做Znode。Znode分为四种类型:1.持久节点 (PERSISTENT)默认的节点类型。创建节点的客户端与zook...

2018-08-26 17:11:54 32296 25

原创 Redis实现分布式锁

在多线程并发的情况下,我们可以使用锁来保证一个代码块在同一时间内只能由一个线程访问。比如Java的synchronized关键字和Reentrantlock类等等。这样子可以保证在同一个JVM进程内的多个线程同步执行。如果在分布式的集群环境中,如何保证不同节点的线程同步执行呢?怎么才能在分布式系统中,实现不同线程对代码和资源的同步访问?对于单进程的并发场景,我们可以使用语言...

2018-08-26 16:03:43 39207 19

原创 Mysql索引数据结构

首先,数据库索引使用树来存储,因为树的查询效率高,而且二叉查找树还可以保持数据的有序。那么索引为什么没有使用二叉树来实现呢?其实从算法逻辑上讲,二叉查找树的查找速度和比较次数都是最小的,但是从Mysql的角度讲,我们不得不考虑一个现实问题:磁盘IO。查找都是索引操作,一般来说索引非常大,尤其是关系型数据库这种,当数据量比较大的时候,索引的大小有可能几个G甚至更多,数据量大的索引能达到亿...

2018-08-26 11:55:58 17801 2

原创 二叉树的前序中序和后续遍历及应用场景

二叉树的结构定义public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}二叉树的遍历通常有前序,中序和后续三种。遍历算法通常使用递...

2018-08-25 21:42:37 14372 1

原创 输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:首先需要判断n是不是负数,当n为负数的时候,直接用while循环判断会导致死循环,因为负数向左移位的话最高位补1 。针对这种情况,要不就是对正数和负数的操作应该分开处理,要不就是找到一个对正数和负数都可以处理的方法。如果是第二种方法可以把int型转成二进制的string类型,再统计string类型中1的个...

2018-08-25 20:12:38 8632 2

原创 Java中的小数是怎么存储的?

Java中的小数使用double和float表示,小数属于浮点型(默认为double)。对于float型的值,则要在数字后加f或F,如12.3F,它在机器中占32位,4个字节来存储,表示精度较低。double是64位。那么一个小数在Java中是如何存储的呢?1.Java语言中,float类型数字在计算机中的存储遵循IEEE-754格式标准:(1)一个浮点数有3部分组成:符号位,指数...

2018-08-25 17:18:11 9090 1

原创 Spring Bean的作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。目前Spring Bean的作用域或者说范围主要有五种。作用域 描述 singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值。 prototype 每次从容器中调用Bean时,都返回一个新的实例,即每...

2018-08-25 14:05:02 65521 5

原创 Spring Bean的实现方式

Spring Bean的实现方式主要有三种。(1)使用类的无参构造函数实例化(90%通常使用的一个方法)1.首先定义一个bean。package com.spring.demo;public class Bean { //默认构造方法 Bean(){} public void print(){ System.out.println("Bean.....

2018-08-25 09:43:42 965

原创 maven的用法和几个常用的命令

做项目时使用maven构建项目已经是现在的流行做法了。那么maven的作用是什么呢?maven中的几个常用的命令都有什么用?下面我们来看一下。maven最大的作用就是用于对项目中jar包依赖的统一管理。通常项目中如果不使用maven的话,项目中用到的jar包需要自己下载,然后放到项目的lib目录,比较麻烦。如果使用maven构建项目,项目中就会有有一个pom文件,该pom文件的作用就是...

2018-08-24 21:38:58 34479 2

原创 线程安全

1.线程安全概述使用多线程可以在一段时间内并发处理多个任务,在提高CPU运行效率的同时也为我们批量处理这些任务带来了便利。但是,使用多线程的时候要格外小心,多个线程在某一时间对同一个变量的处理,如果处理不当,就会造成数据不一致的问题,出现的这种数据不一致的现象就是非线程安全。非线程安全是多线程才会出现的问题。上面的情况只是非线程安全的一种。非线程安全出现的原因是各个线程的控制流彼此独立,线...

2018-08-24 19:45:01 274

原创 ReentrantLock和ReentrantReadWriteLock类的使用

在Java中,可以使用synchronized关键字实现线程之间同步互斥,除此以外,JDK中的Lock对象也能实现同步的效果,而且在使用上更加方便灵活,扩展功能也更加强大。常用的两个Lock类为ReentrantLock和ReentrantReadWriteLock。ReentrantLock类在功能上相比synchronized关键字更多。下面先介绍一下ReentrantLock类的使用...

2018-08-24 19:44:04 608

原创 ThreadLocal类的使用

线程中变量值的共享可以使用public static变量的形式,所有的线程都使用同一个public static变量。那么如果想实现每一个线程都有自己的私有共享变量该怎么实现?可以使用Java的JDK中提供的ThreadLocal类实现这样的功能。ThreadLocal类主要解决的就是每个线程绑定自己的值,可以将ThreadLocal类比喻成全局存放数据的盒子,盒子中可以存储每个线程的私有数据...

2018-08-23 17:33:48 242

原创 线程间通信

线程和线程之间不是独立的个体,它们彼此之间可以互相通信和协作。线程通信就是在线程之间传递信息,保证他们能够协同工作。在线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务的处理过程进行有效的把控与监督。1.等待/通知机制(1)不使用等待/通知实现线程间通信如果不使用线程间的通信机制,两个线程想要根据同一个数据实现通信的话,就必须使用whi...

2018-08-23 16:50:41 167

原创 关键字synchronized的使用

为了解决非线程安全问题,就需要使用线程同步。实现线程同步的一种方式就是使用synchronized关键字。1.synchronized的用法(1)synchronized可以修饰方法,表示这个方法在任意时刻只能由一个线程访问。(2)synchronized用在类声明中,表明该类中的所有方法都是synchronized的。(3)synchronized还可以用在一段代码中,被sync...

2018-08-23 16:45:06 846

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除