前言:
小编这里将上一期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
0
可以看出,在完成循环时的消耗的毫秒数相差甚远。
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);
总结:
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提出宝贵意见。
制作不易,麻烦给小编一个小小的赞吧。