集合
集合框架:
- collection
- map
collection:
- list
- set
- queue:在两端出入的list,所以也可以用数组或链表实现
map:
-
hashmap:键不可重复,值可重复;底层哈希表;线程不安全;允许key值为null,value也可以为null
-
hashtable:键不可重复,值可重复;底层哈希表;线程安全;key,value都不允许为null
-
treemap:键不可重复,值可重复;底层二叉树
list:
- arraylist:排列有序,可重复;底层使用数组;速度快,增删慢,getter()和setter()方法快;线程不安全
- vector:排列有序,可重复;底层使用数组;速度快,增删慢;线程安全,效率低
- linkedlist:排列有序,可重复;底层使用双向循环链表数据结构;查询速度慢,增删快,add()和remove()方法快;线程不安全
set:
- hashset:排列无序,不可重复;底层使用hash表实现;存取速度快;内部是hashmap(首先判断两个元素的哈希值,如果一样,用equals方法,为true,则为同一个元素)
- treeset:排列无序,不可重复;底层使用二叉树实现;排序存储;内部是treemap的sortedset
- linkedhashset:采用hash表存储,并用双向链表记录插入顺序
hashmap
数组+链表+红黑树
hashmap根据键的hashcode值存储数据,具有很快的访问速度,遍历顺序不去确定。非线程安全,如果满足线程安全,可以用collections的synchronizedmap方法使hashmap具有线程安全的能力,或者使用concurrenthashmap。
java7: hashmap是一个数组,每个元素使一个单向链表。Entry:key、value、hash值、用于单向链表的next
java8:java7查找时,根据hash值能够快速定位到数组的具体下标,然后顺着下标一个一个比较,时间复杂度为O(n).java8当链表的元素超过8个以上,会将链表转换为红黑树,在这些位置查找的时候可以降低时间复杂度为O(logN)
线程安全
ConcurrentHashMap是一个Segment数组,Segment通过继承ReentrantLock(api)来进行加锁,只要保证每个Segment是线程安全,也就实现了全局的线程安全
Java异常
异常分类:
throwable是java语言中所有错误或异常的超类,下一层为error和exception
error:java运行时系统的内部错误和资源耗尽错误。
exception:
运行时异常 RuntimeException:NullPointerException、ClassCastException;一个是 检查时异常 CheckedException, 如I/O导致的IOException、SQLException。
RuntimeException是那些可能在Java虚拟机正常运行期间抛出异常的超类,如果出现RuntimeException,是程序的问题。
检查异常是外部错误,发生在编译阶段,try catch,包括:
试图在文件尾部读取数据
打开一个错误格式的url
根据给定的字符串查找class对象,字符串表示的类不存在
异常的处理方式:
抛出异常: throw,throws,系统自动抛出异常
throw和throws的区别:
- throws在函数上,后面跟异常类可以跟多个
throw用在函数内,后面跟的是异常对象 - throws声明异常,让调用者知道该功能出现的问题,给出预先的处理方式,throw抛出具体的问题对象,执行到throw,功能就结束,将问题给调用者。
- throws表示异常出现的可能性,并不一定会发生。throw抛出异常
- 两者只是抛出异常,不会由函数取处理异常,真正处理异常的由函数的上层调用处理
Java反射
加载:class文件读入内存,创建一个Class类,建立一个Class对象。
反射: 一种动态调用方法或者属性的一种机制,获取字节码文件对象,剖析该类中存在哪些构造方法, 哪些成员变量, 哪些成员方法。
获取class文件对象的三种方式
- Object类的getClass()方法
Object obj = new Object();
Class aClass = obj.getClass();
- 静态属性class
Class objectClass = Object.class;
- Class类中静态方法forName()
Class studentClass = Class.forName(“org.westos.demo.Student”);
Class aClass3 = Class.forName(“java.lang.Object”);
创建对象的两种方式
1 class对象的newInstance()
2 调用constructor对象的newInstance()
Class c=Class.forName("rel=flection.Person");
Person p=(Person) c.newInstance();
Constructor cc-c.getDeclaredConstructor(String.class,String.class,int.class);
Person p1=(Person) cc.newInstance("lisi","nan",20);
内部类
静态内部类
- 可以访问外部类所有的静态变量和方法,即使private的也一样
- 其他类使用静态内部类需要使用"外部类.静态内部类"方式,如Out.Inner inner=new Out.Inner(); inner.print();
- HashMap内部就有一个静态内部类Entry
成员内部类
非静态类
局部内部类
在方法中使用
匿名内部类
继承父类或实现接口
多态
静态变量、静态方法、成员变量
编译运行看左边
成员方法
编译看左边运行看右边
Java复制
直接赋值复制
浅复制:复制对象
深复制:复制对象,复制引用对象