常用类库
String
概述
String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
字符串是不变的,它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,所以可以共享它们。
Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。
String的两种赋值方式
在使用String的时候有两种赋值方式:
一种为通过字面值直接赋值,String text = “Hello”
另一种通过关键字new调用String的构造方法赋值:String str = new String(“hello”)
String的比较
案例1:
public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = new String("hello");
String str3 = str2;
System.out.println(str1==str2);//false
System.out.println(str1==str3);//false
System.out.println(str2==str3);//true
}
}
这些字符串的内容都是一样的,结果却是false,这是因为==符号比较的是地址,本来直接通过字面值直接赋值的话,的确是会共享一个地址,但是str2调用了String的构造方法创造了一个新的对象,所以导致两者的地址不同了。平常在进行字符串的比较时,使用的更多的还是equals
案例2:
public class Test {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "world";
String str3 = "helloworld";
System.out.println(str3=="hello"+"world");//true
System.out.println(str3==str1+str2);//false
}
}
两种相加方式看似相同,实则不同,前面的是先进行的字符串拼接,再进行的比较,“hello”+“world"相当于是先拼接成了"helloworld"再进行的比较,由于常量池中已经有了"helloworld”,所以共享了地址,于是就是true了;后面的str1+str2,由于是变量的相加,于是先开辟了新的空间,在进行的比较,所以就导致了地址的不同。
字符串常量池
1、方法区,又称永久代(Permanent Generation) ,常称为PermGen,位于非堆空间,又称非堆区(Non-Heapspace)。
方法区是被所有线程共享。
所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。
这些区域存储的是:静态变量+常量+类信息(构造方法/接口定义) +运行时常量池。
但是,实例变量存在堆内存中,和方法区无关。
以上,只是逻辑上的定义。在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也是就说,方式区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation) 就是方法区的实现。
2、堆(heap)
一个JVM实例只存在一个堆内存, 堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。
堆在逻辑上分为三部分(Perm) :
新生代(Young Generation, 常称为YoungGen)
老年代(o1d Generation, 常称为01dGen、Tenur ingGen)
永久代(Permanent Generation, 常称为PermGen)
2.1、新生区(New/Young Generation)
新生代(Young Generation) ,常称为YoungGen,位于堆空间;
新生区又分为Eden区和Survior (幸存区)。
Eden :新创建的对象
Survior 0、 1:经过垃圾回收,但是垃圾回收次数小于15次的对象
2.2、养老代(old Generation)
老年代(old Generation) ,常称为oldGen,位于堆空间;
old :垃圾回收次数超过15次,依然存活的对象
2.3、永久区(Permanent Generation)
永久代(Permanent Generation) ,常称为PermGen, 位于非堆空间。
永久区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM 才会释放此区域所占用的内存。
2.3.1、方法区的实现的演变:
Jdk1.7之前: hotspot虚拟机对方法区的实现为永久代;
Jdk1.8及之后: hotspot移除了永久代用元空间(Metaspace),
2.3.2、运行时常量池存和字符串常量池的变化
JDK1.7之前:
运行时常量池(包含字符串常量池)存放在方法区,此时hotspot虚拟机对方法区的实现为永久代。
JDK1.7 :
字符串常量池被从方法区拿到了堆中;
运行时常量池剩下的东西还在方法区,也就是hotspot中的永久代。
JDK1.8 :
hotspot移除了永久代,用元空间(Metaspace)取而代之。这时候,
字符串常量池还在堆,
运行时常量池还在方法区,只不过方法区的实现从永久代变成元空间(Metaspace)。
String类常用方法
方法 | 解释说明 |
---|---|
char charAt(int index) | 返回指定索引处的 char值 |
boolean equals(Object anObject) | 将此字符串与指定的对象进行比较 |
boolean equalsIgnoreCase(String anotherString) | 将此 String与另一个 String比较,忽略了大小写 |
int indexOf(String str) | 返回指定子字符串第一次出现的字符串中的索引 |
int lastIndexOf(String str) | 返回指定子字符串最后一次出现的字符串中的索引 |
int length() | 返回此字符串的长度 |
String replace(char oldChar, char newChar) | 返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar |
boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开头 |
boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结尾 |
String substring(int beginIndex) | 返回一个字符串,该字符串是此字符串的子字符串 |
String[] split(String regex) | 将此字符串拆分为给定 regular expression的匹配项 |
String toLowerCase() | 将此字符串与指定的对象进行比较 |
String toUpperCase() | 使用默认语言环境的规则将此 String所有字符转换为大写 |
String trim() | 返回一个字符串,其值为此字符串,删除了所有前导和尾随空格,其中space被定义为其代码点小于或等于 ‘U+0020’ (空格字符)的任何字符 |
static String valueOf(char c) | 返回 char参数的字符串表示形式 |
char[] toCharArray() | 将此字符串转换为新的字符数组 |
Objects工具类
概述
此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括null或null方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。
常用方法
方法 | 解释说明 |
---|---|
static boolean equals(Object a, Object b) | 返回 true如果参数相等,其他false |
static int hashCode(Object o) | 返回对象o的哈希码 |
static boolean isNull(Object obj) | 返回 true如果提供的参考是 null ,否则返回 false |
static boolean nonNull(Object obj) | 返回 true如果提供的参考是非 null否则返回 false |
static T requireNonNull(T obj) | 检查指定的对象引用是否不是 null |
static String toString(Object o) | 返回调用的结果 toString对于非 null参数, "null"为 null的说法 |
Math工具类
概述
类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数。
常用方法
方法 | 解释说明 |
---|---|
static double abs(double a) | 返回 double值的绝对值 |
static double ceil(double a) | 返回大于或等于参数且等于数学整数的最小值(最接近负无穷大) double |
static double floor(double a) | 返回小于或等于参数且等于数学整数的最大值(最接近正无穷大) double |
static double max(double a, double b) | 返回两个 double值中较大的 double |
static double min(double a, double b) | 返回两个 double值中较小的 double |
static double pow(double a, double b) | 返回第一个参数的值,该值是第二个参数的幂 |
static double random() | 返回带有正号的 double值,大于或等于 0.0且小于 1.0 |
static long round(double a) | 返回与参数最接近的 long ,并将关系四舍五入为正无穷大 |
static double random() | 返回第一个参数的值,该值是第二个参数的幂 |
static double random() | 返回第一个参数的值,该值是第二个参数的幂 |
Arrays工具类
概述
该类包含用于操作数组的各种方法(例如排序和搜索)。 此类还包含一个静态工厂,允许将数组视为列表。
如果指定的数组引用为null,则此类中的方法都抛出NullPointerException ,除非另有说明。
常用方法
方法 | 解释说明 |
---|---|
static int binarySearch(byte[] a, byte key) | 使用二进制搜索算法在指定的字节数组中搜索指定的值 |
static int compare(char[] a, char[] b) | 返char字典顺序比较两个 char阵列 |
static byte[] copyOf(byte[] original, int newLength) | 使用零复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度 |
static boolean equals(char[] a, char[] a2) | 如果两个指定的字符数组彼此 相等 ,则返回 true |
static void fill(char[] a, char val) | 将指定的char值分配给指定的chars数组的每个元素 |
static int mismatch(char[] a, char[] b) | 查找并返回两个 char数组之间第一个不匹配的索引,否则如果未找到不匹配则返回-1 |
static void sort(char[] a) | 将指定的数组按升序排序 |
static IntStream stream(int[] array) | 返回以指定数组作为源的顺序IntStream |
static String toString(char[] a) | 返回指定数组内容的字符串表示形式 |
Date工具类
概述
Date类表示特定的时刻,精度为毫秒。
常用方法
方法 | 解释说明 |
---|---|
boolean after(Date when) | 测试此日期是否在指定日期之后 |
boolean before(Date when) | 测试此日期是否在指定日期之前 |
Object clone() | 返回此对象的副本 |
int compareTo(Date anotherDate) | 比较两个日期 |
boolean equals(Object obj) | 比较两个相等的日期 |
long getTime() | 返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数 |
int hashCode() | 返回此对象的哈希码值 |
void setTime(long time) | 将此 Date对象设置为表示格林尼治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点 |
String toString() | 将此 Date对象转换为 String |
DateFormat工具类
概述
DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和分析日期或时间。 日期/时间格式化子类(例如SimpleDateFormat )允许格式化(即,日期→文本),解析(文本“日期”)和规范化。 日期表示为Date对象或自1970年1月1日00:00:00 GMT以来的毫秒数。
转换格式
常用方法
方法 | 解释说明 |
---|---|
String format(Date date) | 将Date格式化为日期时间字符串 |
Calendar getCalendar() | 获取与此日期/时间格式化程序关联的日历 |
Date parse(String source) | 从给定字符串的开头解析文本以生成日期 |
SimpleDateFormat(String pattern) | 构造一个 SimpleDateFormat使用给定的模式和默认的默认日期格式符号 FORMAT区域设置 |
Object clone() | 创建此 SimpleDateFormat的副本 |
boolean equals(Object obj) | 比较给定对象与此 SimpleDateFormat是否相等 |
int hashCode() | 返回此对象的哈希码值 |
Calendar工具类
概述
所述Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEAR , MONTH , DAY_OF_MONTH , HOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。
常用方法
方法 | 解释说明 |
---|---|
abstract void add(int field, int amount) | 根据日历的规则,将指定的时间量添加或减去给定的日历字段 |
int get(int field) | 返回给定日历字段的值 |
Date getTime() | 返回一个 Date对象,表示此 Calendar的时间值(距离 Epoch的毫秒偏移量) |
void set(int field, int value) | 将给定的日历字段设置为给定值 |
void setTime(Date date) | 使用给定的 Date设置此日历的时间 |
String toString() | 返回此日历的字符串表示形式 |
int hashCode() | 返回此对象的哈希码值 |
System工具类
概述
System类包含几个有用的类字段和方法。 它无法实例化。 System类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法
常用方法
方法 | 解释说明 |
---|---|
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) | 将指定源数组中的数组从指定位置开始复制到目标数组的指定位置 |
static long currentTimeMillis() | 以毫秒为单位返回当前时间 |
static void exit(int status) | 终止当前运行的Java虚拟机 |
static void gc() | 运行垃圾收集器 |