最近在初步了解Docker,想把 Spring Boot 项目构建成镜像。先介绍下Docker的基本情况。

Docker是什么

Docker是一种开源的应用引擎,使用Go语言开发的。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。目前,Docker可以在容器内部快速自动化部署应用,并可以通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率,并且提升诸如IO等方面的性能。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

阅读全文 »

声明:本文使用JDK1.8

HashMap 是我们平时开发过程中使用最多的 Java 集合框架之一,它继承 AbstractMap,实现 Map 接口,是一种 key-value,并允许使用空值和空键。

1
2
public class HashMap<KV> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable {
阅读全文 »

本文是《深入理解Java虚拟机:JVM高级特性与最佳实践(第二版》读书笔记。

概述

Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。
对于Java开发人员来说,不需要像C++程序员那样去管理内容回收的事情,Java虚拟机会干这些事情。

运行时数据区域

阅读全文 »

声明:本文使用JDK1.8

先看下List在Collection中的框架图:

ArrayList源码分析

大家基本都知道ArrayList的底层是数组的数据结构,下面来看下它的随机访问、删除等的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
private static final int DEFAULT_CAPACITY = 10;//初始容量为10
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size;
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//ArrayList扩容函数方法
private void ensureExplicitCapacity(int minCapacity) {
modCount++;

// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// 计算当前ArrayList大小
int oldCapacity = elementData.length;
//这里我们可以看出,ArrayList每次扩容是增加50%,oldCapacity >> 1是指往左移一位,也就是除以2
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
//根据下标index获取元素值
public E get(int index) {
rangeCheck(index);//检查小标是否越界
return elementData(index);
}
//将index位置的值设为element,并返回原来的值
public E set(int index, E element) {
rangeCheck(index);

E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
//向数组中末尾增加一个元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//向指定位置index处增加element
public void add(int index, E element) {
rangeCheckForAdd(index);

ensureCapacityInternal(size + 1); // Increments modCount!!
//将index以及index之后的数据复制到index+1的位置往后,即从index开始向后挪了一位
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
//根据指定的index,删除元素
public E remove(int index) {
rangeCheck(index);

modCount++;
E oldValue = elementData(index);

int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work

return oldValue;
}
阅读全文 »

欢迎指正。

今天看到GET/POST/PUT,就想了解下这些的区别。HTTP方法有这几种:GET,POST,PUT和DELETE。

HTTP方法

GET

获取信息。GET请求必须是安全且幂等的,这意味着无论使用相同参数重复多少次,结果都是一样的。对于网上说的,GET请求有长度限制,其实,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。对GET的URL长度限制的是浏览器,这里的限制是URL,而不是参数的限制。

阅读全文 »

声明:本文使用JDK1.8

在Java中,对于字符串的操作有这三种:String、StringBuilder、StringBuffer。这三者的效率是:StringBuilder > StringBuffer > String。

1
2
3
4
5
6
7
8
9
String a = "abc";
a = a + "d";
System.out.println(a);
StringBuffer buffer = new StringBuffer();
buffer.append("a");
System.out.println(buffer);
StringBuilder builder = new StringBuilder();
builder.append("b");
System.out.println(builder);
阅读全文 »

方法

检查参数的有效性

绝大多数方法和构造器对于传递给它们的参数值都会有某些限制。例如,索引值必须是非负数,对象引用不能为null,等等,这些都是很常见的。对于参数的校验,可以使用 @NotNull

必要时进行保护性拷贝

谨慎设计方法签名

慎用重载

在Java中,参数类型或者个数不一样,对返回参数没有要求,叫做重载。

阅读全文 »

类和接口

使类和成员的可访问性最小化

1、尽可能地使每个类或者成员不被外界访问。换句话说,应该使用与你正在编写的软件的对应功能相一致的、尽可能最小的访问级别。例如,想在实体类的中,使用private定义属性值。

在公有类中使用访问方法而非公有域

使可变性最小化

不要提供任何会修改对象状态的方法(也称为 mutator)

阅读全文 »

最近比较空,就抽时间看了《Efffectice Java》这本书,虽然这本书的第二版和现在的Java版本有点老了,但是看了一遍后,感觉,其中的一些思想,平时写代码的时候需要注意的地方,还是讲的不错的。

用静态工厂方法代替构造器

对于Map的new,在Java的后面的版本中,已经修改了,不需要如书上说的创建一个newMap的静态工厂类,可以如下进行创建一个新的Map:

阅读全文 »

声明:本文使用JDK1.8

Java8提供了丰富的lambda的API。今天我们来讲讲关于其中的stream(流的操作)。对于List集合,有了stream的流操作,感觉如虎添翼。

生成一个List

1
2
3
4
5
6
7
String str = "1,2,3,4,10,11,9,66,222,12";
List<Integer> list = Stream.of(str.split(","))
.map(Integer::valueOf)
.filter(x-> !Objects.equals(x,3))
.sorted(Comparator.reverseOrder())
.limit(4)
.collect(Collectors.toList());
阅读全文 »
0%