1.idea常用快捷键

详细可参考 :史上最全的IDEA快捷键总结

快捷键

功能

CTRL + D

向下复制一行

CTRL + ↑ or ↓

与上一行or下一行进行交换

ATL + 左键长按

跨行选取

ATL + Shift + 左键单击

多行光标

CTRL + ATL + L

格式化代码

CTRL + Shift + 加号 or 减号

展开 or 折叠 全部代码

Ctrl + Shift + Z

取消撤销

Alt + Insert

生成代码(如GET,SET方法,构造函数等)

fori

生成for循环for (int i = 0; i< ; i++) { }

Alt + F7

选取全部代码中的同一个变量名

Ctrl + P

方法参数提示

2.命名规则

类型

规范

类名

首字母大写

方法名

首字母小写,驼峰

变量名

首字母小写

常量名

全部大写

3.个人混淆的知识点

3.1 Scanner输入流

//声明输入流实例
Scanner scanner = new Scanner(System.in);
​
//next :读取到空格前 , 如输入 hello world ,next仅能读取到hello
String str = scanner.next()
​
//nextLine : 读取到换行前 , 如在同一行输入 hello world , nextLine可以读取完hello world
String str = scanner.nextLine()

3.2 可变参数

定义方法时,形参不确定具体个数时,可使用可变参数

方法:在 形参类型 后加...

//可传递多个int型参数
public static int add(int... x){}

要求:一个方法中只能指定一个可变参数,且任何普通参数必须在它之前声明

public static int add(float a,int...b){}

3.3 数组

Java风格 :int[] arr = new int[10];

C风格:int arr[] = new int[10];

4. 字符串相关

4.1 StringBuilder

方法 :

名称

作用

.append("demo")

将字符串demo添加到容器中

.reverse()

将对象进行反转

.length()

获取字符串长度

.toString()

转为String类型

示例:

StringBuilder sb = new StirngBuilder();
//添加
sb.append("demo");
//反转
sb.reverse(); //结果为 omed
//求长度
sb.length(); //结果为4

使用场景:

①字符串的拼接

②字符串的反转

③reverse可用于判断是否为对称字符串

4.2.StringJoiner

构造方法:

方法名

作用

StringJoiner("间隔符号")

使用add拼接时,中间带 间隔符号

StringJoiner("间隔符号" , "开始符号" , "结束符号")

使用add拼接时,中间带 间隔符号 ,最左侧带 开始符号 ,最右侧带 结束符号

5.集合

5.1 集合与数组的对比

数组 :长度不可变;可以存储 基本数据类型 和 引用数据类型

集合:长度可变;只能存储 引用数据类型 (想在集合中存储基本数据类型,要装箱再存储,如int封装为Integer)

5.2 创建集合

语法:ArraryList<泛型> 变量名 = new ArraryList<泛型>();

其中泛型定义了该集合中的数据类型是什么,注意泛型是 Integer 或 引用数据类型的

5.3 成员方法

方法名

说明

boolean add(E e)

添加元素,返回值表示是否插入成功

boolean remove(E e)

删除指定元素 ,返回值表示是否删除成功

E.remove(int index)

删除指定下标的元素,返回被删除的元素

E.set(int index,E e)

修改指定下标的元素,返回原来的元素值

E.get(int index)

获取指定下标的元素

int size()

集合的长度,即集合中的元素个数

6.常用API

14.1 Math

方法名

说明

.abs(int a)

a的绝对值

.ceil(double a)

向上取整

.floor(double a)

向下取整

.round(float a)

四舍五入

.max(int a , int b)

a、b中最大的一个

.pow(double a , double b)

a的b次方

.sqrt(int a)

开a的平方根

.cbrt(int a)

开a的立方根

random()

随机值 ,范围为[0.0 , 1,0)

注意点:

  • 由于int类型的取值范围为 -2147483648 ~ 21474836477,使用abs传入-2147483648 ,则会出现错误的计算结果-2147483648

  • 使用Math.random()获取整数的随机数方法为 ,Math.floor(Math.random() * 100) + 1 , 即[1,100]的随机数

6.2 System

方法名

说明

.exit(int status)

终止运行jvm 当status为0时,代表正常终止虚拟机 当status非0时,代表异常终止虚拟机

.currentTimeMillis()

返回 当前时间 - 1970/1/1 8:00:00 的时间差 ,单位为毫秒

.arraycopy(A , A_index, B , B_index , length)

从数组A的A_index下标开始复制length个元素,粘贴到数组B的B_index下标处

注意点:

  • 使用currentTimeMillis计算程序运行耗费的时间

    long start = System.currentTimeMillis(); //运行代码前
    /*
    * 运行代码
    */
    long end = System.currentTimeMillis(); //运行代码后
    ​
    long time = end - start; //得到起始的时间差,即为程序运行所耗费的时间
  • 使用arraycopy拷贝数组时,若A,B数组为基本数据类型,则必须保持一致(如A,B均为int型数组,不一致会报错) 若A,B数组为结构体类型,也需要保持类型一致,但子类可以复制给父类(如A的数组类型 extend B的数组类型,则A可复制给B)

6.3 Runtime

该api的构造函数源码如下

    private static Runtime currentRuntime = new Runtime(); //2.源码为我们声明了一个唯一的Runtime类型的对象
    
    public static Runtime getRuntime() {  //3.通过getRuntime方法将唯一的Runtime类型的对象返回 ,供我们使用
        return currentRuntime;
    }
​
    private Runtime() {} // 1.构造函数是私有的 ,所以无法声明新对象

这样做的原因:Runtime描述的是当前系统运行环境,所以需要唯一性

方法名

说明

Runtime.getRuntime()

获取当前系统的运行环境对象

使用以下方法时,要先用Runtime.getRuntime()获取到runtime对象

.exit(int status)

停止虚拟机

.availableProcessors()

获得CPU的线程数

.maxMemory()

jvm 从系统中获取的总内存大小(单位byte)

.totalMemory()

jvm 已经 从从系统中获取的内存大小(单位byte)

.freeMemory()

jvm剩下的内存大小(单位byte)

.exec(String command)

运行cmd命令

6.4 Object

Object类是所有类的父类,仅有空参构造方法

常用方法如下

方法名

说明

.toString(变量A)

将 变量A 转化为 字符串类型

A.equals(变量B)

比较A与B是否相等(默认比较的是地址值)

注意点:

  • 当给toString()方法传入对象类型时,调用println打印出来的结果是“包名+@+地址值” 。若想打印出来对象的成员变量,可在该类中重写toString()

  • Object类中的equals()方法,默认比较的地址值,而实际使用中比较地址值无意义,所以可以在该类中重写equals方法

面试题:

//声明String类型和StringBuilder两个字符串
String str1 = "abc";
StringBuilder str2 = new StringBuilder("abc");
​
//问:两者调用equals方法结果是什么?
str1.equals(str2);
str2.equals(str1);
​
//答:两者的结果都是false
//原因:
//1.String类中有重写equals方法,该方法会先判断str1和str2的地址值(即是不是同一对象),若是则可以直接返回true;然后会判断str2是否为String的实例,不是则直接返回false;最后才对str1和str2进行逐个字符对比,均相等则返回true,不等则返回false
//2.StringBuilder类没有重写equals方法,则默认为Object类中的equals方法(对比地址值)


6.5 浅克隆和深克隆

应用场景:如一个服务器不够用户使用,可通过克隆的方式,将一部分的用户信息克隆到第二台服务器上

使用方法:①在Java bean类中先implements Cloneable

②在Java bean类中重写Object类中的Clone方法,最后在该方法中调用super.clone()

代码实现:

//Cloneable为标记型接口,若未标记则该类无法被clone
public class User implements Cloneable {
    private int id;
    
    public User() {
    }
​
    public User(int id, String name, String password, String path, int[] data) {
        this.id = id;
    }
​
    public int getId() {
        return id;
    }
​
    //重写Object中的clone方法:使protected修饰的clone方法可以被调用
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

克隆策略:

  • 浅克隆:基本数据类型复制值,引用数据类型直接复制地址值

  • 深克隆:基本数据类型复制值,字符串类型复制地址值,引用数据类型创建新的对象存储原来的数据

Object的clone是浅克隆

重写clone方法或使用第三方工具类实现深克隆

6.6 BigInteger

构造方法

  • BigInteger BI = new BigInteger(int num , Random r) : 创建一个随机大整数,范围为[0,2^num-1]

  • BigInteger BI = new BigInteger(String num) : 将num转为整数(注意该字符串只能为整数)

  • BigInteger BI = new BigInteger(String num , int radix) : 将num以radix进制来转为大整数

  • BigInteger BI = BigInteger.valueOf(int num) : 将num转为大整数,该静态方法在[-16,16]做了内存优化

注意事项

  • BigInteger 表示的数,没有超出Long范围,可用静态方法valueof获取

  • BigInteger 表示的数,已经超出Long范围,可用构造方法2获取

  • BigInteger 对象一旦创建,内部的值不会改变,BI.add(num)是新创建了一个BigInteger对象

成员方法

方法名

说明

BI.add(BigInterger num)

加法(BI+num)

BI.subtract(BigInterger num)

减法(BI-num)

BI.multply(BigInterger num)

乘法(BI*num)

BI.divide(BigInterger num)

除法(BI/num)

BI.divideAndRemainder(BigInterger num)

商和余(返回值为数组,第一个为商、第二个为余)

BI.equals(Object num)

比较BI和num是否相同

BI.pow(int num)

次幂(BI^num)

BI.max/min(BigInterger num)

返回BI和num中的最大值/最小值

BI.intValue()

将BI转为int型

底层逻辑

  • int[] mag: 存储绝对值的字节数组。数组的每个元素存储一个 32 位整数,数组中的高位在前(大端序)。

  • int signum: 存储整数的符号,取值为 -1(负数)、0(零)、1(正数)。

6.7 BigDecimal

浮点数使用 有限位数的二进制 来表示,由于尾数部分长度有限,所以超出的部分只能舍弃,故导致了计算精度的下降

6.8 Arrays

方法名

说明

Arrays.toString( 数组 )

将数组转为字符串

Arrays.binarySearch( 数组, 要查找的元素)

返回该元素的下标

Arrays.copyOf( 原数组, length )

返回 一个长度为length的新数组( 内容复制原数组的)

Arrays.copyOfRange( 原数组, left, right)

返回原数组的[left, right)的子串

Arrays.fill( 数组, x )

将 值x 填充到数组中

Arrays.sort( 数组 )

将 数组 升序排列

int[] arr = {8,1,6,3,9,2,5,4,7};
​
// 转为数组
System.out.println(Arrays.toString(arr));
​
// 查找元素
System.out.println( Arrays.binarySearch(arr, 6));
​
// 拷贝
System.out.println(Arrays.toString(Arrays.copyOf(arr, 9)));
System.out.println(Arrays.toString(Arrays.copyOfRange(arr, 2, 5)));
​
// 排序
Arrays.sort(arr);   // 修改的是原数组,返回void. 升序( 插入排序  + 二分查找 )
System.out.println(Arrays.toString(arr));
// 填充元素
Arrays.fill(arr, 99);   // 修改的是原数组,返回void
System.out.println(Arrays.toString(arr));