String 与StringBuffer习题

1: 画出如下几行代码的结构

 

        // 画出如下几行代码的结构

        String s1 = "hello";   // value存储在常量池内
        String s2 = "hello";  // value存储在常量池内 和s1指向同一个值
        String s3 = new String("hello"); // 创建两个对象一个是在堆中创建, 一个是在char [] 中创建 指向常量池
        s1 += "world";  // value改变到堆中,堆中指向一个地址值, 然后这个地址值指向常量池,在常量池中新建一个value被指向

 

 

 

2: 如何理解String类的不可变性

不可变性,是因为我们再改变一个String的值时其实不是对以前的值进行修改,是新建立一个值, 把新的引用指向这个新建立的值 而不是对以前的修改

 

 

3: String类是否可被继承,为什么?

不可被继承,因为源码中这个String类被声明为final的  是不可以被继承的

String 与StringBuffer习题_第1张图片

 

 

 

String s = new String("hello"); 在内存中创建几个对象,请说明

在内存中创建两个对象, 一个在堆中创建, 一个是在char[] 中创建,char [] 中指向常量池中的"hello"

 

 

 

4: String StringBuffer, StringBuild 三者的对比

String 是不可变的字符序列  效率三者最差

StringBuffer 可变的字符序列  线程安全,效率三者中等
StringBuilder 可变的字符序列  线程不安全, 效率三者第一

三者的底层都是char [] 存储

 

 

5: String的常用方法 (7钟)

indexOf(String str) 求str在字符串的下标
charAt(int n) 求字符串中下标n的字符
replace(String str, String str1)  把字符串中str 替换为str1
contains(String str) 判断字符串是否包含str
concat(String str) 把字符串与str进行拼接
toLowerCase() 字符串中所有的字符全部小写
toUpperCase() 字符串中所有的字符全部大写
replcaeFirst(String str, String str1) 把字符串中第一个Str 替换为 str1

 

6: 将一个字符串的其中一部分内容进行翻转

public class StrExerOne {
    public static void main(String[] args) {
        String reverseStr = "qwertyu";
        ReverseStr reverseStr1 = new ReverseStr();
        System.out.println(reverseStr1.getReverse(reverseStr, 2, 5));

        ReverseStringBuilder reverseStringBuilder = new ReverseStringBuilder();
        System.out.println(reverseStringBuilder.getReverse(reverseStr, 2,5));
    }
}


// 第一种转化为 char [] 
class ReverseStr {

    public String getReverse(String str, int start, int end) { // 要翻转的字符串和要翻转的下标开始和下标结束的
        char[] chars = str.toCharArray();
        for (int x = start, y = end; x < y; x++, y--) {  // 对要翻转的内容进行翻转
            char temp = chars[x];
            chars[x] = chars[y];
            chars[y] = temp;
        }
        return new String(chars);
    }

}


//第二种转化为StringBuilder  为什么用StringBuilder 因为效率高不是线程安全
class ReverseStringBuilder {

    public String getReverse(String masterStr, int start, int end) {
        String strSub = masterStr.substring(start, end + 1);
        StringBuilder stringBuilder = new StringBuilder(strSub);
        String reverseStr = stringBuilder.reverse().toString();
        return masterStr.replace(strSub, reverseStr);
    }


}
将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反 转为”abfedcg”

 

 

 

7: 获取一个字符串在另一个字符串中出现的次数。比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数

 

/*
获取一个字符串在另一个字符串中出现的次数。
比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数

 */

import sun.jvm.hotspot.debugger.posix.elf.ELFSectionHeader;

public class StringContains {
    public static void main(String[] args) {
        String str = "abkkcadkabkebfkabkskab";

        ContainsStr containsStr = new ContainsStr();
        System.out.println(containsStr.containsStr(str, "ab"));  // 4


        ContainsStrTwo containsStrTwo = new ContainsStrTwo();
        System.out.println(containsStrTwo.getContainsStr(str, "ab"));  // 4


    }
}


// 第一种方法是匹配到之后然后把药匹配的位置向后移动一个匹配字符的长度之后再进行匹配

class ContainsStr {

    public int containsStr(String masterStr, String subStr) {
        int mainLength = masterStr.length();
        int subLength = subStr.length();
        int count = 0; // 计数
        int index;
        if (masterStr.length() > subStr.length()) {
            while ((index = masterStr.indexOf(subStr)) != -1) {  //判断主字符串中有要匹配的内容  indexOf的内容等于-1是没有内容
                count++;
                masterStr = masterStr.substring(index + subLength);  // 就是从匹配的这个数的下标之后加上他本身之后就是获取到 这个匹配到的内容之后的字符串了
            }
            return count;
        } else {
            return -1;
        }
    }

}




// 第二种方法是  从一开始就进行匹配 ,然后匹配完无论是不是正确都向后选取要匹配的字符长度进行匹配

// 就是要确保选取匹配的字符是在不停的向后移动位置

class ContainsStrTwo{

    public int getContainsStr(String masterStr, String subStr){
        int masterLength = masterStr.length();
        int subStrLength = subStr.length();
        int count = 0;
        int index = 0 ;  // 要匹配的位置
        while ((index = masterStr.indexOf(subStr, index)) != -1){  //先从第一次开始匹配, 下面不停的改变index的参数让它每次都向后移动一个匹配字符串的长度
            count++;
            index += subStrLength;  // 改变匹配的位置
        }
        return count;
    }


}
获取一个字符串在另一个字符串中出现的次数。 比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数

 

 

 

 

 

.

你可能感兴趣的:(String 与StringBuffer习题)