核心思想:通过反射设置integer的value属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

public class Swap {
public static void main(String[] args) {
Integer i1 = 1;
Integer i2 = 2;
System.out.println("before:" + "i1:" + i1+ "- i2:" + i2) ;
swap(i1,i2);
System.out.println("after:" + "i1:" + i1+ "- i2:" + i2) ;

System.out.println(new Integer(1) == i1);

}
public static void swap(Integer i1,Integer i2) {
try {
Field field = Integer.class.getDeclaredField("value");
field.setAccessible(true);
int tmp = i1.intValue();
field.setInt(i1,i2);
field.setInt(i2,tmp);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

强引用

强引用在对象不被使用时,并且也发生了gc,但是也不会被回收,直到发生oom

1
2
3
4
5
6
7
8
9
10
/**
* 强引用
*/
public static void strongRef() {
Object strongObj = obj;
obj = null;
System.gc();
System.out.println(strongObj);
}
java.lang.Object@677327b6

软引用

软引用在即将发生OOM时,会对没有使用的对象回收。

1
2
3
4
5
6
7
8
9
10
11
/**
* 软引用
*/
public static void softRef() {
Object softObj = new Object();
SoftReference softReference = new SoftReference(softObj);
softObj = null;
System.gc();
System.out.println(softReference.get());
}
java.lang.Object@677327b6

弱引用

发生GC时,就会对没有使用的对象进行回收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 弱引用
*/
public static void weakRef() {
Object weakObj = new Object();
WeakReference weakReference = new WeakReference(weakObj);
weakObj = null;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.gc();;
System.out.println(weakReference.get());
}
java.lang.Object@677327b6
null

虚引用

虚引用不管在使用时还是未使用时直接取值都会是null,但是对象未被使用时(=null)会将对象放入到queue中。如果对象还在使用,则不放入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* 虚引用
*/
public static void phantomRef() {
Object o = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference phantomReference = new PhantomReference(o, queue);
o = null;
System.gc();
System.out.println(phantomReference.get());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(queue.poll());
}
null
java.lang.ref.PhantomReference@677327b6

1
2
3
4
int [] a = new int[]{6,3,7,9};
Integer[] integers = Arrays.stream(a).boxed().toArray(Integer[]::new);
System.out.println(Arrays.toString(integers));

下载get-pip.py

1
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"

执行get-pip.py

1
python get-pip.py

安装pip

1
pip install --upgrade pip

安装shadowsocks

1
pip install shadowsocks

配置文件

1
2
3
4
5
6
7
8
vi /etc/shadowsocks.json

{
"server": "0.0.0.0",
"server_port": 2018,
"password": "12345678",
"method": "aes-256-cfb"
}

启动shadowsocks

1
ssserver -c /etc/shadowsocks.json -d start

关闭防火墙

1
2
systemctl stop firewalld.service

关闭shadowsocks

1
ssserver -c /etc/shadowsocks.json -d stop 

A Java Coder, live in BeiJing, China.
GitHub:BraveHeart
QQ:318635503

自动代码

常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码 。

例如:要输入for(User user : users)只需输入user.for+Tab;

再比如:要输入Date birthday = user.getBirthday()只需输入user.getBirthday().var+Tab即可。

代码标签输入完成后,按Tab,生成代码。

  1. Ctrl+Alt+O 优化导入的类和包
  2. Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate)
  3. fori/sout/psvm + Tab
  4. Ctrl+Alt+T 生成try catch 或者 Alt+enter
  5. CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
  6. Ctrl + O 重写方法
  7. Ctrl + I 实现方法
  8. Ctr+shift+U 大小写转化
  9. ALT+回车 导入包,自动修正
  10. ALT+/ 代码提示
  11. CTRL+J 自动代码
  12. Ctrl+Shift+J,整合两行为一行
  13. CTRL+空格 代码提示
  14. CTRL+SHIFT+SPACE 自动补全代码
  15. CTRL+ALT+L 格式化代码
  16. CTRL+ALT+I 自动缩进
  17. CTRL+ALT+O 优化导入的类和包
  18. ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
  19. CTRL+E 最近更改的代码
  20. CTRL+ALT+SPACE 类名或接口名提示
  21. CTRL+P 方法参数提示
  22. CTRL+Q,可以看到当前方法的声明
  23. Shift+F6 重构-重命名 (包、类、方法、变量、甚至注释等)
  24. Ctrl+Alt+V 提取变量

查询快捷键

Ctrl+Shift+Backspace可以跳转到上次编辑的地
CTRL+ALT+ left/right 前后导航编辑过的地方
ALT+7 靠左窗口显示当前文件的结构
Ctrl+F12 浮动显示当前文件的结构
ALT+F7 找到你的函数或者变量或者类的所有引用到的地方
CTRL+ALT+F7 找到你的函数或者变量或者类的所有引用到的地方
Ctrl+Shift+Alt+N 查找类中的方法或变量
双击SHIFT 在项目的所有目录查找文件
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
CTRL+G 定位行
CTRL+F 在当前窗口查找文本
CTRL+SHIFT+F 在指定窗口查找文本
CTRL+R 在 当前窗口替换文本
CTRL+SHIFT+R 在指定窗口替换文本
ALT+SHIFT+C 查找修改的文件
CTRL+E 最近打开的文件
F3 向下查找关键字出现位置
SHIFT+F3 向上一个关键字出现位置
选中文本,按Alt+F3 ,高亮相同文本,F3逐个往下查找相同文本
F4 查找变量来源
CTRL+SHIFT+O 弹出显示查找内容
Ctrl+W 选中代码,连续按会有其他效果
F2 或Shift+F2 高亮错误或警告快速定位
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+B 快速打开光标处的类或方法
CTRL+ALT+B 找所有的子类
CTRL+SHIFT+B 找变量的类
Ctrl+Shift+上下键 上下移动代码
Ctrl+Alt+ left/right 返回至上次浏览的位置
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者// )
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
Alt+F1 查找代码所在位置
Alt+1 快速打开或隐藏工程面板
Alt+ left/right 切换代码视图
ALT+ ↑/↓ 在方法间快速移动定位
CTRL+ALT+ left/right 前后导航编辑过的地方
Ctrl+Shift+Backspace可以跳转到上次编辑的地
Alt+6 查找TODO

其他快捷键

SHIFT+ENTER 另起一行
CTRL+Z 倒退(撤销)
CTRL+SHIFT+Z 向前(取消撤销)
CTRL+ALT+F12 资源管理器打开文件夹
ALT+F1 查找文件所在目录位置
SHIFT+ALT+INSERT 竖编辑模式
CTRL+F4 关闭当前窗口
Ctrl+Alt+V,可以引入变量。例如:new String(); 自动导入变量定义
Ctrl+~,快速切换方案(界面外观、代码风格、快捷键映射等菜单)

svn快捷键

ctrl+k 提交代码到SVN
ctrl+t 更新代码

调试快捷键

其实常用的 就是F8 F7 F9 最值得一提的就是Drop Frame 可以让运行过的代码从头再来。

alt+F8 debug时选中查看值
Alt+Shift+F9,选择 Debug
Alt+Shift+F10,选择 Run
Ctrl+Shift+F9,编译
Ctrl+Shift+F8,查看断点
F7,步入
Shift+F7,智能步入
Alt+Shift+F7,强制步入
F8,步过
Shift+F8,步出
Alt+Shift+F8,强制步过
Alt+F9,运行至光标处
Ctrl+Alt+F9,强制运行至光标处
F9,恢复程序
Alt+F10,定位到断点

重构

Ctrl+Alt+Shift+T,弹出重构菜单
Shift+F6,重命名
F6,移动
F5,复制
Alt+Delete,安全删除
Ctrl+Alt+N,内联

十大Intellij IDEA快捷键

Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论。每个人都有自己的最爱,想排出个理想的榜单还真是困难。

以前也整理过Intellij的快捷键,这次就按照我日常开发时的使用频率,简单分类列一下我最喜欢的十大快捷-神-键吧。

1 智能提示:

Intellij首当其冲的当然就是Intelligence智能!基本的代码提示用Ctrl+Space,还有更智能地按类型信息提示Ctrl+Shift+Space,但因为Intellij总是随着我们敲击而自动提示,所以很多时候都不会手动敲这两个快捷键(除非提示框消失了)。

用F2/ Shift+F2移动到有错误的代码,Alt+Enter快速修复(即Eclipse中的Quick Fix功能)。当智能提示为我们自动补全方法名时,我们通常要自己补上行尾的反括号和分号,当括号嵌套很多层时会很麻烦,这时我们只需敲Ctrl+Shift+Enter就能自动补全末尾的字符。而且不只是括号,例如敲完if/for时也可以自动补上{}花括号。

最后要说一点,Intellij能够智能感知Spring、Hibernate等主流框架的配置文件和类,以静制动,在看似“静态”的外表下,智能地扫描理解你的项目是如何构造和配置的。

2 重构:

Intellij重构是另一完爆Eclipse的功能,其智能程度令人瞠目结舌,比如提取变量时自动检查到所有匹配同时提取成一个变量等。尤其看过《重构-改善既有代码设计》之后,有了Intellij的配合简直是令人大呼过瘾!也正是强大的智能和重构功能,使Intellij下的TDD开发非常顺畅。

切入正题,先说一个无敌的重构功能大汇总快捷键Ctrl+Shift+Alt+T,叫做Refactor This。按法有点复杂,但也符合Intellij的风格,很多快捷键都要双手完成,而不像Eclipse不少最有用的快捷键可以潇洒地单手完成(不知道算不算Eclipse的一大优点),但各位用过Emacs的话就会觉得也没什么了(非Emacs黑)。

此外,还有些最常用的重构技巧,因为太常用了,若每次都在Refactor This菜单里选的话效率有些低。比如Shift+F6直接就是改名,Ctrl+Alt+V则是提取变量。关注Java技术栈微信公众号,在后台回复关键字:IDEA,可以获取一份栈长整理的 IDEA 最新技术干货。

3 代码生成:

这一点类似Eclipse,虽不是独到之处,但因为日常使用频率极高,所以还是罗列在榜单前面。常用的有fori/sout/psvm+Tab即可生成循环、System.out、main方法等boilerplate样板代码,用Ctrl+J可以查看所有模板。

后面“辅助”一节中将会讲到Alt+Insert,在编辑窗口中点击可以生成构造函数、toString、getter/setter、重写父类方法等。这两个技巧实在太常用了,几乎每天都要生成一堆main、System.out和getter/setter。

另外,Intellij IDEA 13中加入了后缀自动补全功能(Postfix Completion),比模板生成更加灵活和强大。例如要输入for(User user : users)只需输入user.for+Tab。再比如,要输入Date birthday = user.getBirthday();只需输入user.getBirthday().var+Tab即可。

4 编辑:

编辑中不得不说的一大神键就是能够自动按语法选中代码的Ctrl+W以及反向的Ctrl+Shift+W了。此外,Ctrl+Left/Right移动光标到前/后单词,Ctrl+[/]移动到前/后代码块,这些类Vim风格的光标移动也是一大亮点。以上Ctrl+Left/Right/[]加上Shift的话就能选中跳跃范围内的代码。Alt+Forward/Backward移动到前/后方法。还有些非常普通的像Ctrl+Y删除行、Ctrl+D复制行、Ctrl+折叠代码就不多说了。

关于光标移动再多扩展一点,除了Intellij本身已提供的功能外,我们还可以安装ideaVim或者emacsIDEAs享受到Vim的快速移动和Emacs的AceJump功能(超爽!)。

另外,Intellij的书签功能也是不错的,用Ctrl+Shift+Num定义1-10书签(再次按这组快捷键则是删除书签),然后通过Ctrl+Num跳转。这避免了多次使用前/下一编辑位置Ctrl+Left/Right来回跳转的麻烦,而且此快捷键默认与Windows热键冲突(默认多了Alt,与Windows改变显示器显示方向冲突,一不小心显示器就变成倒着显式的了,冏啊)。

5 查找打开:

类似Eclipse,Intellij的Ctrl+N/Ctrl+Shift+N可以打开类或资源,但Intellij更加智能一些,我们输入的任何字符都将看作模糊匹配,省却了Eclipse中还有输入*的麻烦。最新版本的IDEA还加入了Search Everywhere功能,只需按Shift+Shift即可在一个弹出框中搜索任何东西,包括类、资源、配置项、方法等等。

类的继承关系则可用Ctrl+H打开类层次窗口,在继承层次上跳转则用Ctrl+B/Ctrl+Alt+B分别对应父类或父方法定义和子类或子方法实现,查看当前类的所有方法用Ctrl+F12。

要找类或方法的使用也很简单,Alt+F7。要查找文本的出现位置就用Ctrl+F/Ctrl+Shift+F在当前窗口或全工程中查找,再配合F3/Shift+F3前后移动到下一匹配处。

Intellij更加智能的又一佐证是在任意菜单或显示窗口,都可以直接输入你要找的单词,Intellij就会自动为你过滤。 关注Java技术栈微信公众号,在后台回复关键字:IDEA,可以获取一份栈长整理的 IDEA 最新技术干货。

6 其他辅助:

以上这些神键配上一些辅助快捷键,即可让你的双手90%以上的时间摆脱鼠标,专注于键盘仿佛在进行钢琴表演。这些不起眼却是至关重要的最后一块拼图有:

Ø 命令:Ctrl+Shift+A可以查找所有Intellij的命令,并且每个命令后面还有其快捷键。所以它不仅是一大神键,也是查找学习快捷键的工具。

Ø 新建:Alt+Insert可以新建类、方法等任何东西。

Ø 格式化代码:格式化import列表Ctrl+Alt+O,格式化代码Ctrl+Alt+L。

Ø 切换窗口:Alt+Num,常用的有1-项目结构,3-搜索结果,4/5-运行调试。Ctrl+Tab切换标签页,Ctrl+E/Ctrl+Shift+E打开最近打开过的或编辑过的文件。

Ø 单元测试:Ctrl+Alt+T创建单元测试用例。

Ø 运行:Alt+Shift+F10运行程序,Shift+F9启动调试,Ctrl+F2停止。

Ø 调试:F7/F8/F9分别对应Step into,Step over,Continue。

此外还有些我自定义的,例如水平分屏Ctrl+|等,和一些神奇的小功能Ctrl+Shift+V粘贴很早以前拷贝过的,Alt+Shift+Insert进入到列模式进行按列选中。

Ø Top #10切来切去:Ctrl+Tab

Ø Top #9选你所想:Ctrl+W

Ø Top #8代码生成:Template/Postfix +Tab

Ø Top #7发号施令:Ctrl+Shift+A

Ø Top #6无处藏身:Shift+Shift

Ø Top #5自动完成:Ctrl+Shift+Enter

Ø Top #4创造万物:Alt+Insert

太难割舍,前三名并列吧!

Ø Top #1智能补全:Ctrl+Shift+Space

Ø Top #1自我修复:Alt+Enter

Ø Top #1重构一切:Ctrl+Shift+Alt+T

CTRL+ALT+ left/right 前后导航编辑过的地方
Ctrl+Shift+Backspace可以跳转到上次编辑的地方

下载jdk压缩包

链接:https://pan.baidu.com/s/1As4LjS8FrunJhkP16B9Xdg
提取码:79es
复制这段内容后打开百度网盘手机App,操作更方便哦

将jdk压缩包上传至centos7中

1
rz

解压jdk压缩包

1
2
tar -zxvf jdk-8u231-linux-x64.tar.gz 

配置环境变量

1
vim /etc/profile

将下面的代码复制到最后:
将第一行中路径修改为解压后的jdk目录位置

1
2
3
4
5
export JAVA_HOME=/usr/java/jdk/jdk1.8.0_231

export PATH=$JAVA_HOME/bin:$PATH

exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

普通安装

下载安装包

1
wget http://download.redis.io/releases/redis-5.0.7.tar.gz

解压文件

1
tar -zxvf redis-5.0.7

编译

1
2
3
4
cd redis-5.0.7

make

编译可能出现的问题

1
2
3
4
5
make[1]: [persist-settings] Error 2 (ignored)
CC adlist.o

出现该问题时:错误是因为一些依赖包未安装
yum -y install gcc gcc-c++ libstdc++-devel 解决
1
2
3
4
5
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
#include <jemalloc/jemalloc.h>

出现该问题时:make MALLOC=libc 解决

redis设置登录密码

1
在redis.conf 配置文件添加`requirepass`属性保存

redis设置后台启动

1
在redis.conf 配置文件设置`daemonize yes`属性保存

使用docker-compose安装redis

创建docker-compose.yml文件

1
2
3
4
5
6
7
8
9
10
version: '2'
services:
redis:
image: redis:5.0.5
container_name: redis
command: redis-server --requirepass 123456
ports:
- "16379:6379"
volumes:
- ./data:/data

启动docker-compose

1
docker-compose up -d

使用redis命令行客户端

1
2
3
4
5
6
先查看redis的容器id
docker ps
进入redis容器
docker exec -it 1742ad5e9da8 bash
启动redis客户端
redis-cli -h 127.0.0.1 -p 6379 -a 123456

查看当前文件夹所有文件的个数(不包括文件夹)

1
ls -l |grep "^-"|wc -l

查看当前文件夹所有目录的个数

1
ls -l |grep "^d"|wc -l

查看当前文件夹所有文件个数(包括子目录)

1
ls -lR|grep "^-"|wc -l

查看当前文件夹下所有目录的个数(包含子目录)

1
ls -lR|grep "^d"|wc -l
0%