0
点赞
收藏
分享

微信扫一扫

String与StringBuilder

黎轩的闲暇时光 2022-02-10 阅读 58

String类的常用方法及作用

什么是String字符串

1 概念及特点
	String类所在的包:lang。(不需要导包)
	String类的含义:字符串。
	Java当中被 " " 包裹的对象都是字符串对象。
	字符串常量不可改变,所有的字符串值的改变都是对象的替换
2 字符串通过 "==" 比较运算符比较的是地址值
3 字符串特定含义
    当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的进行赋值
    当对现有的字符串进行连接操作的时候 也需要重新指定内存区域赋值,不能使用原有的
    任何对字符串的修改都不是在原有的内存区域修改 
    String 通过字面值的方式去给一个字符串变量赋值, 此时字符串值保存在字符串常量池中字符串常量池中是不会存储相同内容的字符串

String 类常见的构造方法

1 String() 空参构造,创建一个空字符串""
2 String(char[] chars) 根据传递的char类型数组中的字符创建字符串 
    //可以将字符数组转换为字符串
3 String(String str) 根据传递的字符串去创建字符串
4 String str = ""  直接赋值(常用)
5 String(byte bytes[] , int offset , int length) //从数组中第offset开始取,取出length个

创建字符串对象的区别对比

创建字符串对象的方式
	1 String(String s)根据传递的字符串去创建字符串
	2 String s = "";直接赋值(常用)
不同方式创建的字符串对象的区别
     == 比较:
        基本数据类型:比较的是数据值
        引用数据类型:比较的是地址值
        字符串常量有自己的内存地址
        字符串常量中,每一个不同的""引起来的字符串地址不同

字符串比较

字符串比较用:对象名.equals
equals方法比较的特点
	(目前阶段)
	equals比较内容
	没有equals比较地址值
equalsIgnoreCase:比较字符串内容时,忽略大小写

字符串的遍历

1 直接遍历数组
	1.获取字符串长度length() 注意:数组中是.length属性,字符串中是.length()方法
	2.获取字符串中的字符charAt(int index)
	案例:
		//初始化字符串
		String s1 = "123456";
		//定义循环,长度为字符串变量.length()
		for (int i = 0; i < s1.length(); i++) {
		   //定义字符变量c接收遍历的字符串对象.charAt(i)
            char c = s1.charAt(i);
            //每次遍历都进行打印(循环打印)
            System.out.print(c + " ");
        }
2 字符串转换为字符数组,再进行遍历
    将字符串转换为字符数组的方法:toCharArray() 返回值为char类型数组:char[]
    遍历字符数组
        String a="1515ageawtweyt2462";
        char[] chars = a.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.print(chars[i] + " ");
        }
	将字符数组转换为字符串,直接在定义对象时使用: new String(char[] chars);

统计字符次数

1 统计字符串中大写、小写、数字字符的个数,并将每个种类拼接成新字符串进行输出打印
        String s = "123456JNIJASNjsanfjiqn165";
        String s1 = "";
        String s2 = "";
        String s3 = "";
        int count1 = 0;
        int count2 = 0;
        int count3 = 0;
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                count1++;
                s1 += c;
            }
            if (c >= 'a' && c <= 'z') {
                count2++;
                s2 += c;
            }
            if (c >= '0' && c <= '9') {
                count3++;
                s3 += c;
            }
        }
        System.out.println("大写字母有" + count1 + "个" + s1);
        System.out.println("小写字母有" + count2 + "个" + s2);
        System.out.println("数字字母有" + count3 + "个" + s3);
2 大写转小写  小写转大写
	String s = "123456JNIJASNjsanfjiqn165";
	String str = "";
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                char c1 = (char) (c + 32);
                str += c1;
            }
            if (c >= 'a' && c <= 'z') {
                char c2 = (char) (c - 32);
                str += c2;
            }
        }
        System.out.println(str);

字符串截取 屏蔽字符串

1 字符串的截取方法如何使用
	方法:
	从传入的索引位置开始截取到字符串的末尾,并将得到的字符串返回
	substring(int beginIndex)
	截取[beginIndex,endIndex],并将得到的字符串返回  包头不包尾
	substring(int beginIndex,int endIndex)
	
	截取不存在的索引,报错异常
	substring(0,0) //"" 截取一个寂寞
    substring(5,4) //报错异常
    

字符串替换

1 字符串的替换方法
	方法
	使用新值替换旧值并返回替换完成后的字符串
	字符串变量名.replace("旧值","新值");
	
	替换所有选中的字符串值
	字符串变量名 = 字符串变量名.replaceAll("选中的值","更换的值");
	
	替换第一次出现的字符串值 
	字符串变量名 = 字符串变量名.replaceFirst("选中的值","更换的值");
	
	去掉所有空格
	字符串变量名 = 字符串变量名.replace(" ","");

切割字符串

1 字符串的切割方法
	split(切割的规则):返回的是切割之后得到的字符串数组

2 切割字符串注意事项
        String s = ",,,,,,,,";
        String[] strs1 = s.split(",");
        System.out.println(Arrays.toString(strs1)); //[]

        String s2 = "1,2,,,,,3,,,,,";
        String[] strs2 = s2.split(",");
        System.out.println(Arrays.toString(strs2)); //[1, 2, , , , , 3]
        
        //切割字符串之后,","会被默认为空字符,单独的空字符不会被保留
        //两个字符之间夹杂的","会被默认为有效字符,从而保留,而有效字符之外的","会被认为无效,从而不保留

		//"."是被默认为有效字符的

StringBuilder简单认知

StringBuilder:可变的字符串缓冲区,弥补字符串不可变的特点,用来操作字符串(操作的是同一个内存空间,只会改变字符串的内容)
    
作用:操作字符串,提高效率,在缓冲区内不会浪费对象(不会设置多个变量对象接收);
    
空参构造
	StringBuilder()
有参构造
	StringBuilder(String str); //先添加一个字符串,可以将字符串转换为StringBuilder

StringBuilder常用的成员方法

1.变量名.append(元素),返回当前的StringBuilder对象(内容可累加);
2.变量名.reverse(),反转("12321" ---> "12321")
3.变量名.length(),统计StringBuilder中存储多少个字符
4.toString(),StringBuilder转换为String类型,目的:为了使用String类中的方法(链式编程)

String和StringBuilder的转换

1 如何判断字符串是否是对称字符串思路
    1.判断字符串是否是对称字符串
        StringStringBuilder的相互转化
        
        1.String ---> StringBuilder
        StringBuilder(String str)//构造方法
        
        2.StringBuilder ---> String
        使用StringBuilder的toString方法
	
	操作步骤:
    	1.String -- StringBuilder 目的是使用StringBuilder的reverse方法
    	
    	2.StringBuilder -- String 使用的是StringBuilder的toString方法
     	
     	目的:为了使用String的equals方法
     	
     	原因:因为StringBuilder没有自己的equals方法,此时使用StringBuilder参与		    比较,比较的是地址值
    	
    	String有自己的equals方法,比较的是内容

典型案例

拼接数组
public static void main(String[] args) {
        String[] arr = {"a","8","6","5","2","2","h","1"};
        String s = toString(arr);
        System.out.println(s);
    }
    public static String toString(Object[] a) {
        if (a == null)
            return "null";

        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }
    
    
我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数字0开头,前17位只可以是数字,最后一位可以是数字或者大写字母X。

### 训练目标

字符串的遍历、判断

### 训练提示

1、要判断字符串是否符合规则,方法的返回值类型是什么?参数列表是什么?

2、使用String的API,对每种不符合条件的情况作出判断,一旦发现不符合条件就可以结束方法的执行,返回结果了。

3、在主方法中创建键盘录入,调用方法,输入各种数据测试结果。

方法1(个人完成)
public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的身份证号:");
      //键盘录入身份证号
        String str = sc.nextLine();
      //调用card方法,并打印
        System.out.println(card(str));
    }

    public static boolean card(String id) {
        //判断字符串长度是否为18
        if (id.length() == 18) {
            //判断字符串开头是否为0
            if (id.charAt(0) == '0') {
                //是0,返回false
                return false;
            } else {    //否则向下进行
                //定义循环(大方向)
                for (int i = 0; i < id.length(); i++) {
                    //将字符串遍历,组成字符数组
                    char[] chars = id.toCharArray();
                    //调用bianli方法,进行遍历
                    bianli(i, chars);
                    //定义循环,长度为0-16个字符所在位置(小方向)
                    for (int j = 0; j < chars.length - 1; j++) {
                        //判断前16个字符是否合法(是否在0-9之间)
                        if (chars[j] < '0' && chars[j] > '9') {
                            //不合法返回false
                            return false;
                        }
                    }
                    //调用shiba方法,判断第18位字符
                    return shiba(chars);
                }
                //大循环结束
                return true;
            }	//判断开头是否为0的if、else结束
        } else	//字符串长度不为18,返回false
            return false;
    }

    private static boolean shiba(char[] chars) {
        //将chars.length - 1 的值赋给变量j
        int j = chars.length - 1 ;
        	//判断chars[j]位置的字符是否为x,或者是否同时满足大于等于0,小于等于9
            if (chars[j] == 'x' || (chars[j] >= '0' && chars[j] <= '9')) {
                return true;
            } else
                return false;
    }

    private static void bianli(int i, char[] chars) {
        //遍历输出打印字符数组,以便查看(可不写)
        if (i == 0) {
            for (int i1 = 0; i1 < chars.length; i1++) {
                System.out.print(chars[i1] + " ");
            }
            System.out.println();
        }
    }

方法2(参考答案)
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入身份证号:");
        String id = sc.nextLine();
        System.out.println(check(id));
    }

    // 返回值boolean类型,表示是否符合规则。参数列表:需要判断的字符串
    public static boolean check(String id) {
        // 如果传递了空参数,返回false
        if (id == null) {
            return false;
        }
        // 如果是数字0开头,返回false
        if (id.startsWith("0")) {
            return false;
        }
        // 如果不是18位,返回false
        if (id.length() != 18) {
            return false;
        }
        // 遍历判断每一位
        for (int i = 0; i < id.length(); i++) {
            char ch = id.charAt(i);
            // 前17位都是数字,最后一位可以是数字或者大写字母X
            if (i == id.length() - 1) { // 最后一位
                if (ch < '0' || ch > '9' && ch != 'X') { // 不是数字或者X
                    return false;
                }
            } else { // 其他位
                if (ch < '0' || ch > '9') { // 不是数字
                    return false;
                }
            }
        }
        // 所有的规则都符合,返回true
        return true;
    }
举报

相关推荐

0 条评论