一、创建方式:
1、String str = "abc";
2、char[] value = {'a','b','c'}; String str = new String(value);
package cn.tedu;
/**本类用于复习String*/
public class ReviewString {
public static void main(String[] args) {
/**
* string创建对象的两种方式
* 直接创建/通过对象创建
*/
String s1 = "abc";
char[] value = {'a','b','c'};
String s2 = new String(value);
String s3 = "abc";
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true,String重写了equals()。
System.out.println(s1 == s3);//true,s1已经创建过一次,值(abc)存在于常量池中。
System.out.println(s2.hashCode());//96354
System.out.println(s2);//abc
}
}
二、字符串常量池
字符串常量池位于堆内存中,专门用来存放字符串常量,可以提高内存的使用率,避免开辟多余的内存空间存放相同的字符串,如果该字符串已经存在于常量池中,则返回他的引用,如果不在,则实例化一个字符串放在常量池中,并返回他的引用。
三、String API总结---hashCode()&toString()&equals()...
方法有很多,重点看这三个
String重写了这三个方法;
1、hashCode():
(1)默认实现方式:返回根据对象的地址值生成的哈希码值;
(2)重写后实现方式:根据对象的属性属性值生成的哈希码值。
2、toString():
(1)默认实现方式:返回对象的包名.类名@十六进制的哈希码值;
(2)重写后实现方式:返回对象的类型、属性、属性值。
3、equals():
(1)默认实现方式:比较两个对象的地址值;
(2)重写后实现方式:比较两个对象的类型、属性、属性值;
package cn.tedu;
import java.util.Objects;
/**本类用于复习String方法的属性*/
public class ReviewString03 {
public static void main(String[] args) {
test01 t1 = new test01();
test02 t2 = new test02();
System.out.println(t1.toString());//cn.tedu.test01@5594a1b5
System.out.println(t2.toString());//test02{a=10, s='hello'}
System.out.println(t1.equals(t2));//false
System.out.println(t1.hashCode());//1435804085
System.out.println(t2.hashCode());//99163593
}
}
//本类没有重写hashCode()&toString()&equals()
class test01{
int a = 10;
String s = "hello";
public static void get01(){
}
}
//本类中重写了hashCode()&toString()&equals()
class test02{
int a = 10;
String s = "hello";
@Override
public String toString() {
return "test02{" +
"a=" + a +
", s='" + s + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
test02 test02 = (test02) o;
return a == test02.a &&
Objects.equals(s, test02.s);
}
@Override
public int hashCode() {
return Objects.hash(a, s);
}
public static void get02(){
}
}
(3)equals() 和 "==" 有什么区别???
答:(1)使用==比较时,如果比较的两个变量是引用类型,那么比较的是两个变量的物理地址,如果比较的两个变量都是数值类型,那么比较的是具体的数字是否相等;
(2)使用equals()比较时,实现方式要根据具体的实现决定,与顶级父类Object里的默认实现方式不同就表明重写了这个方法。
四、stringBuffer和stringBuilder
stringBuffer和stringBuilder中的append()用来拼接字符串,直接上代码:
package cn.tedu;
/**本类用于复习StringBuffer&StringBuilder*/
public class ReviewString02 {
public static void main(String[] args) {
/**
* stringBuffer里面的append()用来拼接字符串
*
* 需求:将helloWord拼接10000次
*/
String str = "helloWord";
// method1(str);//本方法用于普通方式拼接
method2(str);//本方法使用append()拼接
}
private static void method2(String str) {
StringBuffer append = null;
StringBuffer sb = new StringBuffer();
long s = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
append = sb.append(str);
}
System.out.println(append);
long e = System.currentTimeMillis();
System.out.println("拼接用的时间为:"+(e-s)+"ms");//拼接用的时间为:9ms
}
private static void method1(String str) {
String result1 = null;
long s = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
result1 = result1 + str;
}
System.out.println(result1);
long e = System.currentTimeMillis();
System.out.println("拼接用的时间为:"+(e-s)+"ms");//拼接用的时间为:128ms
}
}