zi

Java中String、StringBuilder、String

2016-12-21  本文已影响70人  字节码

java中创建类和对象的方式

1.自定义类,然后通过自定义的类创建对象。
2.sun提供了很多的类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象了。

Object类:

Object类是所有类的终极父类。 任何一个类都继承了Object类。

Object类常用的方法:

  1. toString(); 返回该对象的字符串表示。 返回一个字符串用于描述该对象的。 重写toString之后,我们直接输出一个对象的时候,就会输出符合我们所需求的格式数据。
    2.equals(Object obj) 用于比较两个对象的内存地址,判断两个对象是否为同一个对象。

注意:"=="用于比较引用数据类型时,比较的是两个对象的内存地址,equals方法默认情况下比较的也是两个对象的内存地址, 但是String类重写了Object的equals方法,方法内部是将字符串转换为字符数组,比较每一个字符是否相同,一旦不相同就返回flase,相同就返回true。所以两个字符串比较建议使用equals方法

3.hashCode() 返回该对象的哈希码值(大家可以把哈希码就 理解成是对象的内存地址)

java中的规范:一般我们重写了一个类的equals方法,我们都会重写它的hashCode方法。

java是开源....源代码公开...

查看源代码的方式:

1. 按住crt(mac是Command)键,单击查看源代码
2.把光标移动到你需要查看的代码按住fn + F3
    ```

Java中toString方法作用
>Object类具有一个toString()方法,你创建的每个类都会继承该方法。它返回对象的一个String表示,并且对于调试非常有帮助。然而对于默认的toString()方法往往不能满足需求,需要覆盖这个方法。
toString()方法将对象转换为字符串

public class Person {
String name;
String address;
int id;

public Person(String name, String address, int id) {
    this.name = name;
    this.address = address;
    this.id = id;
}

/// 重写toString() 方法
@Override
public String toString() {
    return "name ==" + name + "address ==" + address + "id == " + id;
}

}

/// 打印person对象
public static void main(String[] args) {

    Person person = new Person("sey", "北京", 11111);
    System.out.println(person);
}

/// 重写toString()方法后,打印结果: name ==seyaddress ==北京id == 11111
/// 未重写toString()方法,打印结果为: Person@15db9742


Java中toString()方法和Objective-C中的description方法作用相同,比如oc中重写description方法,在打印对象时,可以将对象的属性打印出来

- ###String类:
>String类是一个常量,是不可改变的对象,这也就是说每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将引用连接到新的对象

两种字符串创建方式:
1.```String str2 = "string";``` 
2.```String str3 = new String("string");```

 判断一下字符串是否相同

public static void main(String[] args) {
String str1 = "string";
String str2 = "string";
String str3 = new String("string");
String str4 = new String("string");

    System.out.println("str1是否等于str3?" + (str1 == str2));
    System.out.println("str2是否等于str3?" + (str2 == str3));
    System.out.println("str3是否等于str4?" + (str3 == str4));
    System.out.println("str1是否等于str3?" + (str1.equals(str2)));
}

/// 打印结果
/*
str1是否等于str3?true
str2是否等于str3?false
str3是否等于str4?false
str1是否等于str3?true
*/


原因(需要先了解下Java中字符串的两种创建方式):
第一种创建字符串的方式:```String str1 = "string";```这种方式创建字符串时,jvm首先检查```方法区```的 ```字符串常量池```中是否存在该字符串的对象,如果存在,就不会在字符串常量池中创建了,如果```字符串常量池```中不存在该字符串,那么就会在```字符串常量池```中创建该对象,并返回该对象的内存地址。
第二种创建字符串的方式:通过构造方法```String str3 = new String("string");```这种方式创建字符串时,jvm首先检测```字符串常量池```中是否存在该字符串的对象,如果存在,就不再在```字符串常量池```中创建该对象了,如果不存在,那么就会在```字符串常量池```中创建该字符串的对象,然后把```字符串常量池```中的该字符串拷贝到```堆内存``,然后返回```堆内存```中这个字符串对象的内存地址

测试1: 
```String str = new String("string");```会创建多少个对象
答案: 2 个,会在```字符串常量池```创建一个,再拷贝到堆内存1个,共2个。

测试2:
```String str = ""; str = null ```
判断```str.isEmpty()```放true还是flase
答案:报空指针错误```java.lang.NullPointerException```

- 手动实现String类trim()函数  -- 去掉字符串首尾的空格

// 自己实现trim()函数,去除字符串首尾的空格
public static String customTrim(String str) {

    // 先将字符串转换为字符数据
    char[] arr = str.toCharArray(); 
    
    // 定义两个索引,让其一开始记录字符数组的首位索引,然后遍历字符数组记录字符数组中的非空格开始的索引和非空格结尾的索引
    int startIndex = 0;
    int endIndex = arr.length - 1;
    for (int i = 0; i < arr.length; i++) {
        
        if (arr[startIndex] == ' ') {
            startIndex++;
        } else {
            break;
        }
        
        if (arr[endIndex] == ' ') {
            endIndex--;
        } else {
            break;
        }
    }
    
    // 根据开始和结束索引截取字符串
     return str.substring(startIndex, endIndex + 1);
}

/// 调用
public static void main(String[] args) {

    String string = "   今天天气 真好啊      ";
    string = customTrim(string);
    System.out.println(string);
}

// 打印结果已去除首尾的空格: 今天天气 真好啊


截取一个路径的文件名
// 截取一个路径的文件名
public static String getFileName(String path) {
    
    // 取出路径中最后一个\的索引值,注意: 单\是的意思,通过单\判断,需要些双\\
    int index = path.lastIndexOf("/");
    
    // 截取字符串
    return path.substring(index + 1);
    
}

public static void main(String[] args) {

    String path = "/Users/mofeini/Desktop/subcate.plist";
    String fileName = getFileName(path);
    System.out.println(fileName);
}

反转字符串中的字符

// 反转字符串
public static String InvertString(String string) {

    // 将字符串转换为字符数组,遍历这个数组
    char[] arr = string.toCharArray();
    
    for (int startIndex = 0, endIndex = arr.length - 1; startIndex<endIndex; startIndex++, endIndex--){
        
        char temp = arr[startIndex];
        arr[startIndex] = arr[endIndex];
        arr[endIndex] = temp;
    }
    
     //将字符数组转换为字符串
    String string2 = new String(arr);
        
    return string2;
}

统计子字符串在一个字符串中出现的次数

// 统计子字符串在一个字符串中出现的次数
public static int getCount(String string, String subStr) {

    int count= 0;  // 记录查找到子串的次数
    int fromIndex = 0;  // 记录从什么位置开始查找,只要查找到一个,就让fromIndex+=子串的长度
    
    // 只有  能找到子串就接着找,找不到就会返回-1 结束语句
    while ((fromIndex = string.indexOf(subStr, fromIndex)) != -1) {
        count++;
        fromIndex += subStr.length();
    }
    
    return count;
}

String的特点:字符串是常量,一旦创建就不能修改了。
如果要频繁修改字符串的内容,建议使用字符串缓冲类(StringBuffer)

- ###StringBuffer其实就是一个存储字符的容器。
StringBuffer 底层依赖一个字符数组才能存储字符数据的,该字符数组默认的初始容量为16,如果字符数组的容量不够使用,自动增长1倍+2

StringBuffer添加字符串append()

StringBuffer sBuffer = new StringBuffer();
sBuffer.append("11");



StringBuffer容器的具备 的行为:
    
    String 
    
    增加
        append(boolean b)    可以添加任意类型 的数据到容器中
        insert(int offset, boolean b)  指定插入的索引值,插入对应 的内容。 

    删除
        delete(int start, int end)  根据指定的开始与结束的索引值删除对应的内容。
        deleteCharAt(int index)   根据指定 的索引值删除一个字符。
    
    
    修改
    
        replace(int start, int end, String str) 根据指定 的开始与结束索引值替代成指定的内容。
        reverse()   翻转字符串缓冲类的内容。  abc--->cba
        
        setCharAt(int index, char ch)  把指定索引值的字符替换指定的字符。 
        substring(int start, int end)  根据指定的索引值截取子串。
        ensureCapacity(int minimumCapacity)  指定StringBuffer内部的字符数组长度的。
        
    查看
        indexOf(String str, int fromIndex) 查找指定的字符串第一次出现的索引值,并且指定开始查找的位置。
        lastIndexOf(String str) 
        
        capacity() 查看当前字符数组的长度。 
        length() 
        
        charAt(int index) 
        toString()   把字符串缓冲类的内容转成字符串返回。
        

StringBuffer 与 StringBuilder的相同处与不同处:
    
    相同点:
        1. 两个类都是字符串缓冲类。
        2. 两个类的方法都是一致的。
    不同点:
        1. StringBuffer是线程安全的,操作效率低 ,StringBuilder是线程非安全的,操作效率高。
        2. StringBuffer是jdk1.0出现 的,StringBuilder 是jdk1.5的时候出现的。
        
StringBuilder与StringBuffer ,通常应该优先用 StringBuilder类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
在大部分情况下的优先级使用,StringBuilder>StringBuffer>String

当final用来修饰String和StringBuffer时的区别
>要知道,当final用来修饰的时候,变量是不可变的,往细了说,是变量所连接的内存地址是不可变的。
因此,当String类被修饰时,此时的string就是一个常量,他的地址不可变,因此值不能改变;
但当用来修饰StringBuffer类时,却可以调用它的append方法,究其机理是StringBuffer类被创造可以改变他的内存地址,因此他的地址在每次调用append时都可以改变,这个变量也随之可变。
上一篇下一篇

猜你喜欢

热点阅读