Object类
Object 类是所有类、数组、枚举类的父类,也就是说,Java允许把热呵呵类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类。
因为所有的Java类都是Object类的子类,所以任何Java对象都可以调用Object类的方法。Object提供了如下几个常用方法。
- boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是,两个对象是同一个对象,因此该equals()方法通常没有太大的实用价值。(一般通过方法重写来实现具体的判等)
- protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
- Class<?>getClass(): 返回该对象的运行时类。
- int hashCode(): 返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址计算。但很多类都重写了该方法,不再根据地址来计算。
- String toString():以字符串形式打印该对象,大部分情况下需要改写。默认情况下返回“运行时类名@该对象的16进制地址”。
Java 9改进的String、StringBuffer和StringBuilder类
字符串就是一连串的字符序列,Java 提供了String StringBuffer StringBuilder 三个类来封装字符串,并提供了一系列方法来操作字符串对象。
Java 9 改进了字符串(包括String StringBuffer StringBuilder)的实现。在Java 9 以前字符串采用char[]数组来保存字符,因此字符串的每个字符占2字节;而Java 9 及更新版本的JDK的字符串采用byte[]数组再加一个encoding-flag字段来保存字符,因此字符串的每个字符只占1字节。
- String类是不可变类(以final修饰),即一旦一个String类对象被创建后,其字符序列则不可改变,直到这个对象被销毁。
- StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer对象被创建时,通过StringBuffer提供的的append(),inser(),reverse(),serCharAt(),setLength()等方法可以改变这个字符串序对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用他的toString()方法将其转换为一个String对象。
- StringBuilder类时JDK1.5新增的类,它也代表可变字符串对象。实际上,StringBuffer和StringBuilder功能基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以功能略高。因此通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类。
String提供的大量构造器。
- String(): 创建一个包含0个字符串序列的String对象(并不是返回null)。
- String(byte[] bytes,Charset charset):使用指定的字符集将指定的byte[]数组解码成一个新的String对象。
- String(byte[] bytes,int offset,int length):使用平台默认的字符集将指定的byte[]数组从offset开始,长度为length的子数组解码成一个新的String对象。
- String(byte[] bytes,int offset,int length,String charsetName):使用指定的字符集将指定的byte[]数组从offset开始,长度为length的子数组解码成一个新的String对象。
- String(char[] value,int offset,int count):将指定的字符数组从offset开始、长度为count的字符元素连缀成字符串。
- String(String original):根据字符串直接量来创建一个String 对象。也就是说,新创建的String对象是该参数字符串的副本。
- String(StringBuffer buffer):根据StringBuffer来创建对应的String对象。
- String(StringBuilder builder):根据StringBuilder来创建对应的String对象。
String的常用方法(用来操作字符串对象)
- char charAt(int index): 获取字符串中指定位置的字符串。其中,参数index 指的是字符串的序数,字符串的序数从0开始到length()-1。
- int compareTo(String anotherString):比较两个字符串的大小。如果两个字符串的字符序列相等,则返回0;不相等时,从字符串第0个元素开始比较,返回第一个不相等的字符差。另一种情况,较长字符差的前面部分恰巧时较短字符串,则返回它们的长度差。
- String concat(String str):将该对象与str连接在一起。与Java提供的字符串连接符“+”的功能相同。
- boolean contentEquals(StringBuffer sb):将该对象与StringBuffer的对象进行内容比较,相同时返回true。
- boolean endsWith(String suffix):返回该对象是否以suffix 结尾。
- …………不想抄了,见API文档吧。
Math类
- 关于三角运算的
- 三角函数:sin、cos、tan
- 反三角函数:asin、acos、atan
- 双曲函数:sinh、cosh、tanh
- 返回从直角坐标(x,y)转换为极坐标(r,theta)的角度atan2(0.1,0.2)
- 关于取整运算的
- floor向下取整
- ceil向上取整
- round四舍五入
- 乘方、开方、指数运算
- sqrt:开方根
- cbqt:立方根
- pow:乘方
- 自然对数log
- 底数为10的对数log10
- 最大值max
- 最小值min
- 返回一个伪随机数random:在0到1之间
ThreadLocalRandom与Random
Random类专门用于生成一个伪随机数,他有两个构造器:一个构造器使用默认的种子(以当前时间为种子),另一个构造器需要程序员显式的传入一个long型整数的种子。
ThreadLocalRandom是Random的增强版。在并发访问的环境下,ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终确保系统具有更好的线程安全性。
package Random;
import java.util.Arrays;
import java.util.Random;
public class RandomText {
public static void main(String[] args) {
var rd = new Random();
System.out.println("rand.nextBoolean():"+rd.nextBoolean());
//生成处于byte范围内的随机数数组
var buffer = new byte[16];
rd.nextBytes(buffer);
System.out.println(Arrays.toString(buffer));
//生成0~1.0之间的随机数(double或者是float都行)
System.out.println(rd.nextDouble());
//生成一个处于int整数范围的为随机数
System.out.println(rd.nextInt());
//生成一个0~26之间的伪随机数
System.out.println(rd.nextInt(26));
}
}
ThreadLocalRandom的一种用法
package Random;
import java.util.concurrent.ThreadLocalRandom;
public class RandomText2 {
public static void main(String[] args) {
ThreadLocalRandom rd = ThreadLocalRandom.current();
int x = 20;
while (x > 0) {
System.out.println(rd.nextInt(2, 5));
x--;
}
}
}
BigDecimal类
Java的double类型会发生精度丢失,尤其在进行算术运算时更容易发生这种情况。不仅是Java,很多编程语言也存在这样的问题。
为了能精确表示、计算浮点数,Java提供了BigDecimal类,该类提供了大量的构造器用于创建BigDecimal对象,包括把所有的基本数值类型变量转换为一个BigDecimal对象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。
查看BigDecimal类的BigDecimal(double val)时可以看到不推荐使用该构造器,主要时因为使用该构造器时有一定的不可预知性。当程序使用new BigDecimal(0.1)时,他的值并不是0.1,而是一个极近似0.1的值。写入new BigDecimal(“0.1”);将创建一个真正值为0.1的BigDecimal对象。因此通常建议优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal。valueOf(double value)静态方法来创建BigDecimal对象。
BigDecimal类提供了add() subtract() multiply() divide() pow()等方法来进行浮点数计算。
package BigDecimal;
import java.math.BigDecimal;
import java.util.Scanner;
public class BigDecimalText {
public static void main(String[] args) {
var sc = new Scanner(System.in);
var f1 = new BigDecimal(0.1);
var f2 = new BigDecimal("0.1");
System.out.println(f1+"\n"+f2);
String a;
String b;
a=sc.next();
b= sc.next();
var av = new BigDecimal(a);
var bv = new BigDecimal(b);
System.out.println(a+"+"+b+"="+av.add(bv));
System.out.println(a+"-"+b+"="+av.subtract(bv));
System.out.println(a+"*"+b+"="+av.multiply(bv));
System.out.println(a+"/"+b+"="+av.divide(bv));
System.out.println(a+"^"+b+"="+av.pow(23));
}
}