Java 常用类库(一)

为了熟悉java常用类库,可以多查阅JKD文档英文版,这里总结一下java.lang包下面的Runtime、System、StringBuffer类常用方法。

Runtime类

在每一个JVM进程中都会存在以Runtime类的实例话对象,此对象将由JVM为用户提供好。但是为了保持只有一个Runtime类的实例化对象,Runtime类采用的为单例设计模式,构造方法被私有化了(文档中查找不到该类构造函数)。

既然是单例设计模式,必然有一个static方法取得本类的实例化对象:public static Runtime getRuntime()

当取得了Runtime类对象之后,就可以通过如下三个方法取得一些内存信息:

  1. 最大可用内存量: public long maxMemory();
  2. 可用内存量: public long totalMemory();
  3. 空闲内存量: public long freeMemory();

Runtime类还有一个重要方法:清理垃圾空间: public void gc() ;

// Runtimel类方法的使用
public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
    Runtime run = Runtime.getRuntime() ;
    run.gc();
    System.out.println("1、MAX = " + run.maxMemory());
    System.out.println("1、TOTAL = " + run.totalMemory());
    System.out.println("1、FREE = " + run.freeMemory());
    String string = "" ;
    for (int i = 0; i < 30000; i++) {
        string += i ;       // 产生垃圾
    }
    System.out.println("2、MAX = " + run.maxMemory());
    System.out.println("2、TOTAL = " + run.totalMemory());
    System.out.println("2、FREE = " + run.freeMemory());
    run.gc();
    System.out.println("2、MAX = " + run.maxMemory());
    System.out.println("2、TOTAL = " + run.totalMemory());
    System.out.println("2、FREE = " + run.freeMemory());
    }
}

运行结果:

1MAX = 689963008
1TOTAL = 48234496
1、FREE = 47721712
2MAX = 689963008
2TOTAL = 290979840
2、FREE = 62436128
3MAX = 689963008
3TOTAL = 290979840
3、FREE = 285322792

面试题:请问什么是GC?如何操作?

  1. GC是垃圾收集器(Garbage Collector),是负责垃圾空间清理的线程。
  2. 在Java之中可由JVM自动调用GC,或用户调用Runtime类中的gc()方法手工清理。

System类

在System类中有一个方法是取得当前日期时间:public static long currentTimeMillis()。此时取得的是一个long数值,并不是传统意义的年月日。

计算程序运行的时间

// 计算程序运行时间
public class test {
    public static void main(String[] args) throws CloneNotSupportedException {
    long start = System.currentTimeMillis();
    String string = "" ;
    for (int i = 0; i < 30000; i++) {
        string += i ;       // 产生垃圾
    }
    long end = System.currentTimeMillis() ;
    System.out.println("本操作所用时间:" + (end - start));
    }
}

运行结果:

本操作所用时间:2213

fianlize方法

在System类中存在一个方法:public static void gc() 。等价于Runtime类中的gc() 方法,这两个gc没有任何区别。
如果希望对象在被回收之前进行一些处理操作,则可以覆写Object类中的finalize()方法:protected void finalize() throws Throwable;

面试题:请解释final、finally、finalize的区别?

  1. final关键字:可以定义不能被继承的父类,不能被覆写的方法,常量。
  2. finally关键字:异常处理的统一出口,不管是否有异常都执行。
  3. finalize方法:Object类中的方法,当对象被清理前执行的收尾操作(相当于C++中的析构函数)。

StingBuffer类

string和StringBuffer的比较

首先列出String类的特点:

  1. 字符串内容一旦声明则不可改变
  2. 一个字符串常量就是String类的匿名对象;
  3. String类对象有两种实例化方式:
    1. 方式一:直接赋值,可以自动入池,只开辟一块内存空间
    2. 方式二:构造方法实例化,会开辟两块空间,其中一块成为垃圾,不会自动入池,可以使用intern()方法手工入池。

所有在频繁修改字符串内容时,不可使用Sring,此时Java中又提供有一个StringBuffer类。StringBuffer类中的字符串连接使用:public StringBuffer append(数据类型 d)

String和StringBuffer类的声明:

StingStringBuffer
public final class String extends Object implements Serializable, Comparable,CharSequencepublic final class StringBuffer extends Object implements Serializable, CharSequence

发现这两个类都是CharSequence接口的子类,如果见到某参数类型是CharSequence,就应该想到是字符串。StringBuffer和String类之间不可之间转型,但是可以通过间接方法转型。

StringBuffer和String类的间接转型

1、将String变为StringBuffer:

  • 利用StringBuffer类的构造方法:public StringBuffer(String str)
  • 利用StringBuffer类的append()方法:public StringBuffer append(String str)

2、将StringBuffer变为String

  • 所有对象都支持转换为String类对象的方法:public String toString()

StringBuffer类比较有用的方法

1、插入数据:public StringBuffer insert(int offset,数据类型 data)
2、删除部分数据:public StringBuffer delete(int start,int end);
3、字符串反转:public StringBuffer reverse()

String、StringBuffer、StringBuilder拼接字符串的性能比较

// String、StringBuffer、StringBuilder拼接字符串的性能比较
public class test {
    public static void main(String[] args) {
        testString() ;
        testStringBuffer() ;
        testStringBuilder() ;
    }

    public static void testString(){
        long start = System.currentTimeMillis() ;
        String str = "" ;
        for (int x = 0; x < 30000; x++){
            str += x;
        }
        long end = System.currentTimeMillis() ;
        System.out.println("String处理花费:" + (end - start));
    }

    public static void testStringBuffer(){
        long start = System.currentTimeMillis() ;
        StringBuffer str = new StringBuffer() ;
        for (int x = 0; x < 30000; x++){
            str.append(x) ;
        }
        long end = System.currentTimeMillis() ;
        System.out.println("StringBuffer处理花费:" + (end - start));
    }

    public static void testStringBuilder(){
        long start = System.currentTimeMillis() ;
        StringBuilder str = new StringBuilder() ;
        for (int x = 0; x < 30000; x++){
            str.append(x) ;
        }
        long end = System.currentTimeMillis() ;
        System.out.println("StringBuilder处理花费:" + (end - start));
    }
}

运行结果:

String处理花费:2190
StringBuffer处理花费:8
StringBuilder处理花费:9

面试题:请解释String、StringBuffer、StringBuilder类的区别?

  1. String不适合字符串频繁修改,而StringBuffer、StringBuilder适合,且速度远远高于String;
  2. StringBuffer是在JDK1.0引入的,StringBuilder是JDK1.5之后引入,二者继承方法相同,方法组成也相同;
  3. StringBuffer中所有方法都使用synchronized进行标记,都是同步方法,性能相对较低,但是多线程的数据安全性好。StringBuilder采用异步处理,性能相对较高,但是多线程时数据安全性差一点。

上面程序StringBuffer处理花费和StringBuilder处理花费时间差不多,是因为此程序为单线程的运行环境,所以同步异步操作差异不大。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值