1.Object类
Java的根类,任何一个类都是该类的直接或间接子类
常用方法:
Object()无参方式构造对象
boolean equals(Object obj):判断调用对象与参数对象是否相同,默认比较方式是比较两个对象的地址是否相同,若想要比较两个对象的其他内容可以重写该方法。
int hashCode(): 用于获取调用对象的哈希码值,若两个对象调用equals方法相同则两个对象调用该方法的结果也得相同,可通过重写该方法自定义哈希码值满足要求
String toString():用于获取调用该对象的字符串形式 默认形式为(包名.类名@哈希码值十六进制)可重写该方法自定义返回字符串形式
Class<?>getClass():返回调用该对象时执行的Class实例(调用对象的对应类型)用于反射机制
2.包装类
将基本数据类型封装处理成对象从而将基本数据变量转化为成员变量进行对象化处理叫做包装类。
2.1Integer类
常用方法:
intValue():获取调用对象的整数值
static valueOf():将整数值转化为Integer对象
equals:判断两个integer对象是否相等
toString():返回调用对象整数值的字符串形式
static parseInt:将字符串转化为 int类型
2.2装箱和拆箱以及自动装箱池
Java5之前对包装类对象进行运算时需要频繁地将对象和基本数据之间进行转换,运算,转回对象。
Integer类内部提供了自动装箱池技术,将-128-127数字无需装箱可以直接使用
Integer i= 5;
int x = i;
2.3Double类
与Integer类似但无自动装箱池技术
常用方法与Integer类似
isNaN()是否为非数字
2.4Boolean类
支持自动装箱技术
常用方法与类似
2.5Character类
支持自动装箱技术
除了常用方法外还包括判断是否为大小写字符和数字字符已经转化为大小写字符等方法
isUpperCase()
isLowerCase()
isDigit()
toUpperCase()
toLowerCase()
2.6包装类总结
基本数据类型和包装类型的转化:自动装箱池技术以及常用方法(intValue和valueOf方法)
基本数据类型和字符串类型的转化:各个包装类的静态方法(parseInt,parseBoolean等)
3.数学处理类
3.1Math类
执行数学运算
静态方法:max,min,pow(a,b),abs(a),round(a),sqrt(a),random(a):0.0-1.0随机数
3.2BigDecimal类
浮点数类型的精确运算
BigDecimal():构造为对象以便于进行后续运算
add(),substract(),multiply(),divide()
3.3BigInteger类
用于运算比long类型还大的整数
BigInteger():将其构造为对象以便于后续运算
add(),substract(),multiply(),divide()
remainder():取余
divideAndRemainder():商和取余
4.String字符串类型
用于描述字符串的类,该类可以将任何字符串用对象进行描述
特点:
<1 该类被final修饰表示无法被继承(该类继承自Object类)
<2 jdk1.9之前string类底层由char[]数组储存,之后用byte[]数组储存,节约空间
<3 由于该类描述的字符串由final修饰,不可更改,是个常量,由此可以被共享
private final byte[] value;
4.1常量池概念(原理)
由于String类型对象是常量,不可被修改,JVM将首次出现的字符串放入常量池中,当需要创建的字符串对象在常量池中存在,则直接拿出来,无需申请内存再次创建对象。
String i1 = "hello";
String i2 = "hello";
String i3 = new String("hello");
String i4 = new String("hello");
i1==i2 因为i1和i2都是从常量池中拿出来的所以地址相同
i3!=i4 i3!=i1 i3和i4都是从堆区申请空间,地址不同,两个不同的对象
常量优化机制:
String i1 = "hello";
String i2 = "he"+"llo";
i1 ==i2 因为i2是先拼接再存入的常量池,所以i2的“hello”在常量池中已经存在
4.2构造方法
string()无参构造
string(byte[] value, start,length/byte[] value);
string(char[] value, start length/char[] value);
string(string s);
4.3常用方法
返回字符串本身
toString();返回字符串本身
getBytes();返回数组
toCharArray();
字符串比较:
compareTo(String s)
compareToIgnoreCase(String s)比较字符串但忽略大小写
length():返回字符串的长度
isEmpty():判断字符串是否为空
charAt(int index):返回字符串对应位置的字符
indexOf(int ch):返回字符串第一次出现ch的下标
indexOf(int ch, int from)返回字符串从from位置开始第一次出现ch的下标
indexOf(String i) 返回字符串第一次出现 i的下标
indexOf(String i,int from) 返回字符串从from位置开始第一次出现ch的下标
lastIndexOf()同理,如果找不到就返回-1
子字符串方法:
substring(int start,int end)
substring(int start)
重写方法
equals()
hashcode()
equalsIgnoreCase()
其他方法:
concat(string i)字符串的拼接
contains(string s)是否包含s
trim()去掉字符串前后的空白
toUpperCase()返回字符串大小写形式
toLowerCase()
startsWith(string i/string i, int start)判断字符串是否已 i 开头或者从指定位置开始是否以 i 开头
endWith()同理
5.可变长字符串
因为String类字符串被final修饰是个常量不可修改,造成大量的空间浪费,采用StringBuffer(线程安全类,效率低)和StringBuilder(非线程安全类,效率高)来描述可变化的字符串
扩容机制:
当字符串内容超过了字符串对象的容量时,会采用自动扩容机制:移位运算符(》右移 《 左移),右移容量/2 左移*2
扩容算法:原始容量*2+2
5.1构造方法
StringBuilder() 无参构造 默认容量为16
StringBuilder(int capacity) 指定容量
StringBuilder(String i)指定字符串 容量为16+字符串长度
5.2成员方法
capacity()返回对象容量
length()返回字符串长度
insert(int start, string i)由指定位置插入字符串并返回字符串本身
append(string i)末尾位置追加字符串i并返回字符串本身
deleteCharAt(int index)删除字符串下标位置的字符并返回字符串本身
delete(int start int end)删除字符串并返回字符串本身
replace(int start,int end, String i)替换字符串并返回字符串本身
reverse()翻转字符串并返回字符串本身
重点:作为参数传递的String 其值不会发生改变,改变的是Stringbuilder创建的字符串
且由于很多方法返回值都是StringBuilder所以可以方法的基础上连续调用
StringBuilder转化为字符串 sb.toString()
6.集合类库
集合的由来:存储多个类型不同的对象的数据
单个数据类型:变量
多个类型相同的数据:数组
多个类型不同的数据:对象
多个类型相同的对象数据:对象数组
集合的框架结构:Collection集合(单个元素为存储单位) 和map集合(单对元素为存储单位)
6.1Collection集合
子接口:List接口,Queue接口,Set接口
常用方法:
add():增加参数整体
addall():增加参数内的所有内容
remove():删除集合元素
removeAll():删除参数指定集合的所有对象
contains():判断是否包含指定对象
containsAll():判断是否包含参数指定的所有对象
retainAll():保留参数集合中的所有对象
clear():清空集合
size():集合的长度
isEmpty():判断集合是否为空
equals():判断集合是否相同
hashcode():返回集合的哈希码值
iterator():获得集合的迭代器
6.2iterator接口
用于遍历集合内的元素
常用方法:
hasNext()判断集合是否还有可迭代的元素
next():取出一个元素并指向下一个元素
remove():删除访问到的最后一个元素(迭代过程中不允许修改集合所以用该方法)
假设有一个集合 c1需要遍历
Iterator i1 = c1.iterator();
while(i1.hasNext()){
iterator.next();
}
6.3foreach循环
迭代器的简化版 用于遍历数组或集合
for(元素类型 变量名(自定义):数组/集合名){
}
原理:不断从数组或者集合中取出一个元素赋值给变量知道取完所有元素为止
6.4List集合
允许有重复元素且存在先后次序
实现类:ArrayList,LinkedList,Stack,Vector类
ArrayList:使用动态数组进行管理,支持下标访问,增删元素不方便,查找元素方便(支持自动扩容动态调整内存大小,每次扩容是原始长度的1.5倍)因为存在下标所以访问元素方便,删除元素不方便是因为还需要挪动其他元素
LinkedList:使用双向链表进行管理,访问不方便,增删元素方便(无下标,内存空间不连续)
Stack:使用动态数组进行管理,主要用于描述栈(先入后出)
入栈:push 出栈:pop
Vector:动态数组,属于线程安全类效率低
常用方法:
除了Collection常用方法外还包含
get()获取制定下标的元素
indexOf():获取指定参数元素的下标
lastIndexOf():获取指定参数元素最后一次出现的下标
set(int index, E element):修改指定下标的元素
subList(int start,int end) 获取子list
6.5Queue集合
用于描述队列,实现方式是LinkedList类在增删方面有优势
offer():入队列
peek():返回队首元素
poll():返回并删除队首元素
6.6Set集合
无先后次序且不允许重复
实现类:hashset类(hash表进行数据管理) treeset类(红黑树进行数据管理) linkedhashset类(双向链表)
常用方法:Collection方法
hashset添加元素的原理
:元素调用hashcode方法获得对应的哈希码值,根据哈希算法计算该元素对应的索引位置,若该索引位置无元素则直接放入,若有元素则比较二者的哈希码值,若哈希码值不同则将该元素放入后面,若哈希值也相同则再调用equals方法进行比较,若相同则添加失败,不相同放后面
重写equals方法后为何要重写hashcode方法:equals方面用于判断两个元素是否相同,重写hashcode后可保证两个元素的哈希码值相同,经由哈希算法的索引位置也相同,只需要与该索引位置已有元素进行比较可提高效率并避免重复元素出现。
Treeset:每当有新元素插入treeset需要比较该元素与其他元素,从而确定新元素的位置。
比较规则:自然排序,比较器排序(优于自然排序)
比较器排序:
匿名内部类方法:接口/父类类型 变量名 = new 接口/父类类型(){方法的重写}
Comparator<Student> c1 = new Comparator<Student>(){
@Overide
public int compare(Student o1(新加的元素), Student o2){
return o1.getAge() - o2.getAge();
}
}
Set<Student> s2 = new TreeSet<>(c1);将比较器放入集合中 可实现比较器比较
当向集合中加入新元素时可自动调用比较方法
自然排序:对应的元素类实现Comparable<该元素类型>接口
并在该类中重写 compareTo方法
@Overide
public int compareTo(Student o1(新加的元素)){
return o1.getAge();
}
6.7Map集合
map集合存储元素的基本单位是单对元素:键值对,key不允许重复
主要实现类:HashMap(哈希表)和TreeMap(红黑树)
常用方法;
put(key,value)将键值对放入集合中,若已存在则替换
get(key)返回key所对应的value
containsKey(key):判断集合是否包含指定key
containsValue(value):判断集合是否包含指定value
remove(key):删除指定的key
keySet: 返回此映射中包含的key
values() 返回此映射中包含的key
entrySet() 返回次映射中包含的key-value
Hashmap添加元素的原理
:元素的key调用hashcode方法获得对应的哈希码值,根据哈希算法计算该元素对应的索引位置,若该索引位置无元素则直接放入,若有元素则比较二者key的哈希码值,若哈希码值不同则将该元素放入后面,若哈希值也相同则再调用equals方法进行比较,若相同则修改value值,不相同放后面
7.泛型
概念:
我们可以向集合中存入各种类型的对象,这是因为我们在存入集合对象时,将其识别为Object类型的对象,当我们取出该对象时,也需要将其强转来获得元素的实际类型,这就有可能触发强转类型异常,所以我们引入了泛型的概念。
集合<数据类型>指定集合存入的数据类型只能是该数据类型,泛型只在编译器有效。
原理:
泛型的本质是参数化,也就是泛型指定的数据类型作为参数传递,其中泛型E作为形式参数负责占位,而我们实际使用集合时,指定的数据类型为实际参数负责给形式参数初始化。
泛型的应用范围:
泛型类:
后面加入了类型参数列表<E,T....等> 实例化时,数据类型必须是引用数据类型(类)不能是基本数据类型,当父类有泛型是,子类可以保留或者不保留或者保留的基础上添加新的泛型
public class Subperson<T1,T> extends Person<T>{};
泛型方法:
调用泛型方法是需要对泛型参数进行实例化
泛型接口:
接口后面加入了类型参数列表<E,T....等>
泛型在继承上的体现:
List<String>并不是List<Object>的子类,两者之间不存在赋值,这是因为集合中支持的类型不同
Java7新特性:菱形特性:List<String> lt1 = new LinkedList<>();可省略
通配符:
我们希望传入的泛型类型在一个指定的范围内而不是一个具体的类型
<?>无限制通配符:
我们可以传入任意类型的参数,当泛型方法存在泛型为无限制通配符时,我们可以传入任意类型的集合作为参数或者集合中存在泛型为无限制通配符时,我们可以将拥有任意类型集合赋值给改集合。你只能够对集合进行读操作。并且你只能把读取到的元素当成 Object 实例来对待
不能进行写操作,add,因为我们不知道?代表的具体是那个数据类型,所以编译可能会报错
<? extend E>上届通配符:
只能是E的子类,代表的是一个可以持有 A及其子类(如B和C)的实例的List集合。你只能够对集合进行读操作。并且你只能把读取到的元素当成 Object 实例来对待,此时从集合里读出元素并把它强制转换为A是安全的。
不能进行写操作,add,因为我们不知道E的子类到底有哪些,代表的具体是那个数据类型,所以编译可能会报错
<? super E>下届通配符:
只能是E的父类:此时往list集合里面插入A及其子类(B或C)是安全的,如果A有一个父类,那么这个父类同时也是B和C的父类。但是这个是不可以从list集合里读取东西的,除非你把读到的东西转换为Object。