回忆学习的java中的String类

首先String类属于java.lang包中的一个final类,即String类不可以被继承。

我们经常使用这两种方式来创建一个新的字符串:

1. String str="123";

2. String str=new String("abc");

尤其第一种方式在我们写代码时用的更多,这两种方式存在一定的区别,主要因为JVM为了减少字符串对象重复创建造成的内存开销。

在JVM中有一段特殊的内存称为常量池。当我们使用第一种方式创建字符串对象时,JVM首先会在常量池中寻找是否有相匹配的字符串对象,

如果有,直接拿出来使用,将变量直接指向字符串对象,不再创建新的字符串对象。如果没有,就在常量池中创建新的字符串对象。

比如:

String s1="abc";

String s2="abc";

创建s2的时候常量池中已存在“abc”的对象,这是s1和s2会指向同一个对象。

System.out.println(s1==s2);  //输出是true

对于第二种方式创建字符串对象,JVM会在堆内存中直接创建一个新的对象,只要new,就会有一个新的对象产生。

String s1=new String("abc");

String s2=new String("abc");

这是堆内存会有两个String对象,分别由s1和s2指向。

System.out.println(s1==s2);  //输出是false   因为两个引用指向两个对象,地址不同

提示:字符串对象一旦被声明就不能再被改变,对字符串操作都是返回一个新的字符串或者其他类型数据。

 

String类中一些方法:

1.static String valueOf()

String提供了一组重载的静态方法valueOf,作用是将其他类型转换为字符串类型,常用语java基本类型转换为字符串。

例如:

int i=123;

String str=String.valueOf(i);

System.out.println(str);   //输出123

System.out.println(str+3);   //输出1233

2.int length()

返回字符串的长度。

例如:

System.out.println("123".length());  //输出为3,代表当前字符串长度为3

3.int indexOf()

返回给定字符串在当前字符串的位置

例如:

String str1="我爱学习";

System.out.println(str1.indexOf("爱"));  //输出为1 (位置从0开始)

String str2="上海啊我爱你上海"; 

System.out.println(str2.indexOf("上海",2));  //输出为6  这是从第二个位置开始寻找匹配的字符串,重载方法 int indexOf(String str, fromIndex)

4.char charAt()

返回当前指定位置的字符。

例如:

String str="1234567";

Char  ch=str.charAt(3);

System.out.println(ch);  //输出4

5.String substring(int start,int end)

截取当前字符串指定位置的字符串并返回,就是取子串。java中通常不包含end指定的字符。

例如:

System.out.println("我喜欢小泽老师和苍老师".substring(0,7));  //输出 我喜欢小泽老师

6.String toUpperCase(),String toLowerCase()

将当前字符串的英文部分转换为大写或者小写

例如:

String str="abc123";

System.out.println(str.toUpperCase());  //输出为 ABC123

7.String trim()  

去除当前字符串中的空白

例如:

String str="    abc    ";

System.out.println(str);  //输出为 "   abc   "(并没有引号,只是为了表示有空白)

System.out.println(str.trim()) ; //输出为“abc”

8.boolean startWith(String str), boolean endWith(String str)

判断字符串是否以给定字符串开头或者结尾

例如:

String str="我身高1米8啊";

System.out.println(str.startWith("我"));  //输出为 true

9.String concat(String str)

将指定的字符串连接至当前字符串末尾

例如:

String str="123";

str.concat("456");

System.out.println(str);  //输出结果为 123456

10.String replace(char oldChar, char newChar)

将指定的字符替换为新的指定字符

例如:

String str="123";
String str2=str.replace("2", "3");

System.out.println(str2);  //输出为133

11.boolean matches(String regx)

判断当前字符串是否符合正则表达式

例如:

String regx="a\\d?";

String str="abc";

System.out.println(str.matches(regx)); //输出为false 因为正则要求以a开头接着有0个或1个数字

12.String []split(String regx)

以给定正则内容来分割字符串并返回一个字符串数组

例如:

String s="我爱你,爱着你,就像老鼠爱大米";

String []str=s.split(",");

for(String string:str){

System.out.println(string);

}  //遍历str,输出为  我爱你 爱着你 就像老鼠爱大米

13. char[] toCharArray()

将当前字符串返回一个字符数组

例如:

String str="1234asdf";

char []ch=str.toCharArray;

for(int i=0;i<ch.length,i++){

system.out.println(ch[i]);

}  //将会将char数组中的每一个元素输出,输出为 1 2 3 4 a s d f

以上是比较基本简单的String类给我们封装的方法,在平时都可能用得到,而其中大部分几乎都要重载方法,这里我没有写出来,

其实相差不是很大,基本都很容易懂。

另外在String类中还重写了两个重要的方法:

public boolean equals(Object obj)  //可以比较字符串内容是否匹配

public String toString()  //返回一个字符串

其源码是:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 

public String toString(){

  ruturn this; //返回其本身

}

 

posted @ 2017-05-09 21:55  她曾是他的梦  阅读(196)  评论(0编辑  收藏  举报