前言: 小编这里将上一期String类型进行了补充,添加了字符串的修改,以及equals的用法内容,和hashcode的使用;上一期:http://t.csdnimg.cn/ijiM6
在上一期中我们说到字符串是不能被修改的,所以所有操作都是在新的对象中操作的;
那么如果我们要修改字符串如果用一下代码如何呢?
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);
总结:
从上述例子可以看出: String和 StringBuilder最大的区别在于String 的内容无法修改,而
StringBuilder 的内容可以以修改。(StringBuilder与StringBuffer用法基本一致)
频繁修改字符串的情况考虑使用 StringBuilder 。
注意: String 和 StringBuilder 类不能直接转换。如果要想互相转换,可以采用如下原则 :
String 变为 StringBuilder: 利用 StringBuilder 的构造方法或 append() 方法
StringBuilder 变为 String: 调用 toString() 方法。
在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
作用: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
小编对于String类进行了一次补充,但是hashcode是数据结构的内容,小编只是简单说明了一下其重写和作用,并没有深入讲解。
限于小编能力有限,可能有些地方存在错误,希望各位uu提出宝贵意见。
制作不易,麻烦给小编一个小小的赞吧。