Java基础类库

StringBuffer类

  • String类特点:
    • 每一个字符串常量都属于一个String类的匿名对象,并且不可更改;
    • String有两个常量池:静态常量池、运行时常量池;
    • String类对象实例化建议使用直接赋值的形式完成,这样可以直接将对象保存在对象池之中以方便下次重用;
  • StringBuffer并不像String类那样拥有两种对象实例化方式,StringBuffer必须像普通类对象那样首先进行对象实例化,而后才可以调用方法执行处理,这个时候可以考虑使用StringBuffer类中的如下方法:
    • 构造方法:public StringBuffer()
    • 构造方法:public StringBuffer(String str)
    • 数据追加:public StringBuffer append(数据类型 变量)
//String类对象引用传递
public class StringBufferFun {
    public static void main(String[] args) {
        String str = "Hello";
        change(str);
        System.out.println(str);
    }
    public static void change(String temp) {
        temp += " World";
    }
}

//StringBuffer类对象引用传递
public class StringBufferFun {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("Hello");
        change(str);
        System.out.println(str);
    }
    public static void change(StringBuffer temp) {
        temp.append(" World!");
    }
}
  • 在StringBuffer类里面除了提供有字符串修改之外,实际上也提供有一些String所不具备的方法:
    • 插入数据:public StringBuffer insert(int offset, 数据类型 b)
    • 删除制定范围的数据:public StringBuffer delete(int start, int end)
    • 字符串内容反转:public StringBuffer reverse()
//插入数据
public class StringBufferFun {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer();
        str.append(" World").insert(0, "Hello");
        System.out.println(str);
    }
}

//删除数据
public class StringBufferFun {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("Hello World!");
        str.delete(5, 12);
        System.out.println(str);
    }
}

//字符串反转
public class StringBufferFun {
    public static void main(String[] args) {
        StringBuffer str = new StringBuffer("Hello World!");
        str.reverse();
        System.out.println(str);
    }
}
  • 实际上与StringBuffer类还有一个类似的功能类:StringBuilder类,这个类是JDK1.5的时候提供的,该类中提供的方法与StringBuffer功能相同,最大的区别在于StringBuffer类中的方法属于线程安全的,全部使用了synchronized关键字进行标注,而StringBuilder类属于非线程安全的;

CharSequence接口

  • CharSequence是一个描述字符串结构的接口,在这个接口里面一般发现有三种常用的子类:
String类 StringBuffer类 StringBuilder类
public final class String extends Object implements Serializable, Comparable<String>, CharSequence public final class StringBuffer extends Object implements Serializable, CharSequence public final class StringBuilder extends Object implements Serializable, CharSequence
此图来源于李兴华老师
  • 现在只要有字符串就可以为CharSequence接口实例化
public class JavaFun {
    public static void main(String[] args) {
        CharSequence str = "Hello World";       //子类实例向父接口转型
    }
}
  • CharSequence本身是一个接口,在该接口中也定义有如下操作方法:
    • 获取指定索引字符:public char charAt(int index)
    • 获取字符串的长度:public int length()
    • 截取部分字符串:CharSequence subSequence(int start, int end)

AutoCloseable接口

  • AutoCloseable主要是用于资源开发的处理上,以实现资源的自动关闭(释放资源),例如:在进行文件、网络、数据库开发的过程之中,由于服务器的资源有限,所以使用之后一定要关闭资源,这样才可以被更多的使用者所使用;
//模拟消息发送
package com.company;
interface IMessage {
    public void send();
}
class NetMessage implements IMessage {
    private String msg;
    public NetMessage(String msg) {
        this.msg = msg;
    }
    public boolean open() {
        System.out.println("消息链接成功");
        return true;
    }
    @Override
    public void send() {
        if (this.open()) {
            System.out.println("消息发送:" + this.msg);
        }
    }
    public void close() {
        System.out.println("消息断开链接");
    }
}
public class AutoCloseableApi {
    public static void main(String[] args) {
        NetMessage nm = new NetMessage("Hello World");
        nm.send();
        nm.close();
    }
}
  • 此时会有一个疑问:既然所有的资源完成处理之后都需要进行关闭操作,那么是否可以实现一种自动关闭的功能呢,所以推出了AutoCloseable访问接口,这个接口是在JDK1.7的时候提供的,并且该接口只提供有一个方法:public void close() throws Exception;
此图来源于李兴华老师
  • 要想实现自动关闭处理,除了要使用AutoCloseable之外,还需要结合异常处理语句才可以正常调用;
package com.company;
interface IMessage extends AutoCloseable {
    public void send();
}
class NetMessage implements IMessage {
    private String msg;
    public NetMessage(String msg) {
        this.msg = msg;
    }
    public boolean open() {
        System.out.println("消息链接成功");
        return true;
    }
    @Override
    public void send() {
        if (this.open()) {
            System.out.println("消息发送:" + this.msg);
        }
    }
    public void close() {
        System.out.println("消息断开链接");
    }
}
public class AutoCloseableApi {
    public static void main(String[] args) {
        try (NetMessage nm = new NetMessage("Hello World")) {
            nm.send();
        } catch (Exception e) {}
    }
}

Runtime类

  • Runtime描述的是运行时的状态,在整个的JVM之中,Runtime类是唯一一个与JVM运行状态有关的类,并且都会默认提供有一个该类的实例化对象;
  • 由于在每一个JVM进程里面只允许提供有一个Runtime类的对象,所以这个类的构造方法被默认私有化了,那么就证明该类使用的是单例设计模式,并且单例设计模式一定会提供有一个static方法获取本类实例;
此图来源于李兴华老师
  • 由于Runtime类属于单例设计模式,如果想要获取实例化对象,那么就可以依靠类中的getRuntime()方法完成:
    • 获取实例化对象:public static Runtime getRuntime()
  • 通过Runtime类中的availableProcessors()方法可以获取本机的CPU内核数:public int availableProcessors()
//获取Runtime类对象
public class RuntimeApi {
    public static void main(String[] args) {
        Runtime run = Runtime.getRuntime();
        System.out.println(run.availableProcessors());
    }
}
  • 除了以上的方法之外,在Runtime类里面还提供有一下四个重要的操作方法:
    • 获取最大可用内存空间:public long maxMemory(),默认的配置为本机系统内存的四分之一;
    • 获取可用内存空间:public long totalMemory(),默认的配置为本机系统内存的六十四分之一;
    • 获取空闲内存空间:public long freeMemory()
    • 手工进行GC处理:public void gc()
//观察内存状态
public class RuntimeApi {
    public static void main(String[] args) throws Exception {
        Runtime run = Runtime.getRuntime();
        System.out.println("【1】MAX_MEMORY " + run.maxMemory());
        System.out.println("【1】TOTAL_MEMORY " + run.totalMemory());
        System.out.println("【1】FREE_MEMORY " + run.freeMemory());
        String str = "";
        for (int x = 0; x < 30000; x ++) {
            str += x;
        }
        System.out.println("【2】MAX_MEMORY " + run.maxMemory());
        System.out.println("【2】TOTAL_MEMORY " + run.totalMemory());
        System.out.println("【2】FREE_MEMORY " + run.freeMemory());
        run.gc();
        System.out.println("【3】MAX_MEMORY " + run.maxMemory());
        System.out.println("【3】TOTAL_MEMORY " + run.totalMemory());
        System.out.println("【3】FREE_MEMORY " + run.freeMemory());
    }
}

System类

  • System定义的处理方法:
    • 数组拷贝:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    • 获取当前的日期时间数值:public static long currentTimeMillis()
    • 进行垃圾回收:public static void gc()
//操作耗时的统计
public class SystemApi {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String str = "";
        for (int x = 0; x < 30000; x ++) {
            str += x;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}
  • 在System类里面会发现也提供有一个gc()方法,但是这个gc()方法并不是重新定义的新方法,而是调用了Runtime.getRuntime().gc();

Cleaner类

  • Cleaner类是在JDK1.9之后提供的对象清理操作,其主要功能是进行finalize()方法的替代,在C++语言里面有两种特殊的函数:构造函数、析构函数(对象的手工回收),在Java里面所有的垃圾空间都是通过GC自动回收的,所有很多情况下是不需要使用析构函数的,也正是因为如此,Java也没有提供这方面的支持;
  • 但是Java本身依然提供了给用户收尾的操作,每一个实例化对象在回收之前至少给它一个喘息的机会,最初实现对象收尾处理的方法是Object类中所提供的finalize()方法,这个方法定义如下:
    • @Deprecated(since="9") protected void finalize() throws Throwable
  • 该替换指的是不建议继续使用这个方法了,而是说子类可以继续使用这个方法名称,这个方法最大的特征是抛出了一个Throwable异常类型,而这个异常类型分为两个子类型:Error、Exception,平常所处理的都是Exception;
//传统回收
import java.lang.ref.Cleaner;
class Member {
    public Member() {
        System.out.println("对象产生");
    }
    @Override
    protected void finalize() throws Throwable {
        System.out.println("对象回收");
        throw new Exception("程序继续执行");
    }
}
public class CleanerApi {
    public static void main(String[] args) {
        Member mb = new Member();
        mb = null;
        System.gc();
        System.out.println("程序结束");
    }
}

//Cleaner回收
class Member implements Runnable {
    public Member() {
        System.out.println("对象产生");
    }
    @Override
    public void run() {
        System.out.println("对象回收");
    }
}
class MemberCleaning implements AutoCloseable {
    public static final Cleaner cleaner = Cleaner.create();
    private Member member;
    private Cleaner.Cleanalbe cleanalbe;
    public MemberCleaning() {
        this.member = member;
        this.cleanalbe = this.cleaner.register(this, this.member);
    }
    @Override
    public void close() throws Exception {
        this.cleanalbe.clear();
    }
}
public class CleanerApi {
    public static void main(String[] args) throws Exception {
        try(MemberCleaning mc = new MemberCleaning()) {

        } catch (Exception e) {}
    }
}

对象克隆

  • 对象克隆指的就是对象的复制,而且属于全新的复制,即:使用已有对象内容创建一个新的对象,如果要想进行对象克隆需要使用到Object类中的clone()方法:protected Object clone() throws CloneNotSupportedException,所有的类都会继承Object父类,所以所有的类都一定会有clone()方法,但是并不是所有的类都希望被克隆,如果当前对象需要被克隆,那么对象所在类需要实现一个Cloneable接口,此接口并没有任何的方法提供,是因为它描述的是一种能力;
class MemberClone implements Cloneable {
    private String name;
    private int age;
    public MemberClone(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "【" + super.toString() + "】name='" + this.name + '\'' + ", age=" + this.age;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
public class ObjectClone {
    public static void main(String[] args) throws Exception {
        MemberClone mcA = new MemberClone("张三", 18);
        MemberClone mcB = (MemberClone) mcA.clone();
        System.out.println(mcA);
        System.out.println(mcB);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容