十、常见类:Object、String、StringBuffer和StringBuilder
1、Object类
1) Object 类是所有java类的根基,每个类都使用Object做为超类,所有对象(包括数组)都实现这个类的方法
2) 如果类的声明中未使用extends关键字指明其基类,则默认基类为Object类
Object类中的方法://Object类中方法每个java对象都有
A、Object的toString方法:类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制(这样的输出结果可以等同看做java对象在堆中的内存地址)
B、Object的finalize()方法:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法
C、Object的equals()方法:比较两个对象是否相等,返回true或者false
D、Object的hashCode()方法:返回该对象的哈希码值(java对象的内存地址经过哈希算法得出的int类型数值),支持此方法是为了提高哈希表的性能
|finalize()方法的实例|
public class ObjectTest {
public static void main(String[] args){
Object ob=new Object();
System.out.println(ob.toString());
PersonPs ps=new PersonPs();
ps=null;
System.gc();//程序员只能"建议"垃圾回收器会后垃圾
}
}
class PersonPs{
public void finalize() throws Throwable{
System.out.println(this+"马上就要被回收了!");
//让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收
PersonPs ps=this;
}
}
|重写Object的equals()的例子 和 string中的equals()方法 以及==区别|
public class StartTest {
public static void main(String[] args) {
Star st1=new Star("王波",28);
Star st2=new Star("王波",28);
System.out.println(st1==st2);//比较的是内存地址 所以就算你重写了equals方法返回的依然为false
System.out.println(st1.equals(st2));//true
}
}
public class Star {
public String name;
private int age;
public Star(String name,int age){
this.name=name;
this.age=age;
}
public boolean equals(Object obj){
if(this==obj) return true;
if(obj instanceof Star){
Star s=(Star)obj;
if(s.name.equals(name) && s.age==age){
return true;
}
}
return false;
}
/*java语言中如何比较两个字符串是否一致,调用String 类的equals方法。所以if条件中写成:s.name.equals(name)
* java 中比较字符串为什么不能用“==”?
* 因为字符串是引用数据类型,而不是基本数据类型。例如引用类型的s1和s2是内存地址,比较的是内存地址。
* 而基本数据类型比较的是内容
* */
2、String类
String类是不能被继承的,是不可变类,也就是说String对象声明之后将不可以修改
String类的特点:
1) 字符串一旦创建不可再改变,"abc” 字符串对象一旦创建,不可以再改变
2) java中所有使用“双引号”括起来的字符串都会在“字符串常量池”中创建一份,字符串常量池在方法区中被存储,目的是为了提升字符串的访问效率。是“缓存”技术的一种体现
3) 在程序的执行过程中,如果程序用到某个字符串,例如:“abc”,那么程序会在字符串常量池中去搜索该字符串,如果没有找到则在字符串常量池中新建一“abc”字符串,若果找到了就直接拿过来用。字符串常量池是一个缓存区,为了提高访问字符串的效率
备注:比较两个字符串是否相等用*.equals()
String s4=new String("abc");
String s5=new String("abc");
System.out.println(s4==s5);//false,因为new了两次,这两者的内存地址不一样,而“==”比较的是内存地址,所以结果为false;
System.out.println(s4.equals(s5));//ture 因为equals比较的是两个字符串是否相同,两者都是“abc”而与内存地址是否相同无关所以结果为ture;
一般不提倡用+进行连接字符串,因为一旦连接以后会形成一个新的字符串,会很浪费字符创常量池的容量。
String类型赋值时用的是" "双引号 而 char类型赋值时用的是' '单引号
|String类中常见构造方法的一些应用|
public class StringTest {
public static void main(String[] args) {
//1方法
String s1="abc";
//2方法
String s2=new String("abc");
System.out.println(s2);//abc
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//ture
/*==两天
* 1)如为:基本数据类型,则比较内容是否相同
* 2)如为:引用数据类型,则比较内存地址是否相同
* 备注:比较引用类型的内容是否相同要通过String 的equal方法比较
* String 为引用数据类型,而s1(存储在字符串常量池中)和s2(堆内存中)内存地址不一样
* */
byte[] bytes={97,98,99,100};
//该构造方法作用是:通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
String s3=new String(bytes);
System.out.println(s3);//abcd
//s3是一个引用对引用进行输出的时候调用了String类中的toString()方法,而String类中的toString方法已经重写了Object类中的to_String方法
//该构造方法作用是:通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String
String s4=new String(bytes,1,2);
System.out.println(s4);//bc
char[] c1={'我','是','中','国','人'};
String s5=new String(c1);
System.out.println(s5);//我是中国人
String s6 =new String(c1,2,2);
System.out.println(s6);//中国
}
}
|String类常用方法:|
返回值类型 方法名字:
1)char charAt(int index):返回指定索引处的char值。
2)boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
3)boolean equals(Object anObject) 将此字符串与指定对象进行比较。
4)boolean equalsIsIgnoreCast(String anotherString) 将此String与另一个String比较,不考虑大小写
5)byte[] getBytes() 使用平台的默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中
6)int indexOf(String str) 返回指定字符串在此字符串中第一次出现处的索引
7)int indexOf(String str,int fromIndex) 返回指定字符串在此字符串中第一次出现处的索引,从指定的索引开始
3、StringBuffer和StringBuilder(默认的初始容量都是16)
1)含义:是一个字符串缓冲区,其工作原理是预先在内存中申请一块空间,以容纳字符序列,如果预留的字符空间不够用,则进行自动扩容以容纳更多的字符序列
String是不可变的字符序列,存储在字符串常量池中。StingBuffer缓冲区是一个char数组,但是该char数组是可变的,并且是可以自动扩容的。
2)如何优化StringBuffer和StringBuilder
最好再创建StringBuffer之前,预测StringBuffer的存储字符数量,然后在创建StringBuffer的时候采用指定初始化容量的方式创建StringBuffer。为了减少底层数组的拷贝,提高效率。
3)StringBuffer和StringBuilder的区别?
StringBuffer是线程的安全的(可以在多线程的环境下使用不会出现问题)
StringBuilder是非线程安全的,在多线程环境下使用可能出现问题
备注:字符串的频繁拼接推荐大家使用StringBuffer和StringBuilder而不推荐使用String因为String会创建大量的对象
public class StringBufferTest {
public static void main(String[] args) {
String[] ins={"体育","音乐","睡觉","美食"};
StringBuffer sb=new StringBuffer();
for(int i=0;i<ins.length;i++){
if(i==ins.length-1){
sb.append(ins[i]);
}else{
sb.append(ins[i]);
sb.append(",");
}
}
System.out.println(sb);
}
}