Java常用类归纳(Object、System、Properties、包装类和工具类等等)
Object类
Object
是类层次结构的根类。每个类都使用 Object
作为超类,所有对象(包括数组)都实现这个类的方法。了解Object的方法是很有必要的。
protected Object clone() //创建并返回此对象的一个副本,用于克隆对象。 boolean equals(Object obj) //判断当前对象与给定对象obj是否“相等”。 protected void finalize() //当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 Class<?> getClass() //返回此 Object 的运行时类。 int hashCode() //返回该对象的哈希码值。 String toString() //返回该对象的字符串表示。 void notify() //唤醒在此对象监视器上等待的单个线程。 void notifyAll() //唤醒在此对象监视器上等待的所有线程。 void wait() //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。 void wait(long timeout) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。 void wait(long timeout, int nanos) //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
先实现Cloneable接口,才能调用clone();finalize()可以主动提醒JVM来回收不用的对象,释放内存空间;getClass()是用于获取类实例,一般用于反射时使用;notify()、notifyAll()和wait()方法是在多线程进行通信时使用的,但Java提供了专门处理线程通信的类来代替这几个方法。其中使用最频繁的就属equals()、hashcode()和toString()方法,也是接下来要了解的重点。
toString()
返回对象信息。默认是类名(包含包目录)+@+转成16进制的哈希值。return getClass().getName() + "@" + Integer.toHexString(hashCode());
如果想要准确的描述某个对象,则应该对toString()进行重写。有的会问:为什么不单独写一个获取对象信息的方法呢?因为toString()用于获取对象信息是约定俗成的,是一种规范,大家都会用。如果要遍历不同对象的信息,总不能一个对象调用一次方法吧。借助多态特性,只需要一个通用方法,就能获取不同对象的信息。
public void printObjectInfo(Object o) { System.out.println(o.toString()); }
equals(Object obj)方法
equals方法描述的是一种等价关系,不仅仅是引用相等。Object的equals的默认实现是:return (this == obj); 仅仅只是判断引用是否相等。
有时候,只使用操作符==来判断两个对象是否相等是不够的。例如String判断两个字符串,只有内容相等,才算等价。假设有一个Person类,现在有两个Person对象的信息一致,但对象地址是唯一的,所以不会判断为同一对象,那这就不符合需求,这时就需要重写equals。因为身份号码唯一,所以只需要比较identityID就行。如下所示:
public class Person{private int identityID;//唯一标识,身份号码public int getIdentityID() { return identityID; } @Override public boolean equals(Object obj) { if(obj == null) return false; if(obj instanceof Person) { return identityID == ((Person)obj).getIdentityID(); } return false; } }
重写equals方法的要求
自反性:对于任何非空引用x,x.equals(x)应该返回true。 对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。 传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。 一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。 非空性:对于任意非空引用x,x.equals(null)应该返回false。
hashcode()方法
hashcode返回该对象的哈希值。哈希值
equals和hashcode是两个很重要的方法,两者密切相关
- equals返回true的两个实例,hashCode值必须一样
- hashCode值一样的两个实例,其equals方法返回不一定为true(可能有哈希碰撞等因素)
System类
System类来自于java.lang包,是一个核心类。该类被final继承,不可改变。Java将系统相关的重要方法和变量统一放在该类。主要提供标准输入输出和错误输出。对外部定义的属性和环境变量的访问。加载文件和库的方法。提供一些实用方法,例如复制数组。
标准输入输出和错误输出在Sytsem被作为静态常量对象,in、out和err。它们分别表示:标准输入流(从键盘输入)、标准输出流 (输出到控制台)和 标准错误输出流(字体为红色)。System类中的源码如下:
public final static InputStream in = null; //输入流 public final static PrintStream out = null;//打印输入流 public final static PrintStream err = null;
使用最频繁的打印输出代码:System.out.println()就是来源于此。还有从键盘获取输入的数据,就是通过System.in。读取键盘数据有两种方式,如下:
Scanner sc = new Scanner(System.in); BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
System对标准流进行重定向
标准流默认是键盘输入和输出到控制台,而重定向则是将别的流作为标准。可以从其他流中获取数据,也可以将数据输出到其他流中。方法如下:static void setIn(InputStream in) //设置输入流来源 static void setOut(PrintStream ps) //设置输出流 static void setErr(PrintStream ps)
//将磁盘的文本数据作为数据源,演示setIn的作用 System.setIn(new FileInputStream("D:/IOTEST/TestSystemClass.txt")); Scanner sc = new Scanner(System.in); //按行读取,直到读取完成 while(sc.hasNext()) System.out.println(sc.next()); // //运行结果: // 获取文本第一行。 // 获取文本第二行。
//演示setOut() System.setOut(new PrintStream("D:/IOTEST/TestSystemClass.txt")); //会覆盖原文件的内容,因为默认自动刷新。可以改成OutputStream作为参数,autoFlash = false //会将打印的内容输出至指定目录文件中,而不是在控制台显示 System.out.println("123456"); System.out.println("还可以吧");
Systeml类的常用方法(只提供一部分,要查询详细方法请看API)
static long currentTimeMillis() | 返回以毫秒为单位的当前时间。 |
static void exit(int status) | 终止当前正在运行的 Java 虚拟机。 |
static Properties getProperties() | 获取当前系统的所有属性。 |
static String getProperty(String key) | 获取指定键指示的系统属性。 |
static int identityHashCode(Object x) | 返回给定对象的原始哈希码Hashcode() |
static void load(String filename) | 从动态库的本地文件中以指定的文件名加载代码文件。 |
static void loadLibrary(String libname) | 加载由 libname 参数指定的系统库。 |
static void setProperties(Properties props) | 将系统属性设置为 Properties 参数。 |
static String setProperty(String key, String value) | 设置指定键指示的系统属性。 |
static void setSecurityManager(SecurityManager s) | 设置系统安全性。 |
static long nanoTime() | 返回最准确的可用系统计时器的当前值,以毫微秒为单位 |
static String getenv(String name) | 获取指定的环境变量值。 |
static void gc() | 运行垃圾回收器。 |
Properties prop = System.getProperties(); //获取所有系统属性 Set<String> ss = prop.stringPropertyNames();//将系统属性名称存储到集合中 Iterator it = ss.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //有很多属性,随便找一个测试一下。 路径分隔符 ; System.out.println(prop.getProperty("path.separator")); }
Properties类
Properties继承于Hashtable,该类
表示了一个持久的属性集。以键值对形式存储属性列表,key和value都是字符串。可以通过流对属性集实现读取和写入。只要文本文件以key=value的形式来作为属性列表,Properties即可进行读写。Properties也支持XML文档。
Properties方法 | 作用描述 |
---|---|
String getProperty(String key) |
使用指定键获取对应的属性。 |
String getProperty(String key, String defaultValue) | 使用指定键获取对应的属性,找不到就使用默认值。 |
void list(PrintStream out) |
将属性列表输出到指定的打印输出字节流中。 |
void list(PrintWriter out) | 将属性列表输出到指定的打印输出字符流中。 |
void load(InputStream inStream) | 从指定字节输入流中读取属性列表(键值对)。 |
void load(Reader reader) | 以行的格式从输入字符流中读取属性列表(键值对)。 |
void loadFromXML(InputStream in) | 将指定输入流中由 XML 文档所表示的所有属性加载到此属性表中。 |
Object setProperty(String key, String value) | 以键值对形式来设置属性。 |
Enumeration<?> propertyNames() | 返回属性列表中所有键的枚举。 |
Set<String> stringPropertyNames() | 返回此属性列表中的键集。 |
void store(OutputStream out, String comments) | 将该Properties的属性列表(键值对)写入输出流。 可加注释 |
void store(Writer writer, String comments) | 将Properties的属性列表(键值对)写入输出字符流。可加注释 |
void storeToXML(OutputStream os, String comment) | 输出一个包含所有属性的 XML 文档。 |
void storeToXML(OutputStream os, String comment, String encoding) | 使用指定编码输出一个包含所有属性的 XML 文档。 |
Properties使用总结归纳
- 通过流写入属性文件时,默认对文件内容进行覆盖。若要追加内容,修改输出流参数为:new FileOutputStream(file, true)。
- Properties是一个特殊的映射集合类,因为实现Map接口,可使用put()来创建属性。但因为允许放入不同类型key-value,容易出错,最好使用setProperty()。
- Properties继承于Hashtable,受哈希算法结构影响,Properties输出的属性列表是无序的。
- 输出属性列表有两种方法:list()和store(),store()方法的comments参数表示注释。在属性文件中也能加注释,#注释内容。
Properties prop = new Properties(); prop.setProperty("China", "中国"); prop.setProperty("US", "美国"); File file = new File("D:/IOTEST/properties.txt"); File fileXML = new File("D:/IOTEST/properties.xml"); //分别写入到文本和XML文档中 prop.store(new FileOutputStream(file), "text comment"); prop.storeToXML(new FileOutputStream(fileXML), "XML comment"); // 该方法无注释,功能较少。一般不采用 // prop.list();
因为编码的原因,这里显示的是Unicode编码。
读取属性文件,并遍历属性列表
/** 读取相关属性文件 */ public static Properties readPropsFile(File file) { Properties prop = new Properties(); try { prop.load(new FileInputStream(file)); } catch (IOException e) { e.printStackTrace(); } return prop; }
File file = new File("D:/IOTEST/properties.txt"); Properties prop = readPropsFile(file); //直接获取键值对 Set props = prop.entrySet(); Iterator it = props.iterator(); while(it.hasNext()) { System.out.println(it.next()); } //获取键集,然后通过迭代器来遍历 Iterator ite = prop.keySet().iterator(); while(ite.hasNext()) { String obj = (String)ite.next(); //是key System.out.println(obj + ":" + prop.getProperty(obj)); }
包装类
包装类的作用就是将基本类型转成对象。在JDK1.5之前,基本类型是无法直接添加进集合,需要自己去设计类,用对象来模拟基本类型,毫无疑问,这非常麻烦。所以JDK1.5版本后就提供了包装类,将基本类型作为对象来处理。
包装类就是基本类型名称首字母大写。但Integer和Character例外,它们显示全称。
构造器中使用字符串或者匹配该包装类对应的基本类型值来构建一个包装类。例如:new Byte((byte) 127) 、 new Integer(5)、new Double("12.5")、new Boolean(true)等等。
使用静态方法valueOf()来构建包装类。例如:Integer.valueOf() 、Double.valueOf()、Character.valueOf()等等。
若想要包装类转成基本类型,使用包装类中提供的xxxValue()方法。 xxx表示类型名。例如:
Integer i = new Integer(5); Double dou = new Double("12.5"); Boolean bool = new Boolean(true); i.intValue(); i.doubleValue(); dou.doubleValue(); bool.booleanValue();
如果想将某个字符串直接转成基本类型,可以使用包装类.parseXxx()系列方法, 无需构建包装类,通过静态方法直接转换。
除了常用的转换方法,包装类对相应的基本类型提供了很多操作方法。例如Integer提供了进制转换,Character对字符进行判断操作。这些方法大部分都是静态方法。要了解更多可查阅API自行测试。
自动装箱和拆箱机制
根据上下文环境,基本类型值可以使用包装类自动转换成对象。反之,包装类对象也会自动转成基本类型值。该机制简化了基本数据类型和相对应包装类对象的转化步骤。
自动装箱:基本类型自动转为包装类,相当于调用 valueOf()方法。自动拆箱:包装类自动转为基本类型,相当于调用 xxxValue()方法。
Integer i = 100; //自动装箱, 等价于 Integer i = new Integer(100) int b = i + 5; //自动拆箱为基本类型,方便运算。 省略i.intValue()
将包装类作为数组元素类型,也可以自动装箱拆箱。
//初始化的2 、 3会被自动装箱。等同于 new Integer(2)、new Integer(2) Integer[] inte = {new Integer(1), 2, 3}; int sum = 0; for(Integer i : inte) { sum += i; //自动拆箱为基本类型,用于值相加 }
整型包装类的缓存机制
整型包装类中都有一个静态内部类来提供缓存对象,字符和整型可互换,也有缓存机制。缓存机制的作用就是提前实例化相应范围数值的包装类对象,只要创建处于缓存范围的对象,就使用已实例好的对象。从而避免重复创建多个相同的包装类对象。提高了使用效率。
例如IntegerCache缓存Integer对象,缓存范围在[-128~127]。而Character类的缓存范围在[0~127]。只有Integer类可以改变缓存范围大小,其他的无法更改。
Integer i = new Integer(127); Integer i2 = new Integer(127); Integer i3 = 127; Integer i4 = 127; System.out.println(i == i2); //false System.out.println(i3 == i4);//true
因为i 和 i2 是以创建包装类对象来构建的,两个对象的引用地址自然不同,操作符==比较时,则为false。 i3 和 i4 相当于Integer.valueOf(),因为值处于缓存范围,所以自动装箱的对象都是同一个。两者比较则为true。
如果超出缓存范围,则会另外创建包装类对象,所以不相等。如下所示:
Integer i = 128; Integer i2 = 128; System.out.println(i == i2);//false
常用工具类
- Math:包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
- Arrays:包含用来操作数组(比如排序和搜索)的各种方法。不支持二维数组。
- Collections:包含用来操作集合(比如排序和搜索)的各种方法。
Math类
System.out.println(Math.PI);//得到圆周率 System.out.println(Math.E);//自然对底数 //2的5次方 System.out.println(Math.pow(2,5)); //使用左移运算 1<<5也可以得到2的5次方 //对16开平方根 System.out.println(Math.sqrt(16)); //求两值之间最大、最小 System.out.println(Math.max(5, 2)); System.out.println(Math.min(5, 2)); //三角函数 System.out.println(Math.sin(60));//三角正弦 System.out.println(Math.cos(60));//三角余弦 System.out.println(Math.tan(60));//三角正切
Arrays类
int[] arr = {72,52,54,63,42,65,46}; //默认升序排序。 比较对象需要实现Comparator<T>接口 Arrays.sort(arr); String arrStr = Arrays.toString(arr); //返回一个包含指定数组元素的字符串 //asList,把数组元素转成List对象。该方法不支持基本类型,记得使用包装类 List li = Arrays.asList(arr); //数组元素需要是对象 //二分查找法 查找指定元素 System.out.println("\n查询的值所在的index:" + Arrays.binarySearch(arr,46));
Arrays工具类只能对一维数组进行操作,二维及以上会报异常。该工具类的常用方法sort()和binarySerach()默认是按照升序,也可以在参数中自定义比较规则。若要实现降序输出,可以先排序然后反向遍历。或者转成集合,使用Collections的reserve()进行元素反转。
Collections类
Collections提供了很多处理集合类的方法。例如翻转集合元素,随机打乱集合元素,把线程不安全的集合类转成线程安全集合类等等方法。
作者:乘风起
来源链接:https://www.cnblogs.com/fwnboke/p/8529558.html