【部分内容来自网络,侵删】
常用类
Object
object类是所有类的根类。
toString
返回方法的字符串形式
equals
判断两个对象是否相等
==
比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
equals
用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object
类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
String
字符串常量池:
- class文件常量池
在Class文件中除了有类的版本【高版本可以加载低版本】、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table)【此时没有加载进内存,也就是在文件中】,用于存放编译期生成的各种字面量和符号引用。
下面对字面量和符号引用进行说明
字面量
字面量类似与我们平常说的常量,主要包括:
(1)文本字符串:就是我们在代码中能够看到的字符串,例如String a = “aa”。其中”aa”就是字面量。
(2)被final修饰的变量。
符号引用
主要包括以下常量:
(1)类和接口和全限定名:例如对于String这个类,它的全限定名就是java/lang/String。
(2)字段的名称和描述符:所谓字段就是类或者接口中声明的变量,包括类级别变量(static)和实例级的变量。
方法的名称和描述符。所谓描述符就相当于方法的参数类型+返回值类型。 - 运行时常量池
我们知道类加载器会加载对应的Class文件,而上面的class文件中的常量池,会在类加载后进入方法区中的运行时常量池【此时存在在内存中】。并且需要的注意的是,运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的字符串在运行时常量池只会存在一份。
注意运行时常量池存在于方法区中。 - 字符串常量池
看名字我们就可以知道字符串常量池会用来存放字符串,也就是说常量池中的文本字符串会在类加载时进入字符串常量池。
那字符串常量池和运行时常量池是什么关系呢?上面我们说常量池中的字面量会在类加载后进入运行时常量池,其中字面量中有包括文本字符串,显然从这段文字我们可以知道字符串常量池存在于运行时常量池中。也就存在于方法区中。
不过在周志明那本深入java虚拟机中有说到,到了JDK1.7时,字符串常量池就被移出了方法区,转移到了堆里了。
那么我们可以推断,到了JDK1.7以及之后的版本中,运行时常量池并没有包含字符串常量池,运行时常量池存在于方法区中,而字符串常量池存在于堆中。
String str1 = new String("1");
解析:首先此行代码创建了两个对象,在执行前会在常量池中创建一个"1"的对象,然后执行该行代码时new一个"1"的对象存放在堆区中;然后str1指向堆区中的对象;
str1.intern();
解析:该行代码首先查看"1"字符串有没有存在在常量池中,此时存在则直接返回该常量,这里返回后没有引用接受他,【假如不存在的话在 jdk1.6中会在常量池中建立该常量,在jdk1.7以后会把堆中该对象的引用放在常量池中】
String str2 = "1";
解析:此时"1"已经存在在常量池中,str2指向常量池中的对象;
System.out.println(str1 == str2); //结果是 false or true?
解析:str1指向堆区的对象,str2指向常量池中的对象,两个引用指向的地址不同,输入false;
String str3 = new String("2") + new String("2");
解析:此行代码执行的底层执行过程是 首先使用StringBuffer的append方法将"2"和"2"拼接在一块,然后调用toString方法new出“22”;所以此时的“22”字符串是创建在堆区的;
str3.intern();
解析:此行代码执行时字符串常量池中没有"22",所以此时在jdk1.6中会在字符串常量池中创建"22",而在jdk1.7以后会把堆中该对象的引用放在常量池中;
String str4 = "22";
解析:此时的str4在jdk1.6中会指向方法区,而在jdk1,7中会指向堆区;
System.out.println(str3 == str4); //结果是 false or true?
解析:很明显了 jdk1.6中为false 在jdk1.7中为true;
String str1 = "aaa";
解析:str1指向方法区;
String str2 = "bbb";
解析: str2 指向方法区
String str3 = "aaabbb";
解析:str3指向方法区
String str4 = str1 + str2;
解析:此行代码上边已经说过原理。str4指向堆区
String str5 = "aaa" + "bbb";
解析:该行代码重点说明一下,jvm对其有优化处理,也就是在编译阶段就会将这两个字符串常量进行拼接,也就是"aaabbb";所以他是在方法区中的;’
System.out.println(str3 == str4); // false or true
解析:很明显 为false, 一个指向堆 一个指向方法区
System.out.println(str3 == str4.intern()); // true or false
解析:jdk1.6中str4.intern会把“aaabbb”放在方法区,1.7后在堆区,所以在1.6中会是true 但是在1.7中是false
System.out.println(str3 == str5);// true or false
解析:都指向字符串常量区,字符串长常量区在方法区,相同的字符串只存在一份,其实这个地方在扩展一下,因为方法区的字符串常量是共享的,在两个线程同时共享这个字符串时,如果一个线程改变他会是怎么样的呢,其实这种场景下是线程安全的,jvm会将改变后的字符串常量在
字符串常量池中重新创建一个处理,可以保证线程安全
String t1 = new String("2");
解析:创建了两个对象,t1指向堆区
String t2 = "2";
解析:t2指向字符串常量池
t1.intern();
解析:字符串常量池已经存在该字符串,直接返回;
System.out.println(t1 == t2); //false or true
解析:很明显 false
String t3 = new String("2") + new String("2");
解析:过程同问题1 t3指向堆区
String t4 = "22";
解析:t4 在1.6 和 1.7中指向不同
t3.intern();
解析: 字符串常量池中已经存在该字符串 直接返回
System.out.println(t3 == t4); //false or true
解析: 很明显为 false 指向不同的内存区
intern
intern函数的作用是将对应的符号常量进入特殊处理,在1.6以前 和 1.7以后有不同的处理;
先看1.6:
在1.6中,intern的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,则将该字符串常量加入到字符串常量区,也就是在字符串常量区建立该常量;
在1.7中:
在1.7中,intern的处理是 先判断字符串常量是否在字符串常量池中,如果存在直接返回该常量,如果没有找到,说明该字符串常量在堆中,则处理是把堆区该对象的引用加入到字符串常量池中,以后别人拿到的是该字符串常量的引用,实际存在堆中;
length
返回字符串中字符的个数
substring
返回字符串的子字符串
contains
判断字符串中是否包含另一个字符串
startsWith/endsWith
判断字符串是否以某字符串开头/结尾
indexOf/lastIndexOf
返回字符串第一次/最后一次出现在字符串中的索引
charAt
获取对应位置的字符
toCharArray
将字符串转化为一个字符数组
toUpperCase/toLowerCase
将字符串转化为对应的大写/小写
valueOf
将基本数据类型转化为字符串
StringBuffer
可变字符串序列,同时是线程安全的
append
追加字符串,注意返回的是一个StringBuffer对象
insert
在字符串中插入字符串,返回的仍是一个StringBuffer对象
delete
删除字符串的子字符串,返回的仍是一个StringBuffer对象
replace
对字符串进行替换,返回的仍是一个StringBuffer对象
reverese
对字符串做反转
StringBuilder
可变字符串序列,但是是线程不安全的
包装类
基本类型 | 包装类型 |
---|---|
byte | Byte |
int | Integer |
short | Short |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
parseXXX()
将字符串转化为基本数据类型
Date
描述日期的类
after
测试此日期是否在指定日期之后。
before
测试此日期是否在指定日期之前。
compareTo
比较两个日期的顺序。
getTime
返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
setTime
设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
toString
把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。
DateFormat
对日期进行格式化,这是一个抽象类,使用时一般使用SimpleDateFormat类。
getInstance
获取实例对象
format
将一个日期格式化为一个字符串
parse
从给定字符串的开始解析文本,以生成一个日期。
Calendar
getInstance
获取Calendar实例对象
get
获取字段值
set
设置字段值
常量 | 描述 |
---|---|
Calendar.YEAR | 年份 |
Calendar.MONTH | 月份 |
Calendar.DATE | 日期 |
Calendar.DAY_OF_MONTH | 日期,和上面的字段意义完全相同 |
Calendar.HOUR | 12小时制的小时 |
Calendar.HOUR_OF_DAY | 24小时制的小时 |
Calendar.MINUTE | 分钟 |
Calendar.SECOND | 秒 |
Calendar.DAY_OF_WEEK | 星期几 |
Arrays
用于操作数组的工具类
sort
对数组进行排序
toString
打印数组
equals
比较两个数组是否否相等
copyOf
对数组进行copy
binarySearch
对有序数组进行二分法查找
asList
将数组转化为list类型的对象
Math
数学计算的类库
abs
求取绝对值
ceil
向下取整
floor
向上取整
round
四舍五入
BigInteger
任意精度的整数的类
add
加法运算
subtract
减法运算
multiply
乘法运算
divide
除法运算
BigDecimal
任意精度的小数类型
add
加法运算
subtract
减法运算
multiply
乘法运算
divide
除法运算