Java 内存分配和泄露

Java 内存分配策略

Java 程序运行时的内存分配策略有三种, 分别是静态分配, 栈式分配, 和堆式分配,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。

阅读更多

IntelliJ 各种快捷键

工欲善其事必先利其器,花一点时间,记录一下 Intellij 各种快捷键。

阅读更多

HashMap 原理(JDK 1.7)

JDK 1.8 对 HashMap 改进很多,1.8 中已经移除了 Entry 的这种实现方式了,改用了 Node,所以存储结构也发生了很大的变化,代码也从 1k 行膨胀到了 2k 行,这次梳理的是 1.7 的 HashMap 实现。1.8 下次再详细看看。

HashMap 继承 AbstractMap,实现了 Map 接口。

阅读更多

面向报文(UDP)和面向字节流(TCP)的区别

面向报文的传输方式是应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则 IP 层需要分片,降低效率。若太短,会是 IP 太小。UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。

阅读更多

MySQL EXPLAIN

MySQL EXPLAINN

EXPLAIN 用来查看MySQL执行一个SQL语句的执行计划。

阅读更多

Java NIO 学习(一)

Java 1.4之后引入了NIO框架。

Java NIO: Channels and Buffers(通道和缓冲区)
标准的IO是在字节流和字符流进行操作。NIO在通道(Channel)和缓冲区(Buffer)进行操作。数据总是从通道读取到缓冲区里,或者从缓冲区写入到通道里。

Java NIO: Asynchronous IO(异步IO)
NIO可以做异步IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情。当数据被写入到缓冲区时,线程可以继续处理它。从缓冲区写入通道也类似。

Java NIO: Selectors(选择器)
Java NIO包含了选择器的概念。选择器用于监听多个通道的事件(比如:连接打开,数据达到)。因此,单个的线程可以监听多个数据通道。

阅读更多

Java 网络 学习笔记

UDP套接字

UDP实际上实现了两个功能:
1、在IP之上补充了端口的概念
2、对数据传输过程进行错误检测,并抛弃损坏的数据

UDP使用前,不需要连接,不保证信息一定成功送达,不保证发送顺序和接收顺序(所以使用UDP需要处理信息丢失和顺序重排)。

根据以上特性,UDP使用效率比TCP高。因为不需要创建连接,不需要像TCP一样保证可靠的字节流。

Java使用 DatagramSocket 来发送和接收数据 、DatagramPacket 为数据载体。

阅读更多

ThreadLocal 笔记

作用

ThreadLocal不是用来解决共享对象访问的多线程访问问题,而是用于解决不同线程保持各自独立的一个对象。
典型的问题就是:当一个单例A持有某个属性对象a.b时,如果a.b在多个方法里面使用,就有可能造成线程不安全,如果把b定义成 ThreadLocal<B> b 就可以避免以上问题。

阅读更多

Java Thread 思维导图

整理一份Java Thread的思维导图,持续更新中…

阅读更多

Java经典设计模式(3):十一种行为型模式(附实例和详解)

行为型模式细分为如下11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
接下来对11种行为型模式逐个进行介绍。

一、策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类,视实际需求是否添加),提供辅助函数。

首先统一接口:

1
2
3
4
5
package com.model.behaviour;
public interface ICalculator {
public int calculate(String exp);
}

辅助类:

1
2
3
4
5
6
7
8
9
10
11
12
package com.model.behaviour;
public abstract class AbstractCalculator {
public int[] split(String exp, String opt) {
String array[] = exp.split(opt);
int arrayInt[] = new int[2];
arrayInt[0] = Integer.parseInt(array[0]);
arrayInt[1] = Integer.parseInt(array[1]);
return arrayInt;
}
}

阅读更多