Java中的String类

1. String 本身是一个类的定义,实例化方法如下

String name = "xiaoming"; //直接赋值
String name = new String("xiaoming"); //调用构造方法实例化
public class StringTest {
    public static void main(String args[]) {
        String name = "xiaoming";
        String fruit = new String("apple");
        System.out.println(name);
        System.out.println(fruit);
    }
}

# java StringTest 
xiaoming
apple

两种实例化方法的区别:
String 使用直接赋值方式之后,只要以后声明的字符串内容相同,则不会再开辟新的内存空间,但是 new 的还会。并且 new 的在单次 new 的过程中就会分配两块堆内存,只不过使用的是 new 返回的堆内存。

public class StringTest {
    public static void main(String args[]) {
        String str1 = "Hello World";
        String str2 = "Hello World";
        String str3 = "Hello World";

        System.out.println("str1==str2: " + (str1 == str2));
        System.out.println("str2==str3: " + (str1 == str2));
        System.out.println("str1==str3: " + (str1 == str2));
    }
}

# java StringTest 
str1==str2: true
str2==str3: true
str1==str3: true

2. 一个字符串就是一个 String 类的匿名对象,匿名对象就是一个已经开辟了堆内存空间的并可以直接使用的对象。一个字符串可以直接使用 String 类中的方法,也就证明了一个字符串就是一个 String 类的匿名对象。

3. 使用其 public boolean equals(String str) 方法进行比较,区分大小写。若是直接使用两个 String 类的成员进行比较,那比较的是首地址。使用 String 类对象时需要注意 NullPointerException 的问题,直接使用 <字符串>.equals(String str) 进行使用就不用担心这个问题,因为一个已知的字符串不会为 null,而且 equals() 中有对参数为 null 的判断。

public class StringTest {
    public static void main(String args[]) {
        String name = null;
        /*
        if (name.equals("xiaoming")) { //java.lang.NullPointerException
            System.out.println("equals");
        }
        */
        if ("xiaoming".equals(name)) {
            System.out.println("equals");
        }
    }
}

3. 字符串的内容不可改变,String 类定义的字符串的内容一旦声明就不可改变,改变只是重新分配内存,指向新内存。StringBuffer的内容是可以改变的。

public class StringTest {
    public static void main(String args[]) {
        String str1 = "Hello ";
        str1 = str1 + "World"; //重新分配内存,断开之前的指向,然后指向新内存
        System.out.println(str1);
    }
}

4. String 类的方法函数集

public String(char[] value)    构造    直接将一个字符数组变为一个字符串
public String(char[] value, int offset, int count)    构造    将一个指定范围的字符数组变为一个字符串
public String(byte[] bytes)    构造    将一个byte数组变为一个字符串
public String(byte[] bytes, int offset, int length)    构造    将一个指定范围的byte数组变为一个字符串
public char[] toCharArray()    将一个字符串变为一个字符数组
public char charAt(int index)    从一个字符串中取出指定位置的字符
public byte[] getBytes()    将一个字符串变为一个byte数组    
public int length()    字符串长度,注意是个函数,<数组名>.length 是不带括号的
public int indexOf(String str)    从头开始查找指定字符串的位置,找到了返回位置,找不到返回-1
public int indexOf(String str, int fromIndex)    从指定位置开始查找指定字符串的位置
public String trim()    清除左右两端的空格
public String substring(int beginIndex)    从指定位置开始一直取到尾对字符串进行截取
public String substring(int begin, int end)    指定截取字符串的开始点和结束点
public String[] split(String regex)    按照指定字符串对源字符串进行拆分,注意返回的是字符串数组
public String toUpperCase()    将字符串全转为大写
public String toLowerCase()    将字符串全转为小写
public boolean startsWith(String prefix)    判断是否是以指定字符串开头
public boolean endsWith(String prefix)    判断是否是以指定字符串结尾
public boolean equals(String str)    比较字符串内容是否相等
public boolean equalsIgnoreCase(String str)    不区分大小写比较两个字符串内容是否相等
public String replaceAll(String regex, String replacement)    字符串替换
public boolean contains(String str)    判断子串是否存在,JDK1.5之后才存在

5. 实际上 split() 方法能否对字符串进行正常拆分与正则表达式的操作有关,有时候会出现无法拆分的情况,例如一个IP地址不能直接按"."进行拆分,需要对"."进行转义,在Java中转义使用"\\"描述,"\\"表示一个"\"。

public class StringTest {
    public static void main(String args[]) {
        String ip_str = "192.168.1.120";
        String str[] = ip_str.split("\\.");
        for (String s : str) {
            System.out.print(s + "\t");
        }
        System.out.println("");
    }
}

# java StringTest 
192    168    1    120    

 

上一篇:IOS UItableView 滚动到底 触发事件


下一篇:小芳同学的错题总结(七)