All

Mysql的ibtmp1文件过大
2019 年 08 月 21 日
ArrayList源码学习
2019 年 08 月 20 日

变量

1
2
3
4
5
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; 
private int size;
  • DEFAULT_CAPACITY:默认的容量,当我们不指定容量时默认容量是10
  • EMPTY_ELEMENTDATA:空的数据集
  • DEFAULTCAPACITY_EMPTY_ELEMENTDATA:同上面的一样,都是空的数据集
  • elementData:保存的元素
  • size:元素长度,实际存储的元素数量

构造方法:

  • 无参的构造方法
1
2
3
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

很简单的一句话,将保存元素的变量进行初始化。

两数相加-LeetCode2
2019 年 08 月 20 日

题目描述

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807

树莓派使用笔记
2019 年 08 月 08 日
重复N次的元素-LeetCode961
2019 年 08 月 08 日

题目描述

在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。

返回重复了 N 次的那个元素。

示例 1:

输入:[1,2,3,3] 输出:3 示例 2:

输入:[2,1,2,5,3,2] 输出:2 示例 3:

输入:[5,1,5,2,5,3,5,4] 输出:5

提示:

4 <= A.length <= 10000 0 <= A[i] < 10000 A.length 为偶数

大小为2N的数字中有个N+1个元素,其中有个元素重复了N次,这也说明了除了这个元素其他元素都没有重复,也可以理解成查找重复的元素

两个数组的交集II-LeetCode350
2019 年 08 月 07 日

题目描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = \[1,2,2,1], nums2 = \[2,2]
输出: \[2,2]

示例 2:

输入: nums1 = \[4,9,5], nums2 = \[9,4,9,8,4]
输出: \[4,9]

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
  • 我们可以不考虑输出结果的顺序。

*进阶:*

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

这个题目的T349的进阶版。

有效的括号—LeetCode20
2019 年 08 月 07 日

题目描述

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = \[1,2,2,1], nums2 = \[2,2]
输出: \[2]

示例 2:

输入: nums1 = \[4,9,5], nums2 = \[9,4,9,8,4]
输出: \[9,4]

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。
有效的括号—LeetCode20
2019 年 08 月 07 日

题目描述

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。 有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1:
输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

 输入: "(\[)]"
 输出: false

示例 5:

输入: "{\[]}"
输出: true

这个题目与我们编译器对括号的识别一样,当我们多了一个括号后编译器会报错提示。

保持城市的天际线-LeetCode807
2019 年 08 月 06 日

题目描述

在二维数组grid中,grid[i][j]代表位于某处的建筑物的高度。 我们被允许增加任何数量(不同建筑物的数量可能不同)的建筑物的高度。 高度 0 也被认为是建筑物。

最后,从新数组的所有四个方向(即顶部,底部,左侧和右侧)观看的“天际线”必须与原始数组的天际线相同。 城市的天际线是从远处观看时,由所有建筑物形成的矩形的外部轮廓。 请看下面的例子。

建筑物高度可以增加的最大总和是多少?

例子: 输入: grid = [[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]] 输出: 35 解释: The grid is: [ [3, 0, 8, 4], [2, 4, 5, 7], [9, 2, 6, 3], [0, 3, 1, 0] ]

从数组竖直方向(即顶部,底部)看“天际线”是:[9, 4, 8, 7] 从水平水平方向(即左侧,右侧)看“天际线”是:[8, 7, 9, 3]

在不影响天际线的情况下对建筑物进行增高后,新数组如下:

gridNew = [ [8, 4, 8, 7], [7, 4, 7, 7], [9, 4, 8, 7], [3, 3, 3, 3] ] 说明:

1 < grid.length = grid[0].length <= 50。 grid[i][j] 的高度范围是: [0, 100]。 一座建筑物占据一个grid[i][j]:换言之,它们是 1 x 1 x grid[i][j] 的长方体。

这个问题类似看三视图,然后再根据两个三视图合并出符合条件的最高值。

最后要返回的结果是这个最高值比原有值增长了多少

手写rpc简单实现
2019 年 07 月 26 日

背景

当单体项目逐渐扩大后,一个项目编译,发布可能需要很久的时间,如果其中一个文件出现 bug,那么需要对整个项目进行打包发布。微服务就是对项目进行拆分,拆分成多个小项目,由这些小项目组成大项目。并且拆分成小项目后,其他单体项目中需要相同功能的地方就不用再次编写,直接用这个就可以了。有种分治的思想。

那么原来单体项目拆分后,随之而来就会出现一些问题。原来一个项目中直接调用即可,现在请求的类被拆分到其他项目中,如何进行请求,是采用 http 这种请求还是rpc?多个模块如果进行管理等等一系列问题。这里主要写一下 rpc 的理解。

在微服务中rpc又是重要的一环,现在主流的rpc框架有很多,比如阿里的dubbo,微博的Motan,谷歌的gRpc,还有Thrift,现在主流的应该就这几种吧。按照文档学习了一下dubbo如何使用后,发现并没有了解rpc是如何具体实现的。所以这篇文章记录了自己对rpc的一些理解与实战代码。

代码链接

HTTP 与 RPC 的对比

其实就像一些技术一样,没有绝对好的技术,不然大家都去使用它了。都只是在不同场景下有各自的优势。

  • rpc一般是自带负载均衡策略,而 http 一般是通过 nginx 这种来实现负载均衡
  • rpc可以使用 tcp 协议也可以使用 http 协议,而 http 就只能使用 http 协议
  • rpc可以自定义传输信息和序列化方法,减少传输报文大小。

所以RPC主要用于公司内部的服务调用。HTTP主要用于对外的环境,浏览器接口调用,APP接口调用,第三方接口调用等。

RPC的主要实现步骤

RPC调用流程