1.方法可变参数:
int ... data (JDK1.5以后提供,相当于数组的变相应用)
int sum(int ... data){}
sum(1,2,3);
sum(new int [] {1,2,3});
2.类在java中是一种引用数据类型;
String类的实现都是通过数组的形式进行保存的,因此对于String内部的数据一定是无法改变的;另外在jdk1.8以前,使用char数组来保存,而jdk1.9以后都使用byte数组来保存
String类的比较应该使用equalshttps://blog.csdn.net/barryhappy/article/details/6082823;
String.intern()可以将对象手动入池,但麻烦,因此直接赋值比构造方法更节省空间。
3.override(覆写)和overloading(重载)
区别 | overloading(重载) | override(覆写) |
---|---|---|
定义 | 方法名称相同,参数类型和个数不同 | 方法名称、参数类型及个数、返回值类型全部相同 |
权限 | 无权限要求 | 被子类覆写的方法不能拥有比父类更严格的访问控制权限 |
范围 | 发生在同一个类中 | 发生在继承关系类中 |
构造方法不能被继承,因此不能被覆写,但可以被重载;
父类方法定义private时,子类无法覆写该方法
3.this和super
(1)this表示先从本类查找所需要的属性或者方法,弱国本类不存在则查找父类定义,而super表示不查找子类,直接查找父类;
(2)this()调用的是本类构造,super调用的是父类构造,而且都必须放在构造方法的首行,所以不能同时出现;
(3)this可以表示当前对象;
4.volatile和synchronized的区别
(1)volatile主要使用于属性上,而synchronized应用于方法和代码块上;
(2)volatile无法描述同步的处理,只是一种直接内存的处理,避免了副本的操作,节约了复制变量副本和同步的时间,而synchronized是实现同步操作的关键字(同步的时候使用volatile的同时还是要使用synchronized)。
5.String和StringBuffer、StringBuilder
String类是字符串的首选类型,其最大特点是内容不允许修改,StringBuffer和StringBuilder类的内容允许修改
在开发中,大部分情况都优先考虑String类,只有在频繁修改字符串的操作上才会考虑使用StringBuffer和StringBuilder类。
(1)StringBuffer是线程安全的
StringBuffer是在jdk1.0版本中提供的,但是jdk1.5之后又提供了StringBuilder类,两个类的唯一区别在于:StringBuffer类中的方法使用了synchronized关键字定义,适合多线程并发访问时的同步操作,因此属于线程安全的方法;而StringBuilder类没有这样做,属于非线程安全的方法
(2)字符串静态常量池
String str="hello "+"java"+" world";
这句程序的本质操作实际上是由StringBuffer来完成的,其中所有的“+”操作都变成“append”
StringBuffer buf = new StringBuffer();
buf.append("hello ").append("java")+.append(" world");
(这些可以从java字节码中看出)
(3)StringBuilder类实现了一些Strin类没有的方法,比如插入数据insert、删除数据delete等,还有最具特点的方法字符串反转reverse
6.Runtime类
Runtime类用来描述运行状态的信息对象,每一个JVM进程都会提供唯一的一个Runtime类实例化对象,因此在Runtime类中默认将其构造方法封装(单例设计模式),然后使用getRuntime()方法(static方法)来获取实例化对象。
public static Runtime getRuntime()
常用的几个方法:
(1)获取本机的CPU处理器数量
public int availableProcessors()
(2)获取主机的内存信息
public long maxMemory() //最大可用内存(本机内存的1/4)
public long totalMemory() //可用内存(本机内存的1/64)
public long freeMemory() //空闲内存
(返回数据类型为long,一般在表示文件大小和日期时间上会使用long型)
另外,对于java的垃圾回收机制,系统的GC线程可以不定期自动处理,也可以使用Runtime类的gc()方法手动内存释放。
public void gc()
7.System类
(1)数据拷贝:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
(2)获取当前的日期时间数值:
public static long currentTimeMillis()
(3)垃圾回收:
public static void gc()
等价于调用Runtime.getRuntime().gc()
8.AutoCloseable接口
AutoCloseable接口的主要功能是结合异常处理结构在资源操作完成后实现自动释放功能
public interface AutoCloseable {
public void close() throws Exception;
}
//使用
interface IMessage implements AutoCloseable {
public void send();
}
class NetMessage implements IMessage{
...
public void close() throws Exception{...}
}
...
//main方法里面
try (IMessage nm = new NetMessage("...")){
...
} catch (Exception e){
e.printStackTrace();
}
在使用try语句的时候,其后面括号中的语句获取实例化对象,然后再执行完try语句之后自动调用close()方法
9.Cleaner类
传统的对象回收前处理操作依靠finalize()方法,而从JDK1.9开始提供了新的替代者:java.lang.ref.Cleaner类,并且基于AutoCloseable接口实现资源释放。而且是以清理线程的形式来操作的。
https://docs.oracle.com/en/java/javase/13/docs/api/java.base/java/lang/ref/Cleaner.html#method.summary
public class CleaningExample implements AutoCloseable {
// A cleaner, preferably one shared within a library
private static final Cleaner cleaner = <cleaner>;
static class State implements Runnable {
State(...) {
// initialize State needed for cleaning action
}
public void run() {
// cleanup action accessing State, executed at most once
}
}
private final State state;
private final Cleaner.Cleanable cleanable;
public CleaningExample() {
this.state = new State(...);
this.cleanable = cleaner.register(this, state);
}
public void close() {
cleanable.clean();
}
}
10.访问控制权限
范围 | private | default | protected | public |
---|---|---|---|---|
同一包的同一类 | 1 | 1 | 1 | 1 |
同一包的不同类 | 1 | 1 | 1 | |
不同包的子类 | 1 | 1 | ||
不同包的非子类 | 1 |
网友评论