JAVA基础--IDEA快捷键与字符串相关类

IDEA快捷键

为什么要使用IDEA快捷键

  1. 在我们的实际开发过程中,掌握更多的快捷键,有利于我们快速编码,

  2. 前期我们已经使用了很长一段时间的Idea但是没有告诉大家快捷键,是因为希望大家多进行一些基础编码,敲键盘的过程,现阶段需要同学们掌握一些快捷键,跟上编码速度

  3. 熟悉了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中不属于基本数据类型, 而是引用类型,也称为类类型。

需要学习字符串的哪些东西?

  1. 学习字符串类String、StringBuilder、StringBuffer的底层原理,进而掌握使用场景。

  2. 学习字符串类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类方法的作用。

笔者软件工程专业在读本科,小厂,中厂,大厂均有面试经验。每日给大家分享全栈相关知识点,希望能与大家共同进步。

  • 31
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值