【Java基础语法】字符修改,以及equals的用法

前言:

小编这里将上一期String类型进行了补充,添加了字符串的修改,以及equals的用法内容,和hashcode的使用;上一期:http://t.csdnimg.cn/ijiM6

 1.字符串的修改

在上一期中我们说到字符串是不能被修改的,所以所有操作都是在新的对象中操作的;

那么如果我们要修改字符串如果用一下代码如何呢?

        String sr="123";
        sr+="456";
        System.out.println(sr);

 但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。

所以我们就要借助StringBuffer 和 StringBuilder

如下代码所示:

long start=System.currentTimeMillis();
        String s1="";
        for (int i = 0; i <10000 ; i++) {
            s1+=i;
        }
        long end=System.currentTimeMillis();
        System.out.println(end-start);

        long start1=System.currentTimeMillis();
        StringBuffer stringBuffer=new StringBuffer("");
        for (int i = 0; i <10000 ; i++) {
            stringBuffer.append(i);
        }
        long end1=System.currentTimeMillis();
        System.out.println(end1-start1);

        long start2=System.currentTimeMillis();
        StringBuilder stringBuilder=new StringBuilder("");
        for (int i = 0; i <10000 ; i++) {
            stringBuffer.append(i);
        }
        long end2=System.currentTimeMillis();
        System.out.println(end2-start2);

运行结果

265

1

可以看出,在完成循环时的消耗的毫秒数相差甚远。

StringBufferd的用法

1.StringBuffer append(String str):
在尾部追加,相当于 String += ,可以追加: boolean char char[]
double float int long Object String StringBuff 的变量

例如:

        StringBuffer stringBuffer=new StringBuffer("123");
        stringBuffer.append("456");
        System.out.println(stringBuffer);

这里和‘+’法差不多,但是使用的一直是一个对象。 

2.setCharAt(int index, char ch)

index 位置的字符设置为 ch
        StringBuffer stringBuffer=new StringBuffer("123");
        stringBuffer.setCharAt(0,'3');
        System.out.println(stringBuffer);

 输出:323

3.int indexOf(String str)
返回 str 第一次出现的位置
int indexOf(String str, int fromIndex)
fromIndex 位置开始查找 str 第一次出现的位置
int lastIndexOf(String str) 
返回最后一次出现 str 的位置
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找 str 最后一次出现的位置

这些和String类用法一样,小编上期已经讲解过了,在这里不再赘述。

4.StringBuff insert(int offset, String str)

offset 位置插入:八种基类类型 & String 类型 & Object 类型数据

 

代码如下:

        StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");
        stringBuffer1.insert(0,"123");
        System.out.println(stringBuffer1);

输出:123aaabbbcccaaabbbccc

5.StringBuffer deleteCharAt(int index)

删除 index 位置字符
StringBuffer delete(int start, int end)
删除 [start, end) 区间内的字符

 

 代码如下:

        StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");
        StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");
        stringBuffer1.delete(0,3);
        stringBuffer2.deleteCharAt(3);
        System.out.println(stringBuffer1);
        System.out.println(stringBuffer2);

输出:

bbbcccaaabbbccc

aaabbcccaaabbbccc

注意: 区间是左闭右开;

6.StringBuffer replace(int start, int end, String str)
[start, end) 位置的字符替换为 str

代码如下:


        StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");
        stringBuffer2.replace(0,3,"AAA");
        System.out.println(stringBuffer2);

输出:

 AAAbbbcccaaabbbccc 

7.String substring(int start)
start 开始一直到末尾的字符以 String 的方式返回
String substring(int start,int end)
[start, end) 范围内的字符以 String 的方式返回

 代码如下:

 StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");
 StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");
 String s1= stringBuffer1.substring(3);
 String s2= stringBuffer2.substring(3,6);
 System.out.println(s1);
 System.out.println(s2);

 输出:

bbbcccaaabbbccc
bbb

8.StringBuffer reverse()

反转字符串

 代码如下:

StringBuffer stringBuffer1=new StringBuffer("12345");
stringBuffer1.reverse();
System.out.println(stringBuffer1);

输出:

54321

9. to String()

转String类型

代码实例:

 StringBuffer stringBuffer1=new StringBuffer("12345");
 String str=stringBuffer1.toString();
 System.out.println(str);

总结: 

从上述例子可以看出: String和 StringBuilder最大的区别在于String 的内容无法修改,而
StringBuilder 的内容可以以修改。(StringBuilder与StringBuffer用法基本一致 
频繁修改字符串的情况考虑使用 StringBuilder
注意: String StringBuilder 类不能直接转换。如果要想互相转换,可以采用如下原则 :
String 变为 StringBuilder: 利用 StringBuilder 的构造方法或 append() 方法
StringBuilder 变为 String: 调用 toString() 方法。

2.equals的使用

在Java中,==进行比较时:
如果==左右两侧是基本类型变量,比较的是变量中值是否相同
如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比

使用引用中的地址直接来进行比较。

例如:

public class test1 {
    public static void main(String[] args) {
        Person person1=new Person("小明",15);
        Person person2=new Person("小明",15);
        System.out.println(person2==person1);
        System.out.println(person2.equals(person1));
    }
}
class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }
}

 输出:

false

false

 所以我们此时重写equals方法

class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    public boolean equals(Object obj){
        Person person=(Person) obj;
        return this.name.equals(person.name)&&this.age==person.age;

    }
}

此时输出:

false

true 

3.hashcode方法

作用:hashCode()方法帮我算了一个具体的对象位置。

hashcode方法源码:

public native int hashCode();

 该方法是一个native方法,底层是由C/C++代码写的。我们看不到。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例代码:

public class test1 {
    public static void main(String[] args) {
        Person person1=new Person("小明",15);
        Person person2=new Person("小明",15);

        System.out.println(person2.hashCode());
        System.out.println(person1.hashCode());
    }
}
class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    public boolean equals(Object obj){
        Person person=(Person) obj;
        return this.name.equals(person.name)&&this.age==person.age;
    }
}

输出:

1163157884
1956725890

与equals方法一样,我们重写其方法:

class Person{
    public String name;
    public int age;
    public Person(String name,int age){
        this.age=age;
        this.name=name;
    }
    @Override
    public int hashCode() {
        return Objects.hash(name,age);
    }

输出:

23458769
23458769 

 4.总结

小编对于String类进行了一次补充,但是hashcode是数据结构的内容,小编只是简单说明了一下其重写和作用,并没有深入讲解。

限于小编能力有限,可能有些地方存在错误,希望各位uu提出宝贵意见。

制作不易,麻烦给小编一个小小的赞吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值