【java】String类及其练习

一、String类


字符串实例化

直接赋值

String str = "Hello Bit";

传统方法(构造法)

String str = new String("Hello Bit");

这两种方法存在差异:

  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用 intern()方法手工入池。

详见:
String类中两种对象实例化的区别


变量比较

String的变量可以通过两种方式进行比较,一种是“==”方式,另一种是通过.equals()方法进行比较,二者虽然都可以进行比较,但比较的内容不同:

“==” 是比较变量所指向的值在堆空间上的内存地址值
.equals() 是比较字符串的值

详见:字符串比较分析


String类的匿名对象

用双引号“”引起来的内容就是String类的匿名对象

如:“hello”

如果字符串变量和字符串匿名对象进行equals比较,字符串匿名对象放在前面。

如:"hello".equals(str1);

字符串不可变更

有如下代码:

 	String str1 = "hello" ;         
 	str1 = str1 + " world" ;        
 	str1 += "!!!" ; 
 	System.out.println(str);

此时一共产生了5个String对象,分析如下:
【java】String类及其练习_第1张图片
由此看出字符串对象的引用一直在改变,而且会形成大量的垃圾空间。所以在代码中要防止出现如下代码:

	String str = "hello" ;         
	for(int x = 0 ; x<1000 ; x++) {            
		str += x ;         
	}
	System.out.println(str);

原则:

  1. 字符串使用就采用直接赋值。
  2. 字符串比较就使用equals()实现。
  3. 字符串别改变太多。

注:更多String方法请前往API中查看。


二、StringBuffer类

通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,提供StringBuffer类。
线程安全: 在多线程中使用时,不会造成线程干扰。
默认构造方法: 构造一个没有字符的字符串缓冲区,初始容量为16个字符4个构造方法。

  • 在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:

如:

对象名.append("java")    //链式调用   
     .append("is")   
     .append("best");   //在字符串缓冲区中追加  return 这个对象

String变为StringBuffer: 利用StringBuffer的构造方法或append()方法;
StringBuffer变为String: 调用toString()方法。

面试题:String、StringBuffer、StringBuilder区别:
String的内容不可修改,StringBuffer和StringBuilder的内容更可以修改StringBuilder类 同StringBuffer类功能一样,唯一不同的是线程不安全。
注:面试时要详细讲解各个类的功能


三、String练习

1.重复某个字符
例如:

  • ‘a’ 5 => “aaaaa”
  • ‘a’ -1 => “”
  • c 被重复的字符
  • count 重复的数目,如果小于等于0则返回""
  • return 重复字符字符串

代码如下:

public static String repeat(char c, int count) {
        if(count<=0) {
            return "";
        }
        StringBuffer str = new StringBuffer();
        while (count>0){
            str.append(String.valueOf(c));
            count--;
        }
       return str.substring(0);

//        测试用例
//        System.out.println(repeat('b',5));
//        System.out.println(repeat('b',0));
//        System.out.println(repeat('b',-1));
//        System.out.println(repeat('2',2));
    }

2.将已有字符串填充为规定长度(字符填充于字符串前)
将已有字符串填充为规定长度,如果已有字符串超过这个长度则返回这个字符串

  • 字符填充于字符串前
  • 例如:
  • “abc” ‘A’ 5 => “AAabc”
  • “abc” ‘A’ 3 => “abc”
  • str 被填充的字符串
  • filledChar 填充的字符
  • len 填充长度
  • return 填充后的字符串

代码如下:

public static String fillBefore(String str, char filledChar, int len) {
        if(str.length()>=len){
            return str;
        }
        int count = len - str.length();
        StringBuffer s = new StringBuffer();
        while(count>0){
            s.insert(0,filledChar);
            count--;
        }
       return s.substring(0)+str;
//        测试用例
//        System.out.println(fillBefore("abc",'A',5)); //AAabc
//        System.out.println(fillBefore("abc",'A',3));//abc
//        System.out.println(fillBefore("",'A',5)); //AAAAA
//        System.out.println(fillBefore("abcdef",'A',5));//abcdef
    }

3.将已有字符串填充为规定长度(字符填充于字符串后)

  • 字符填充于字符串后
  • 例如:
  • “abc” ‘A’ 5 => “abcAA”
  • “abc” ‘A’ 3 => “abc”
  • str 被填充的字符串
  • filledChar 填充的字符
  • len 填充长度
  • return 填充后的字符串

代码如下:

public static String fillAfter(String str, char filledChar, int len) {
        if(str.length()>=len){
            return str;
        }
        int count = len - str.length();
        StringBuffer s = new StringBuffer();
        while(count>0){
            s.append(filledChar);
            count--;
        }
        return str+s.substring(0);
//        测试用例
//        System.out.println(fillAfter("abc",'A',5)); //abcAA
//        System.out.println(fillAfter("abc",'A',3));//abc
//        System.out.println(fillAfter("",'A',5)); //AAAAA
//        System.out.println(fillAfter("abcdef",'A',5));//abcdef
    }

4.移除字符串中所有给定字符串

  • 例:removeAll(“aa-bb-cc-dd”, “-”) => aabbccdd
  • str 字符串
  • strToRemove 被移除的字符串
  • return 移除后的字符串

代码如下:

public static String removeAll(CharSequence str, CharSequence strToRemove) {
        if(str==null){
            return null;
        }
        String s = new String(str.toString());
        if(s.contains(strToRemove)){
            s = s.replace(strToRemove,"");
        }
        return s;
//        测试用例
//        System.out.println(removeAll("aa-bb-cc--dd","-")); //aabbccdd
//        System.out.println(removeAll("aa-bb-cc--dd","--")); //aa-bb-ccdd
//        System.out.println(removeAll("aa-bb-cc--dd","hh")); //aa-bb-cc--dd
//        System.out.println(removeAll("","--")); //
    }

5.反转字符串

  • 例如:abcd => dcba
  • str 被反转的字符串
  • return 反转后的字符串

代码如下:

public static String reverse(String str) {
        if(str == null){
            return null;
        }
        if(str.length()<=1){
            return str;
        }
        char[] charArray = str.toCharArray();
        int left = 0;
        int right = charArray.length-1;
        char tmp;
        while(left<=right){
            tmp = charArray[left];
            charArray[left] = charArray[right];
            charArray[right] = tmp;
            left++;
            right--;
        }
        String s = new String(charArray);
        return s;
//        测试用例
//        System.out.println(reverse("abcdefg")); //gfedcba
//        System.out.println(reverse(""));//
//        System.out.println("a");//a
    }

你可能感兴趣的:(java)