一、反射:
1、创建对象四种方式:
①直接new ②Object类的clone()返回复制对象 ③反序列化readObject() ④反射的newInstance()
2、反射创建对象:
Class cls = Class.forName(完全限定名)
①无参:Object o = cls.newInstance() 或者Constructor c = cls.getConstructor();Object o = c.newInstance()
②有参:Constructor c = cls.getConstructor(参数列表); Object o = c.newInstance()
③构造器组:Constructor c[] = cls.getConstructors(); 遍历数组
3、反射调用方法:
①公开的:Method m = cls.getMethod(方法名,参数类); m.invoke(o);
②私有的:Method m = cls.getDeclaredMethod(方法名,参数类); m.setAccessible(true); m.invoke(o);
③本类+父类非私有组:Method m[] = cls.getMethods();
④本类包括私有组:Method m[] = cls.getDeclaredMethods();
4、反射调用属性:
①公开的:Field f = cls.getField(属性名); 设置f.set(对象,值); 获取f.get(对象);
②私有的:Field f = cls.getDeclaredField(属性名); 权限f.setAccessible(true); 设置f.set(对象,值); 获取f.get(对象);
二、Collection集合
1、Collection和Collections区别:
Collection是集合类的顶级接口,提供了对集合对象操作的基本方法。直接继承接口有Set和List
Collections是包装类,是集合的工具类,提供集合的排序、搜索、线程安全等操作。无法实例化。
2、迭代器,for,增强for,forEach区别:
①Iterator语法:iterator()返回一个Iterator的实现类。只能遍历集合,不能增删。
②for语法:for(初始条件;循环条件;迭代因子){方法体},只能遍历数组,随意增删。
③增强for语法:for(元素类型 变量名:集合),语法糖,遍历集合底层是迭代器,遍历数组底层是for,不能增删。
④forEach():集合的方法,可使用lambda表达式遍历集合。多线程并发安全,可以增删。
3、集合数组互转:
①集合到数组:Collections.toArray()
②数组到集合:Arrays.asList(),通过集合转换而来的数组,对该集合元素操作就是对原数组的操作。
三、集合子接口之List链表
1、List的排序:
①实现Comparable接口,其中compareTo方法能满足需求的:调用Collections.sort()
②实现Comparable接口但不满足的:重载sort,传入临时比较规则
②没实现的:Comparator比较器接口,调用Collections.sort()匿名实现类,重写compare()定义规则
2、ArrayList底层容量:
JDK6直接创建容量10数组,JDK8创建空数组,第一次插入才分配10个对象空间,超过10个就*1.5
3、LinkedList搜索机制:
二分法。传入索引值与集合size()/2比较,大于则从最后一个找,小于则从第一个找
四、集合子接口之Queue
1、Queue:单向队列,先进先出FIFO,出poll入offer
2、Deque:双向队列,两端都可出入队,头First尾Last
3、Stack:栈结构,先进后出FILO,出pop入push
五、Map查找表:
1、遍历Map三种方式:
①遍历key:ketSet() 返回Set集合
②遍历键值对:entrySet(),返回Set集合
③遍历value:values(),返回Collection集合
2、HashMap容量:
初始化时没有指定容量,则返回一个空table数组。第一次put键值对,初始化长度为16;
达到加载因子0.75时,扩容为原来的二倍
3、HashMap存储:
底层是一个Entry数组。存放元素时,首先会根据key的hashCode值找到数据应该保存在table数组的下标位置。
如果数组位置上没有数据,则保存。如果有,则比较key的equals,如果true,则value值被覆盖。
如果false,则采用链地址法,把新的键值对对象保存到旧的键值对对象的next变量中,形成单向链表结构。
当数组长度>64链表长度>8,转换为红黑树。当树长度<6,转回链表。
4、HashMap查找:
查找数据时,首先会根据key的hashCode值找到对应下标,如果这个位置上什么都没有,返回null。
如果有键值对对象,且equals比较为true,直接返回value。
如果有单向链表,则用key比较链表上每个节点的value,直到相等返回vlue。
如果没有一个是相等,则返回null。
六、树结构:
1、红黑树要求:
①节点是红色或者黑色。
②根节点是黑色。
③所有叶子结点都是黑色。
④每个红色节点的两个子节点都是黑色。
④从根节点到任意叶子结点的所有路径上黑色节点数量相同。
2、红黑树三大基本操作:
左旋、右旋、着色
七、HashSet:
1、HashSet底层:
底层是HashMap,利用了key不能重复的特性,直接将要存储的元素作为key存储到了HashMap中。
八、注解:
1、三大注解:
①jdk注解:jdk提供的5个,比如@Override
②元注解:修饰注解的注解,常用来自定义注解,比如@Target指定位置,@Retention生命周期
③自定义注解
九、XML
1、解析方式:
①DOM:文档对象模型,官方推荐标准,无关语言平台。将xml的内容以树的形式一次性加载到内存,可随机访问修改。但效率低,内存成本高。
②SAX:简单应用程序接口,以事件为驱动,需要哪些数据解析哪些,效率快,但不会将内容加载到内存,不方便,增加程序负担。
③JDOM:java平台使用的,简单高效,但也要加载整个文档,对内存要求高。
④DOM4J:java的xml的API,类似于JDOM,性能优异、功能强大、简单易用,且开源。是目前最流行、最好用的XML解析工具,解析XML速度最快。