【JAVA】关于String

简介

String类是代表字符串。所有Java程序中的字符串文字,例如“abc”,都是String类的实例

Strings是不变的,创建后值就不能改变。String buffer 提供了可更改的方法。因为String对象是不变的,所以可以共享。例如:
Strng str = “abc”;
等同于
char data[] = {‘a’,’b’,’c’};
String str = new String(char);

Java为字符串连接运算符(+)和其他对象转换为字符串提供特殊支持。通过StringBuilder(或StrngBuffer)类的append方法实现字符串的连接。通过toString方法实现字符串转换,由Object定义,由Java中的所有类继承。

除了特别声明,否则传递null参数到此类的构造函数或方法将导致抛出NullPointerException异常

重载“+”

重载“+”,在这里重载指的是当对特定类使用时操作符被赋予了额外的意义。(对String使用的“+”和“+=”是Java中唯一重载过的操作符,Java不允许程序员重载其他的操作符)“+”在此允许程序员连接String,见下例:
//: strings/Concatenation.java

public class Concatenation{
	public static void main(String[] args){
		String mango = “mango”;
		String s = “abc”+mango+”def”+47;
		System.out.println(s);
	}
} /* Output:
abcmangodef47
*///:~

可以这样设想String “abc”使用方法append()创建一个包含“abc”的新的String对象,这个String对象和mango的内容相连。然后新的String对象在创建另外一个String在和“def”相连,之后再按照这样进行下去。

常用方法

构造方法

  1. public String()
    初始化新创建的String对象,使其表示一个空的字符序列
    注意:使用这个构造器(空构造器)没有意义因为Strings是不能更改的
  2. public String(String original)
    亦即新建的string是参数string的复制
  3. public String(StringBuffer buffer)
    分配一个新的字符串,其中包含当前包含在字符串缓冲区(string buffer)参数(argument)中的字符序列
    注意:
  4. public String(StringBuilder builder)
    分配一个新的字符串,其中包含当前包含在字符串构建器(string builder)参数(argument)中的字符序列
    注意:string builder的内容是复制过来的,之后对string builder的改动不会影响到新建的string

主要方法 附带源码:
1.

public int length() {
        	  return value.length;
}

返回字符串的长度
2.

public boolean isEmpty() {
    return value.length == 0;
}

只有length为0时才返回true,否则返回false
3.

public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
}

返回指定索引(index)的字符值(character value)。索引从0到length-1。
4.

public boolean equals(Object anObject){
if (this == anObject) {      //如果this等于anObject返回true
      return true;
  }
if (anObject instanceof String) {    //如果anObject是String
      String anotherString = (String)anObject;  //将anObject强转为一个String实例
      int n = value.length;  //获取value的长度
      if (n == anotherString.value.length){//如果n等于anotherString.value.length
      	char v1[] = value;
      	char v2[] = anotherString.value;
      	int i = 0;
      	while (n-- != 0) {  //n递减,为0时停止
      		if (v1[i] != v2[i])  //string的值一一比较,只要不相等就返回false
          		return false;
         	 i++;
     	 }
       return true;
    }
 }
 return false; //除了上述两种情况外,其他一律返回false

}
比较字符串和指定对象。有且只有当参数不是null且表示相同字符序列的字符串对象时才返回true
注意只有参数是String的情况下才是去比较内容,如果不是String类型,则是使用==,即比较的引用。如果想要参数为非String类型时也比较内容,则需要重写equals方法
5.

public boolean equalsIgnoreCase(String anotherString) {
   return (this == anotherString) ? true
          : (anotherString != null)
           && (anotherString.value.length == value.length)
           && regionMatches(true, 0, anotherString, 0, value.length);
}

比较字符串,忽略大小写
6.

public int compareTo(String anotherString){
	int len1 = value.length;
	int len2 = anotherString.value.length;
	int lim = Math.min(len1, len2);  //lim是两个长度中的最小长度
	char v1[] = value;
	char v2[] = anotherString.value;
	
	int k = 0;
	while (k < lim) {
	    char c1 = v1[k];
	    char c2 = v2[k];
	    if (c1 != c2) {    //一旦有字符不同,则返回c1和c2的Unicode的差值
	         return c1 - c2;
	     }
	         k++;
	    }
	    return len1 - len2;
}

按字典顺序比较字符串,比较是基于字符串中每个字符的Unicode
字符串相同时返回0,小于返回负数,大于返回正数
7.

public int compareToIgnoreCase(String str) {
     return CASE_INSENSITIVE_ORDER.compare(this, str);
 }

compare()忽略大小写
8.

public boolean startsWith(String prefix, int toffset) {
     char ta[] = value;
     int to = toffset;
     char pa[] = prefix.value;
     int po = 0;
     int pc = prefix.value.length;
    // Note: toffset might be near -1>>>1.
     if ((toffset < 0) || (toffset > value.length - pc)) {
         return false;
     }
     while (--pc >= 0) {
         if (ta[to++] != pa[po++]) {
             return false;
         }
     }
     return true;
}

参数toffset: 从哪个开始
测试字符串是否以某种特定的前缀开头,返回boolean

public boolean startsWith(String prefix) {
       return startsWith(prefix, 0);
   }
public boolean endsWith(String suffix) {
       return startsWith(suffix, value.length - suffix.value.length);
   }

测试字符串是否以某种特定的后缀结尾,返回boolean
10.

public int indexOf(int ch, int fromIndex) {   
     final int max = value.length;
      if (fromIndex < 0) {
          fromIndex = 0;
      } else if (fromIndex >= max) {
          // Note: fromIndex might be near -1>>>1.
          return -1;
      }
     if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
          // handle most cases here (ch is a BMP code point or a
          // negative value (invalid code point))
          final char[] value = this.value;
          for (int i = fromIndex; i < max; i++) {
              if (value[i] == ch) {
                  return i;
              }
          }
          return -1;
      } else {
          return indexOfSupplementary(ch, fromIndex);
      }
}

参数:
ch: 一个字符(编码点Unicode code point)
fromIndex: 开始搜索的索引值
返回某个特定字符第一次出现时的索引值,充指定的地方开始搜索,如果不存在该字符,则返回-1

public int indexOf(int ch) {
   return indexOf(ch, 0);  fromIndex为0的情况
}
public int lastIndexOf(int ch, int fromIndex) {
        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
            // handle most cases here (ch is a BMP code point or a
            // negative value (invalid code point))
            final char[] value = this.value;
            int i = Math.min(fromIndex, value.length - 1);
            for (; i >= 0; i--) {   //从后往前找
                if (value[i] == ch) {
                   return i;
                }
            }
            return -1;
        } else {
            return lastIndexOfSupplementary(ch, fromIndex);
        }
    }

返回某个特定字符最后一次出现时的索引值,充指定的地方开始搜索,如果不存在该字符,则返回-1(最后一次就是从后往前找出现的第一次)

public int lastIndexOf(int ch) {
   return lastIndexOf(ch, value.length - 1);   fromIndex为字符串最后一个索引值的情况
}
  1. public int indexOf(String str, int fromIndex)
    public int lastIndexOf(String str)
    public int lastIndexOf(String str, int fromIndex)
public String substring(int beginIndex) {
       if (beginIndex < 0) {
           throw new StringIndexOutOfBoundsException(beginIndex);
       }
      	  int subLen = value.length - beginIndex;
         if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}

返回字符串的子字符串,只有开始的索引值,子字符串是新建的String
14.

public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > value.length) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        int subLen = endIndex - beginIndex;
        if (subLen < 0) {
            throw new StringIndexOutOfBoundsException(subLen);
        }
        return ((beginIndex == 0) && (endIndex == value.length)) ? this
                : new String(value, beginIndex, subLen);
}
 public String replace(char oldChar, char newChar) {
       if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }   //旧字符第一次出现时的索引值 i
            if (i < len) {  如果i<len
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];  //将旧字符出现前的其他字符给到buf[]中
                }
                while (i < len) {
                    char c = val[i];   
                    buf[i] = (c == oldChar) ? newChar : c;  //在旧字符出现后的字符串中,如果有字符是旧字符则替换成新字符
                    i++;
                }
                return new String(buf, true);  //返回一个创建好的新字符串,内容是buf
            }
        }
        return this;
}

用新字符替换旧字符
16. public String[] split(String regex, int limit)
根据表达式将字符串切分为一个数组
limit 控制这一模式应用的次数,因而影响了结果数组的长度,如果limit=n,n大于0,则切分将应用n-1次,数组的长度不会大于n,数组的最后一个值将包含所有没有被切分的部分。如果n小于0,那么切分将进行任意次,数组的长度也是随机的。如果n等于0,切分将进行任意次,数组的长度也是随机的,但是剩下的空字符串将被舍弃

以字符串"boo:and:foo"为例
Regex Limit Result
: 2 { “boo”, “and:foo” }
: 5 { “boo”, “and”, “foo” }
: -2 { “boo”, “and”, “foo” }
o 5 { “b”, “”, “:and:f”, “”, “” }
o -2 { “b”, “”, “:and:f”, “”, “” }
o 0 { “b”, “”, “:and:f” }

*public String[] split(String regex) limit为0的情况

  1. public static String join(CharSequence delimiter, CharSequence… elements)
    用分隔符连接字符元素组成字符串
    例如:
    String message = String.join("-", “Java”, “is”, “cool”);
    // message returned is: “Java-is-cool”

  2. public String toLowerCase() 变小写
    public String toUpperCase() 变大写

public String trim() {
    int len = value.length;
    int st = 0;
    char[] val = value;    /* avoid getfield opcode */
    while ((st < len) && (val[st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < value.length)) ? substring(st, len) : this;
}

去掉字符串前后的空格“ ”, 注意前后可能不只一个空格
20.

public String toString() {
        return this;
}

返回字符串形式
21.

public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;
}

转变成字符数组
22. public byte[] getBytes()
返回obj的值用String表现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值