13、怎么理解反射,反射的应用
反射就是把Java类中的各种成分映射成相应的Java类。
一般情况下我们要解决某个问题,先找到相关的类,创建该类的对象,然后通过该对象调用对应的方法来解决问题。
反射是一个正好相反的过程,开始可能并没有类可以解决这个问题,而我们却先用一个当时可能并不存在的方法解决了这个问题,后来才有的这个类。
这其实就是框架的原理,现有的框架再有的解决问题的类。框架描述了整体,制订了功能方法的规范,具体的实现之后按照这个规范编写。这些都需要靠反射来完成。
使用框架有良好的扩展性,某部分功能的优化不需要涉及程序整体,只需要修改特定的部分就好了,然后通过配置文件,获取对应的类名,就可以了。
14、对匿名内部类的理解
匿名内部类其实是内部类的简写形式。
内部类是定义在类中的类,就好比我们人类,我们人类都有心脏,而心脏又有自己独特组成,可以把心脏也抽象成一个类。
这个心脏类就是人类的内部类。如果要研究某一种心脏疾病,需要一个实例时,我们不需要知道这个患病的心脏到底是谁的,那找到的这个就是匿名的。
匿名内部类必须要继承一个类或实现一个接口,在使用时直接父类或接口的名称创建了一个子类对象并实现其中的方法,匿名内部类其实是一个匿名的子类对象。
15、IO体系
字节流InputStream/OutputStream
|--FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作
|--BufferedInputStream/BufferedOutputStream:加缓冲区的字节流,用于提高效率
字符流Reader/Writer
|--FileReader/FileWriter:文件字符流,用于文本文件的读写操作
|--BufferedReader/BufferedWrite:加缓冲区的字符流,用于提高效率
转换流InputStreamReader/OutputStreamWriter:是字节流和字符流之间的桥梁
配置文件Properties
16、集合体系
|--Collection
|--List:元素是有序的,元素允许重复,因为该集合体系都具有索引
|--ArrayList:底层数据结构是数组,查询速度快,增删操作较慢,线程不同步
|--LinkedList:底层数据结构是链表,查询效率较低,增删操作快,线程不同步
|--Vector:功能同ArrayList类似,底层也是数组,不同是线程是同步的,效率较低
|--Set:元素是无序的,元素不允许重复,底层用到了Map
|--HashSet:底层hash表,存储的对象最好复写hashCode和equals方法,保证元素不会重复
|--TreeSet:底层二叉树,存储的对象具备比较性,有两种方法
|--Map:数据是以键值对的形式存储的,有的元素存在映射关系就可以使用该集合,元素不允许重复
|--HashMap:允许有null键或值,线程不同步
|--TreeMap
|--HashTable:类似HashMap,不允许有null键或值,线程同步
17、线程的创建方式,进程线程的理解
两种:继承Thread或实现Runnable
进程是一个执行中的程序,每一个程序都至少有一个执行顺序,该顺序是一个路径,或者叫一个控制单元。
线程是进程中的一个独立的控制单元,线程在控制着进程的执行。
18、局部变量和成员变量区别
成员变量:作用于整个类中,随对象存储在堆内存中,生命周期跟对象一样
局部变量:作用于方法或语句中,方法或语句结束则生命周期结束,存放在栈内存中。
19、同步函数与同步代码块的区别
它们的作用都是封装多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可参与进来。
同步代码块:位置比较灵活,封装了操作共享数据的语句,多个线程中只有持有锁的才可以操作共享数据,需要指定一个对象作为锁
同步方法:声明方法时加synchronized关键字修饰,同步函数使用的锁是this,持有锁的线程调用这个方法时其他线程无法调用。
20、数组和集合的区别
数组可以存储基本数据类型和对象,它是一个线性的序列,可以快速的访问其中的元素。数组创建之后,容量就固定了,而且在其生命周期里是不能改变的
集合只用于存储对象,集合的长度是可变的,集合可以存储不同类型的对象。集合的长度并不是固定的,可以便捷的添加删除。能够更加便捷的操作元素,功能更加强大
21、StringBuffer和StringBuilder的区别
StringBuffer是线程安全的,StringBuilder是线程不安全的,所以效率比起来StringBuilder要比StringBuffer快。
一般单线程的程序使用StringBuilder比较好,多线程的情况下可以自己加锁,也可以直接使用StringBuffer
22、String和StringBuffer区别
String对象一经创建就不会发生变化了,即便是赋新值也不是在原对象的基础上改变,而是创建一个新的字符串对象,将引用指向这个新的对象,会造成空间的浪费,效率较低
StringBuffer只创建一个对象,是在同一个实例的基础之上追加,效率更高,当需要
|
|