StringBuffer类
面试题:请解释String、StringBuffer、 StringBuilder 的区别?
引出StringBuffer就不得不提String和StringBuilder,首先String不能够修改内容所以有StingBuffer和StringBuilder去修改String数据类型的内容, 而StingBuffer和StringBuilder的功能相同但前者是一个线程安全的,后者是非线程安全的
StringBuffer的使用需要产生一个该类的实例化对象,然后在调用里面的方法去实现String类型数据的修改:
- 构造方法:public StringBuffer([String str]);
- 数据追加:public StringBuffer append(数据类型 变量),相当于字符串中的“+”操作
- 插入数据: public StringBuffer insert(int offset, 数据类型 b)
- 删除指定范围的数据: public StringBuffer delete(int start, int end)
- 字符串内容反转: public StringBuffer reverse()
public class JavaAPIDemo {
public static void main(String[] args) {
StringBuffer buf = new StringBuffer() ;
buf.append("Hello World !").delete(6, 12).insert(6,"csdn");//程序先添加了“Hello World !”删除了“World”然后在插入了“csdn”
System.out.println(buf.reverse());//字符串翻转
}
}输出结果为:“! ndcs olleH”
CharSequence接口
字符串在Java中描述的公共类型就是CharSequence,上面的StingBuffer和StringBuilder的构造方法都可以接收该接口,它们的方法也可以接收该接口,只要有字符串就可以为该接口实例化
这个接口也提供有几个方法:
- 获取指定索引字符: public char charAt(int index);。
- 获取字符串的长度: public int length();
- 截取部分字符串: public CharSequence subSequence(int start, int end);
public class JavaAPIDemo {
public static void main(String[] args) {
CharSequence str = "wWw.csdn.cn" ; // 子类实例向父接口转型
CharSequence sub = str.subSequence(4, 8) ;
System. out. println(sub);
} 输出为“csdn”
}
AutoCloseable接口
该接口主要是用于资源开发的处理上以实现资源的自动关闭,它的使用要与异常处理配合使用
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
try (IMessage nm = new NetMessage( "Www . mldn.cn")) {
nm.send();//会自动调用close方法
} catch (Exception e) {
}
}
}
interface IMessage implements AutoCloseable{
public void send() ; // 消息发送
}
class NetMessage implements IMessage{
// 实现消息的处理机制
private String msg ;
public NetMessage(String msg) {
this.msg = msg ;
}
public boolean open() {
//获取资源连接
System. out. println(" [OPEN]获取消息发送连接资源。");
return true ;
}
@Override
public void send() {
if (this.open()) {
System. out . println("[***发送消息***]" + this.msg);
}
}
public boolean close() throws Exception{
//获取资源连接
System. out. println(" [CLOSE]关闭消息发送通道。");
}
Runtime类
描述的运行时的状态,由于在最每一个JVM进程里面只允许提供有一个Runtime类的对象所以这个类的构造方法被私有化了,使用的单例设计模式,提供了一个static方法去调用构造方法
- 获取实例化对象: public static Runtime getRuntime();
- 通过这个类中的==availableProcessors()==方法可以获取本机的CPU内核数
在Runtime类中提供有四个重要方法 - 获取最大可用内存空间: public long maxMemory();默认的配置为本机系统内存的1/4;.
- 获取可用内存空间: public long totalMemory();默认的配置为本机系统内存的1/64;
- 获取空闲内存空间: public long freeMemory();。
- 手工进行GC处理: public void gc()
public class JavaAPIDemo {
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());
Thread.sleep(2000);
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());
}
面试题:请问什么是GC?如何处理?
GC (Garbage Collector) 垃圾收集器,是可以由系统自动调用的垃圾释放功能,或者使用Runtime类中的gc()手工调用
System类
该类除了定义的输出方法外,还有其它的方法:
- 数组拷贝: public static void arraycopy(Object src, int srcPos, Object dest,int destPos, int length)
- 获取当前的日期时间数值: public static long current TimeMillis( ); .
- 进行垃圾回收: public static void gc();其实是runtime里面的gc方法
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
long start = System. currentTimeMillis() ;
Runtime run = Runtime . getRuntime() ; //获取实例化对象
String str ="";
for(int x=0;x<30000;x++){
str += x ; //产生大量的垃圾空间
}
long end = System. currentTimeMillis() ;
System. out. println( "操作耗时:”+ (end - start));
}
}
Cleaner类
这是一个对象清理的操作,其主要的功能是进行finialize()方法的替代
finialize()方法在JDK1.9之前可以使用,在之后就不再建议使用
class Member {
public Member() {
System. out . println(" [构造]在-个雷电交加的日子里面,csdn诞生了。");
}
@Override
protected void finalize() throws Throwable {
System. out . println(" [回收]最终你定要死的。");
throw new Exception( "我还要再活500年...") ;
}
}
public class JavaAPIDemo {
public static void main(String[] args) throws Exceptiδn {
Member mem = new Member() ; // 诞生
mem = null ; //成为垃圾
System.gc();
}
在JDK1.9之后使用java. lang. ref.Cleaner 类进行回收处理( Cleaner类也支持有AutoCloseable处理)
class Member implements Runnable {
public Member() {
System. out. println(" [构造]在一一个雷电交加的日子里面,csdn诞生了。");
}
@Override
public void run() {
// 执行清除的时候执行的是此操作
System. out. println(" [回收]最终你定要死的。");
}
}
class MemberCleaning implements AutoCloseable {
//实现清除的处理
private static final Cleaner cleaner = Cleaner.create() ; //创建一个清除处理
private Member member ;
private Cleaner.Cleanable cleanable
public MemberCleaning() {
this. member = new Member() ; // 创建新对象
this.cleanable = this.cleaner.register(this, this.member);//注册使用的对象
}
@Override
public void close() throws Exception {
this. cleanable.clean(); //启动一个单独的线程去启动清除
}
}
public class JavaAPIDemo {
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接口,此接口并没有任何的方法提供,是因为它描述的是一 种能力。
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
Member memberA = new Member("csdn" ,30) ;
Member memberB = (Member) memberA.clone() ;
System.out.println(memberA) ;
System.out.println(memberB) ;
}
}
class Member implements Cloneable {
private String name ;
private int age ;
public Member(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(); // 调用父类中提供的clone()方法
}