十、常见类: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);
   }
}

 

 

posted @ 2016-12-21 11:40  爱笑的berg  阅读(197)  评论(0编辑  收藏  举报