Java中String总结

一、String类

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];//声明一个类的序列化
从上面可以看出几点:

1、String被final修饰,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。

2、上面列举出了String类中所有的成员属性,从上面可以看出String类其实是通过char数组来保存字符串的。

3、string是序列化的。

二、String中的方法

常用方法:

1、substring : 截取字符串

    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);
    }

2、replayce:替换字符串

    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;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                return new String(buf, true);
            }
        }
        return this;
    }
从以上可以看出,String的方法都是新建的字符串对象,并不影响原来的字符串对象。 String的操作不影响原来的字符串,操作后的字符串需要重新接收。

在这里要永远记住一点:“String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象”

3、常用方法汇总

和长度有关的方法

返回类型      方法名               作用

 int        length()        得到一个字符串的字符个数(一个中文是一个字符,一个英文是一个字符,一个转义字符是一个字符)

 

和数组有关的方法

返回类型        方法名             作用

byte[]        getBytes()       将一个字符串转换成字节数组

char[]        toCharArray()    将一个字符串转换成字符数组

String[]      split(String)    将一个字符串按照指定内容劈开

 

和判断有关的方法

返回类型        方法名                         作用

boolean       equals(String)                判断两个字符串的内容是否一模一样

boolean       equalsIgnoreCase(String)      忽略大小写的比较两个字符串的内容是否一模一样

boolean       contains(String)              判断一个字符串里面是否包含指定的内容

boolean       startsWith(String)            判断一个字符串是否以指定的内容开头

boolean       endsWith(String)              判断一个字符串是否以指定的内容结尾

 

和改变内容有关的方法

    和改变内容有关的方法,都不会直接操作原本的字符串

    而是将符合条件的字符串返回给我们,所以注意接收

返回类型        方法名                         作用

String        toUpperCase()                 将一个字符串全部转换成大写

String        toLowerCase()                 将一个字符串全部转换成小写

String        replace(String,String)        将某个内容全部替换成指定内容

String        replaceAll(String,String)     将某个内容全部替换成指定内容,支持正则

String        repalceFirst(String,String)   将第一次出现的某个内容替换成指定的内容

String        substring(int)                从指定下标开始一直截取到字符串的最后

String        substring(int,int)            从下标x截取到下标y-1对应的元素

String        trim()                        去除一个字符串的前后空格

 

和位置有关的方法

返回类型        方法名                     作用

char          charAt(int)               得到指定下标位置对应的字符

int           indexOf(String)           得到指定内容第一次出现的下标

int           lastIndexOf(String)       得到指定内容最后一次出现的下标


 三、关于String的比较值的问题(==,equals)

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;
    }

从上面的String的源码的equals方法可以看出来:

 (1)equals方法先用==号比较,然后看传入的值是否是string字符串,不是字符串直接返回false,是字符串再比较字符串的value,而字符串的value是一个char[]数组,再比较数组中的所有的char值;

(2)equals比较的是物理值,==号比较的是地址值

测试题:

		String a1="12";
		String a2="12";
		System.out.println(a1==a2);
		System.out.println(a1.equals(a2));
		
		String a3="2";
		String a4="1"+a3;
		System.out.println(a1==a4);
		System.out.println(a1.equals(a4));
		
		String a5="1"+"2";
		System.out.println(a1==a5);
		System.out.println(a1.equals(a5));
		
		String a6 = new String("12");
		String a7 = new String("12");
		System.out.println(a6==a7);
		System.out.println(a6.equals(a7));

这又设计到java的存储问题,下一章回答。先来看一下结果

true
true
false
true
true
true
false
true

equals的结果不能回答,比对的是数值,都是“12”,所以都是true。

而==号比对的是地址值(存储在计算机里的位置)


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值