IDEA快捷键
为什么要使用IDEA快捷键
-
在我们的实际开发过程中,掌握更多的快捷键,有利于我们快速编码,
-
前期我们已经使用了很长一段时间的Idea但是没有告诉大家快捷键,是因为希望大家多进行一些基础编码,敲键盘的过程,现阶段需要同学们掌握一些快捷键,跟上编码速度
-
熟悉了IDEA快捷键之后,能够大大提高我们自身的编码效率。
IDEA快捷键示例
alt + 回车 代码提示
ctrl + /; 单行注释/取消注释
ctrl + shift + / 多行注释/ 多行取消注释
shift + 回车 向下插入一行
ctrl + alt + 回车 向上插入一行
ctrl + d; 快速复制一行
ctrl + y; 快速删除一行
ctrl + 鼠标左键 代码跟踪
alt + 方向键左 跟踪上一个方法
alt + 方向键右 跟踪下一个编辑处
ctrl + shift + ↑ 快速上移代码
ctrl + shift + ↓ 快速下移代码
连续2次shift 查询jdk自带的类和自定义的类
ctrl + f 查找指定单词(可以替换指定的单词)
ctrl + shift + u 将选中的全大写/ 将选中的全小写
ctrl + o 查看继承的方法
ctrl + i 查看实现的方法
ctrl + h 查看继承关系
ctrl + shift + h 查看子类
alt + 7 查看本类存在的方法
ctrl + alt + L 快速格式化
alt + insert 自动生成代码
字符串相关类
什么是字符串?
字符串我们已经简单认识过了:""双引号中的数据就是字符串String类型的常量
它在Java中不属于基本数据类型, 而是引用类型,也称为类类型。
需要学习字符串的哪些东西?
-
学习字符串类String、StringBuilder、StringBuffer的底层原理,进而掌握使用场景。
-
学习字符串类String、StringBuilder、StringBuffer类的常用方法
使用字符类
1.String类
Java中使用String这个类描述字符串这种常量数\。
API中对java.lang.String类的描述:
通过api的查阅,知道String类在java.lang包中。
只要使用双引号\引用起来的数据都是一个String对象。
String类中所有字符串常量,一旦书写完成,它就是一个固定值,这个数据不能改变。
注意:字符串常量,它属于对象,但是它不是存储在堆空间中,而是存储在堆中的字符串常量池中。
字符串常量池中保存的就是所有的字符串数据。只要我们书写了双引号,不管双引号中间是什么数据,
这些数据都会立刻在字符串常量池中保存,并且一直存在,不会被改变。
1. String代码解读
String str1 = null;// 表示str1没有引用地址 String str2 = "";// 表示str2对象引用了在常量池中创建了一个空字符串常量 String str3 = new String();// 表示str3对象引用了在堆中创建了一个空字符串常量
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
2. 字符串常量池
(1) 当第一次使用String str = "A"; 的方式赋值,会将该字符串值【对象】放入到常量池
(2) 当再次使用String str1 = "A"; 的方式会先检查常量池是否有"A"值,
① 如果存在直接引用
② 如果不存在,会创建"A"放入常量池
(3) 字符串拼接
① 常量方式拼接,并直接使用赋值符号赋值,会检查常量池
② 变量方式拼接,不会检查常量池
String s1 = "A"+"BC";// 使用常量拼接,会检查常量区是否有拼接好的"ABC",如果有不会创建
String str = "A";
String s2 = str + "BC";// 使用变量拼接,不会检查常量区,而直在常量池接创建对象
3.String类常用方法
// 常用方法:
// 1.char charAt(int index) 返回 char指定索引处的字符。 不能超过下标范围
str = "我qunianmailegebiao";
char charAt = str.charAt(3);
System.out.println(charAt);
// 2.String concat(String str) 将指定的字符串连接到该字符串的末尾。 相当于:+
String concat = str.concat("大宝剑");
System.out.println("concat:" + concat);
System.out.println("str : " + str);
/*
* 3.boolean contains(CharSequence s) 判断当前对象是否包含连续的参数s。s可以是以下三个子类的对象
* CharSequence接口,包含下面子类:String、StringBuffer、StringBuilder
*/
str = "abcdefg";
boolean contains = str.contains("abc");//判断当前对象str是否包含连续的参数abc
System.out.println("是否包含:" + contains);
// 4.boolean endsWith(String suffix) 判断当前字符串是否以指定的后缀suffix结尾。(参数必须连续)
// 5.boolean startsWith(String prefix) 判断当前字符串是否以指定的前缀prefix开头。 (参数必须连续)
str = "黄某源和苍苍老师速8.avi";
boolean endsWith = str.endsWith(".avi");
System.out.println(endsWith);
/*
* 8.void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
* srcBegin:字符串开始下标
* srcEnd:字符串结束下标(不包含)
* dstBegin:数组dst的下标
* 将此字符串中的字符复制到目标字符数组dst中。 (含头不含尾)[srcBegin,srcEnd)
*/
str = "abceeeabcdefg";
char[] dst = new char[5];
str.getChars(2, 6, dst, 1);// 将字符串str中下标2开始到6结束【不包含6】的字符复制到数组dst中,从数组的下标1开始粘贴
System.out.println(Arrays.toString(dst));
// 9.int indexOf(String s) 返回s第一次在当前对象str中出现的索引 ,-1表示没有找到(注意:这里s必须也是匹配连续的字符串)
int indexOf = str.indexOf("abc");
System.out.println("下标:" + indexOf);
// 10.int indexOf(String s, int fromIndex) 返回s在当前对象指定下标fromIndex后第一次出现的索引 (str是作为一个整体匹配下标的)
int indexOf2 = str.indexOf("abc",4);
System.out.println("下标:" + indexOf2);
// 11.int lastIndexOf(String str) 返回指定子字符串最后一次出现的字符串中的索引。
// 12.int lastIndexOf(String str, int fromIndex) 返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向前搜索。
// 13.boolean isEmpty() 当 length()为 0时,返回 true 。
// 14.int length() 返回此字符串的长度。
// 15.boolean matches(String regex) 判断当前字符串对象是否匹配给定的正则表达式regex,通常用来进行权限限制,字符格式限制 一般用了做校验:如,用户名和密码的合法性
str = "abc";
String regex = "^[a-zA-Z]+$";// 匹配a-z或者A-Z之间任意多个字符
boolean matches = str.matches(regex);// 判断str是否满足a-z或者A-Z之间任意一个字符的要求
System.out.println("是否满足:" + matches);
/*
* 16.String replace(CharSequence target, CharSequence replacement) 将当前字符串中的target替换为replacement,通常用来和谐用语
* 父接口:CharSequence
* 该接口的实现类:String、StringBuffer、StringBuilder
*/
str = "WQNMLGB,你个DSB,我CNM";// WQNMLGB/DSB/CNM:和谐用语
String replace = str.replace("WQNMLGB", "*******");// *******,你个DSB,我CNM
System.out.println(replace);
String replace2 = replace.replace("DSB", "***");// *******,你个***,我CNM
System.out.println(replace2);
String replace3 = replace2.replace("CNM", "***");// *******,你个***,我CNM
System.out.println(replace3);
/**
* replace()和replaceAll(),replaceFirst()区别
* replace()只能匹配String、StringBuffer、StringBuilder对象
* replaceAll()和replaceFirst()可以匹配正则表达式,更灵活
* 如:
*/
// 17.String replaceAll(String regex, String replacement) regex是正则表达式,将当前字符串中的regex全部替换为replacement
str = "abc.efdg";
// regex = "\\.";// 正则表达式中的.表示匹配任意一个字符
// regex = "\\.";// 正则表达式中的\\.表示匹配一个.
regex = "a";// 表示匹配一个a
String replaceAll = str.replaceAll(regex, "#");
System.out.println("replaceAll=====》: " + replaceAll);
// 18.String replaceFirst(String regex, String replacement) 将当前字符串中的第一个regex替换为replacement
// 19.String[] split(String regex) 将当前字符串对象按照给定的正则表达式regex分割为String[]
str = "172.168.11.65;192.168.11.66;172.168.11.69;169.168.11.169;";
// 请将当前str中所有的ip地址打印出来
String[] split = str.split(";");
for (String s : split) {
System.out.println(s);
}
// 20.CharSequence subSequence(int beginIndex, int endIndex) 从当前字符串中beginIndex和endIndex之间截取子串(含头不含尾)
str = "12345678";
CharSequence subSequence = str.subSequence(1, 6);
System.out.println(subSequence);
// 21.String substring(int beginIndex) 从当前字符串中截取beginIndex到最后的子串
// 22.String substring(int beginIndex, int endIndex) 从当前字符串中beginIndex和endIndex之间截取子串(含头不含尾)
str = "172.168.11.65;192.168.11.66;172.168.11.69;169.168.11.169;";
// 请将字符串中ip是172开头的 最后一段打印出来
/*
* 思路:
* 1. 将字符串str先进行按照;分割
* 2. 遍历字符串数组,判断字符串以172开头的
* 3. 在以172的字符串中,再截取最后一个.后面的字符,打印
*/
String[] split2 = str.split(";");
// 遍历数组
for (String s : split2) {
System.err.println("s=========>" + s);
// 判断字符串以172开头的
if (s.startsWith("172")) {
System.err.println("172----:" + s);
// 先找出最后一个.的下标,int lastIndexOf(String str)
int index = s.lastIndexOf(".");
// 从最后一个点截取剩余字符串 :String substring(int beginIndex)
String substring = s.substring(index + 1);//+1是为了将字符串中的.去掉
System.err.println(substring);
}
}
// 23.char[] toCharArray() 将此字符串转换为新的字符数组。 方便遍历当前所有的字符
str = "abcdef";
char[] charArray = str.toCharArray();
for (char d : charArray) {
System.out.println(d);
}
// 24.String toUpperCase() 将此字符转换为全大写 一般用于验证码
// 25.String toLowerCase() 将此字符转换为全小写 一般用于验证码
String upperCase = str.toUpperCase();
System.out.println(upperCase);
// 26.String trim() 将当前字符串对象中字符前面和后面的空格去除 用了避免用户的一些不当输入
str = " asdlkjfal jfdaklfj dsalkj ";
String trim = str.trim();
System.out.println(trim);
// 27.static String valueOf(Object obj) 将其他类型转换为String对象
String valueOf = String.valueOf(1);// 这里其实是1的包装类Integer
System.out.println(valueOf);
2.StringBuffer类
1. StringBuffer概述
StringBuffer类,功能上基本上跟StringBuilder类相同,只是StringBuffer是线程安全的,相比较StringBuilder而言StringBuffer效率更低一点,要做线程处理。
2. StringBuffer中的常用方法参考下方的StringBuilder
3.StringBuilder类
1. StringBuilder概述:
StringBuilder基于可变的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程不安全的。
StringBuilder:
1)是一个字符串缓冲区,其实就是一个容器;
2)长度是可变的,任意类型都可以。注意:是将任意数据都转成字符串进行存储;
3)容器对象提供很多对容器中的数据操作的功能,比如添加,删除,修改,查询;
4)所有的数据最终都会变成一个字符串;
和数组最大的不同就是数组存储完可以单独操作每一个元素,每一个元素都是独立的。
字符串缓存区,所有存储的元素都会被转成字符串,而且变成了一个更长的字符串。
2. StringBuilder类的常用方法
1.构造方法
说明:
1.1 对于StringBuilder()构造方法,其初始容量为16个字符表示,如果存在StringBuilder的数据超过了16个字符,这个容器可以自动扩容(容器空间自动变大)。(经常使用)
解释:StringBuilder底层体现就是一个字符数组,StringBuilder类的对象将数组封装起来,然后对外提供很多便捷方法,而数组本身是没有什么太多方法的。如果外界将数据存放到底层的数组中,如果底层数组空间存放不下外界传递过来的值,那么jvm会基于原来存在的数组在创建一个新的数组,长度是原来数组的一倍,然后jvm将原来数组的数据全部复制(遍历数组,将数据添加到新的数组中)到新的数组中,然后在数组后面的空间中给数组添加新的值,如果还是存不下在创建一个新的数组。
1.2 对于StringBuilder(int capacity)构造函数来说,capacity表示容器的容量,如果在开发中想自己设置缓冲区大小,可以通过此构造函数来实现;
任何容器:它都围绕容器中的数据的 增 删 改 查\ 而设计的方法。
代码示例:
/*
* 构造方法:
* 1.StringBuilder() 构造一个没有字符的字符串构建器,初始容量为16个字符。
2.StringBuilder(CharSequence seq) 构造一个包含与指定的相同字符的字符串构建器 CharSequence 。
3.StringBuilder(int capacity) 构造一个没有字符的字符串构建器,
由 capacity参数指定的初始容量。 指定长度capacity可以节省了数组扩容时间
4.StringBuilder(String str)构造一个初始化为指定字符串内容的字符串构建器。
*
*/
StringBuilder sb = new StringBuilder();// 创建一个默认16个长度的char[]数组
StringBuilder sb2 = new StringBuilder("abc");// 创建一个19个长度的char[]数组
2.成员方法
代码示例:
/*
* 常用方法:
* 1. StringBuilder append(Object obj) 在队尾添加字符串
* 2. StringBuilder delete(int start, int end) 删除指定起始和结束位置之间的字符(含头不含尾)
* 3. StringBuilder deleteCharAt(int index) 删除指定下标处的字符
* 4. StringBuilder insert(int offset, Object obj) 在指定下标处插入一个任意类型数据
* 5. StringBuilder reverse()将字符串翻转
* 6. void setCharAt(int index, char ch) 修改指定下标处的字符为ch
7. void setLength(int newLength) 设置字符串长度是newLength
8. trimToSize() 将所有没有使用的数组空间去除 。 如果使用setLength,该方法无效
* 9. int capacity() 返回当前容量。(理论值)
10.public int length()返回长度(实际值,即已经存储的字符个数)
*/
// append方法
sb.append(true).append("abc");// 因为append方法返回值类型是StringBuilder,所以可以接着调用方法
System.out.println("sb = " + sb);// trueabc
// delete方法
sb.delete(0, 3);// 含头不含尾【下标】
System.out.println(sb);
// 3. StringBuilder deleteCharAt(int index) 删除指定下标处的字符
sb.deleteCharAt(0);
System.out.println(sb);
// insert
sb.insert(0,true).insert(0,"狼牙棒").insert(0, new Object());
System.out.println(sb);
// reverse()
sb.reverse();
System.out.println(sb);
// setCharAt()
sb.setCharAt(0, '插');// 将下标0处的字符修改为 插
System.out.println(sb);
// setLength()
// sb = new StringBuilder();
sb.setLength(1000);
System.out.println("设置后的长度:" + sb.length());
System.out.println("容量:" + sb.capacity());
System.out.println(sb);
// int capacity() 返回当前容量。
sb = new StringBuilder("abcd");//长度20
int capacity = sb.capacity();
System.out.println("容量:" + capacity);
System.out.println("==================");
// trimToSize() 将所有没有使用的数组空间去除
sb.trimToSize();
capacity = sb.capacity();
System.out.println("容量:" + capacity);
System.out.println("长度:" + sb.length());
sb = new StringBuilder();
System.out.println("容量:" + sb.capacity());
System.out.println("长度:" + sb.length());
4.String、StringBuilder、StringBuffer小结和使用场景
String 字符串类,底层是基于final char[], 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。StringBuilder: 基于可变的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程不安全的。
StringBuffer:基于可变的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程安全的。如果是单线程和多线程没有线程安全要求,用StringBuilder。如果是多线程有线程安全要求,用StringBuffer如果不经常操作字符串用 String节省空间StringBuffer和StringBuilder扩容机制:当要添加的字符串大于 > 当前字符数组的长度的时候扩容,扩容是: 原来长度*2+2 的方式扩容
根据笔者的面试经验来说,我们要清楚的知道String Builder与String Buffer的区别,以及一些常用的String类方法的作用。
笔者软件工程专业在读本科,小厂,中厂,大厂均有面试经验。每日给大家分享全栈相关知识点,希望能与大家共同进步。