Java学习第八天

目录

1.String类

1.1特点

1.2构造方法

1.3常见面试题

1.4字符串比较 

 1.5字符串遍历

 1.5.1案例:统计字符个数

 1.6字符串的截取

1.6.1案例:屏蔽号码

1.7字符串替换

1.7.1案例:替换字符

1.8字符串切割

1.9String小结

 2.StringBuilder类

2.1StringBuilder的特点

2.2StringBuilder的构造方法 

2.3StringBuilder的常用成员方法

2.4.1案例 回文字符

 2.4.2案例 数组转换字符串

2.5String、StringBuffer、StringBuilder的区别

1.String类

1.1特点

String类的特点 :
        1. Java 程序中所有双引号字符串, 都是String这个类的对象
        2. 字符串一旦被创建, 就不可更改, 字符串内容不可改变 如果想要更改, 只能使用新的对象, 做替换
        3. String字符串虽然不可改变, 但是可以被共享
        字符串常量池: 当我们使用双引号创建字符串对象时, 会检查常量池中是否存在该数据
        不存在 : 创建
        存在 : 复用
public class StringDemo {
    public static void main(String[] args) {
        String s="abc";
        System.out.println(s.toUpperCase());
        System.out.println("abc".toUpperCase());
    }
}
public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);
    }

1.2构造方法

String类常见构造方法 :
public String() : 创建一个空白字符串, 里面不含任何内容
public String(char[] chs) : 根据传入的字符数组, 创建字符串对象
public String(String original) : 根据传入的字符串, 来创建字符串对象
        -----------------------------------------------------------------
        1. 打印对象名, 会看到对象的内存地址, 这里打印字符串对象, 为什么没有看到地址值
        回答: 暂不解释
        TODO: 面向对象(继承), 方法重写, Object类, toString方法
        2. 这三个构造方法, 创建字符串对象, 都没有双引号直接创建来的方便.
        String s = "abc";
        -----------------------------------------------------------------
        字符串对象, 两种创建方式的区别
        1. 双引号直接创建
        2. 通过构造方法创建
 public static void main(String[] args) {
        // public String() : 创建一个空白字符串, 里面不含任何内容
        String s1 = new String();
        System.out.println(s1);

        // public String(char[] chs) : 根据传入的字符数组, 创建字符串对象
        char[] chs = {'a','b','c'};
        String s2 = new String(chs);
        System.out.println(s2);

        // public String(String original) : 根据传入的字符串, 来创建字符串对象
        String s3 = new String("abc");
        System.out.println(s3);
 
        String ss1 = "abc";
        String ss2 = "a" + "b" + "c";
 
        System.out.println(ss1 == ss2);
    }
}

1.3常见面试题

1.4字符串比较 

String类中用于比较的方法 :
        public boolean equals(Object anObject) 将此字符串与指定的对象比较
        public boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写
public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
 
        System.out.println(s1 == s2);               // false
        System.out.println(s1.equals(s2));          // true
 
        System.out.println("---------------------");
 
        String ss1 = "abc";
        String ss2 = "ABC";
 
        System.out.println(ss1.equals(ss2));                // false
        System.out.println(ss1.equalsIgnoreCase(ss2));      // true
    }
}

 1.5字符串遍历

String类用于遍历的方法:

  1. public char[] toCharArray() 将此字符串转换为一个新的字符数组
  2. public char charAt(int index) 返回指定索引处的 char 值
  3. public int length() 返回此字符串的长度
private static void print1() {
        String s = "itheima";
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
    }
private static void print2() {
        String s = "itheima";
        for (int i = 0; i < s.length(); i++) {
            // i = 0 1 2 3 4 5 6
            char c = s.charAt(i);
            System.out.println(c);
        }
    }

 1.5.1案例:统计字符个数

需求 : 键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数
        (不考虑其他字符)
        例如 :  aAb3&c2B*4CD1
        小写字母 : 3个
        大写字母 : 4个
        数字字母 : 4个
public static void main(String[] args) {
        // 1. 键盘录入一个字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        String content = sc.nextLine();
        // 2. 定义三份计数器变量, 用于统计操作
        int smallCount = 0;
        int bigCount = 0;
        int numCount = 0;
        // 3. 遍历字符串, 获取到每一个字符
        char[] chars = content.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            // 4. 在遍历的过程中, 加入if判断, 看字符属于哪一种类别
            if (c >= 'a' && c <= 'z') {
                // 5. 对应的计数器变量自增
                smallCount++;
            } else if (c >= 'A' && c <= 'Z') {
                bigCount++;
            } else if (c >= '0' && c <= '9') {
                numCount++;
            }
        }
        // 6. 在遍历结束后, 将统计好的计数器变量, 打印在控制台
        System.out.println("小写字母 : " + smallCount + "个");
        System.out.println("大写字母 : " + bigCount + "个");
        System.out.println("数字字符 : " + numCount + "个");
    }
}

 1.6字符串的截取

String类的截取方法 :
            public String substring(int beginIndex) :  根据传入的索引开始做截取, 截取到字符串的末尾
            public String substring(int beginIndex, int endIndex) :  根据传入的开始和结束索引, 对字符串做截取
                                                                        - 包含头, 不包含尾
            注意: 截取出来的内容, 是作为新的字符串返回, 别忘记找变量接收

public class StringMethodDemo3 {
     
    public static void main(String[] args) {
 
        String s = "itheima";
 
        String result = s.substring(0, 2);
 
        System.out.println(result);
 
    }
 
    private static void method() {
        String s = "itheima";
 
        String result = s.substring(2);
 
        System.out.println(result);
    }
}

1.6.1案例:屏蔽号码

需求:以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽
        最终效果为:156****1234
        分析:
        1. 键盘录入字符串
        2. 截取前三位
        3. 截取后四位
        4. 前三位 + "****" + 后四位
public static void main(String[] args) {
        // 1. 键盘录入字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入手机号:");
        String tel = sc.nextLine();
 
        // 2. 截取前三位
        String start = tel.substring(0, 3);
 
        // 3. 截取后四位
        String end = tel.substring(7);
 
        // 4. 前三位 + "****" + 后四位
        System.out.println(start + "****" + end);

1.7字符串替换

String类的替换方法 :
    public String replace(CharSequence target, CharSequence replacement)  :
                        参数1 : 旧值
                        参数2 : 新值
public class StringMethodDemo4 {
    public static void main(String[] args) {
        String s = "itheima"; 
        String result = s.replace("heima", "baima");
        System.out.println(result);
    }
}

1.7.1案例:替换字符

需求:键盘录入一个 字符串,如果字符串中包含(TMD), 则使用 *** 替换
public class StringTest4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入:");
        String content = sc.nextLine();
        content = content.replace("TMD","***");
        System.out.println(content);
    }
}

1.8字符串切割

String类的切割方法 :
    public String[] split(String regex) : 根据传入的字符串作为规则, 切割当前字符串
建议: 先正常指定切割规则, 后来发现没有得到自己要的效果, 就可以尝试在规则前面, 加入 \\
public class StringMethodDemo5 {
    public static void main(String[] args) {
        String s = "192+168+1+1";
        String[] sArr = s.split("\\+");
        for (int i = 0; i < sArr.length; i++) {
            System.out.println(sArr[i]);
        }
    }
}

1.9String小结

 2.StringBuilder类

2.1StringBuilder的特点

提高效率:

public static void main(String[] args) {
        long start = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for(int i = 1; i <= 100000; i++){
            sb.append(i);
        }
        System.out.println(sb);
        long end = System.currentTimeMillis();
        System.out.println(end - start);            // 10
    }
    private static void method() {
        // 获取1970年1月1日0时0分0秒到现在所经历过的毫秒值 (1秒 = 1000毫秒)
        long start = System.currentTimeMillis();
        String s = "";
        for(int i = 1; i <= 100000; i++){
            s += i;
        }
        System.out.println(s);
        long end = System.currentTimeMillis();
        System.out.println(end - start);            // 2804
    }

2.2StringBuilder的构造方法 

StringBuilder的介绍 :
    1. 一个可变的字符序列
    2. StringBuilder是字符串缓冲区, 将其理解是容器, 这个容器可以存储任意数据类型, 但是只要进入到这个容器, 全部变成字符串.
StringBuilder的构造方法 :
    public StringBuilder() : 创建一个空白的字符串缓冲区(容器), 其初始容量为16个字符
    public StringBuilder(String str) : 创建一个字符串缓冲区(容器), 容器在创建好之后, 就会带有参数的内容

 

public class StringBuilderDemo2 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("abc");
        System.out.println(sb);
    }
}

2.3StringBuilder的常用成员方法

StringBuilder常用成员方法 :
    1. public StringBuilder append(任意类型) : 添加数据, 并返回对象自己
    2. public StringBuilder reverse() : 将缓冲区中的内容, 进行反转
    3. public int length() : 返回长度
    4. public String toString() : 将缓冲区的内容, 以String字符串类型返回
public class StringBuilderDemo3 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        // 链式编程: 调用的方法, 返回的结果是对象, 就可以继续向下调用方法
        sb.append("红色").append("绿色").append("蓝色");
        System.out.println(sb);
        // 情况: 我数据在StringBuilder当中, 我要调用的方法, StringBuilder没有, 但是String有
        // 解决: 转换为String, 再调用
        String[] sArr = sb.toString().split("色");
        for (int i = 0; i < sArr.length; i++) {
            System.out.println(sArr[i]);
        }
    }
}
2.4.1案例 回文字符
需求: 键盘接受一个字符串,程序判断出该字符串是否是对称字符串(回文字符串),并在控制台打印是或不是
        对称字符串:  123321、111
        非对称字符串: 123123
        思路: 对拿到的字符串进行反转, 反转后的内容, 跟原数据相同, 判定为回文字符串
        String ---> StringBuilder
        String s = "abc";
        StringBuilder sb = new StringBuilder(s);
        StringBuilder ---> String
        String s = sb.toString();
 public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个对称字符串: ");
        String content = sc.nextLine();
 
        // 将String转换为StringBuilder, 为了调用内部反转的方法
        StringBuilder sb = new StringBuilder(content);
        sb.reverse();
 
        // 判断反转后的内容, 和原数据是否相同
        // content : String类型
        // sb : StringBuilder类型
        if (content.equals(sb.toString())) {
            System.out.println("是对称字符串");
        } else {
            System.out.println("不是对称字符串");
        }
    }
}
 2.4.2案例 数组转换字符串
需求:
        定义一个方法, 把int数组中的数据按照指定的格式拼接成一个字符串返回
        调用该方法, 并在控制台输出结果。
        例如: 数组为int[] arr = {1,2,3};
        执行方法后的输出结果为: [1, 2, 3]
public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        String result = arrayToString(arr);
        System.out.println(result);
    }
    public static String arrayToString(int[] arr) {
 
        // 1. 创建StringBuilder, 准备进行拼接
        StringBuilder sb = new StringBuilder("[");
 
        // 2. 遍历数组, 获取内部元素
        for (int i = 0; i < arr.length - 1; i++) {
            // 3. 将获取到的元素, 拼接到字符串缓冲区
            sb.append(arr[i]).append(", ");
        }
 
        // 4. 特殊处理最后一个元素
        sb.append(arr[arr.length - 1]).append("]");
 
        return sb.toString();
    }
}

2.5String、StringBuffer、StringBuilder的区别

StringBuilder和StringBuffer在用法上是一样

StringStringBufferStringBuilder
执行速度最差其次最高
线程安全线程安全线程安全线程不安全
使用场景少量字符串操作多线程环境下的大量操作单线程环境下的大量操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值