java面试必备

来源:互联网 发布:为什么淘宝会有音乐 编辑:程序博客网 时间:2024/06/17 05:46

技术面试:
1谈谈集合框架;
集合框架分为两大派系
|–单列集合 Coloection 接口
|–List 接口 有序的,可重复,可根据角标操作元素
|–ArrayList 底层数据结构是数组,查询速度快,增删稍慢,线程不同步的,
|–LinkedList 底层数据结构是链表,增删速度快,查询稍慢,线程不同步的
|–Vector 底层数据结构是数组,增删查都稍慢,线程同步的,jdk1.0出现的,那时候还没有集合框架,后来被ArrayList取代
|–Set 接口 无序的,不可重复,因为底层是一个Map集合,只使用了Map的key,要保证键的唯一性
|–HashSet 底层数据结构是哈希表,线程不同步的,无序,高效,必须保证元素的唯一性,是通过调用hashCode和equals方法来判断元素是否相同的
|–TreeSet 底层数据结构是二叉树,线程不同步的,特点就是可以对集合中的元素进行排序,前提是要指定排序规则,有两种方式
1,让元素自身具备比较性,如果元素自身不具备比较性,可以让元素实现Comparable接口,并覆盖compareTo方法来指定比较规则
2,如果元素具备的比较性并不是我们所需要的,可以自己定义一个比较器,实现Comparator接口,并覆盖compare方法来指定比较规则,通过构造函数传递给集合即可
|–要迭代以上集合都是通过迭代器来完成的,通过调用iterator方法来返回一个迭代器Iterator(接口);通过这个迭代器来迭代元素
|–双列集合 Map
|–Hashtable 底层是哈希表结构,线程同步的,不可以存储null键null值,jdk1.0出现,后来被HashMap所替代,
|–HashMap 底层的数据结构是哈希表,线程不同步的,可以存储null键null值,
|–TreeMap 底层是二叉树数据结构,线程不同步,特点是可以对键进行排序,排序方式同TreeSet相同,
|– Map 集合和Collection的不同点是,Map集合一次是存一对元素,键值对形式(键和值存在着标射关系),而Collection一次只存一个元素
|– Map 集合自身并没有迭代方法,但是可以通过keySet和entrySet方法来将Map集合转换成Set集合在进行迭代,
keySet返回的是集合中所有的键,在通过Map集合中的get(key)来获取对应的值,而entrySet方法返回的是Map.Entry这种数据类型,里面保存的是所有键值对的映射关系
2,如何实现多线程,如何开启多线程;
|– 开启多线程有两种方式:
|– 继承Thread,由子类来复写run方法,通过start方法来开启线程
|– 实现Runnable接口,有子类覆盖run方法,通过start方法来启动线程
|– 一般最常用的就是实现Runnable接口,好处就是更加面向对象,将线程要执行的操作也封装成一个对象,这更符合面相对象的设计思想
|– 在jdk1.5的时候引入了java.util.concurrent线程并发包,有了线程池的概念,可以通过Executors工具类的静态方法newFixedThreadPool(size)来创建一个指定大小的线程池,实现线程的重用。
3,反射及暴力反射;
|– 获取Class字节码的3种形式
|– 类名.class
|– 对象.getClass();
|– Class.forName(String);
|– 反射(Reflect) 反射就是将java类中的各个成分标射成相应的java类,
如字段标射成Field,构造方法标射成Construct,方法标射成Method,
通过Construct [k?n’str?kt].newInatance方法构建实例对象,通过Method.invoke方法来调用对应的方法,通过Field.get或者set方法来获取或者设置相应字段的值
|– 暴力反射
|– 暴力反射就是将某个类私有字段的访问检查去掉 [d?’kle?d]
|– 例如Person类中有一个私有的age字段,如果要反射出这个字段,则需要调用getDeclaredFields(),
如果使用getField则会抛NOSuchFieldException[?k’sep?(?)n; ek-] 未找到字段异常,
如果调用该字段的get或者set方法会抛IllegalAccessException非法的访问异常,
我们可以通过该字段的setAccessible(true)方法来告诉编译器是否进行访问检查.true就代表不进行访问检查.
4,谈谈对面向对象的理解;
|– java是全面向对象的语言,一切皆为对象,思想就是谁拥有数据谁就提供操作这些数据的方法,
5,如何取出Map中的元素
|– 同上,集合框架中有介绍.
6,动态代理:
|– 动态代理(Proxy) 动态代理就是JVM在运行期间动态生成出类的字节码,这种动态生成的类往往被用作代理类,就是动态代理
虚拟机生成的动态类必须实现同一个或者多个接口,所以生成的动态类只能用作具有相同接口的代理类.
通过Proxy的静态方法newProxyInstance来构建一个代理类,该方法接收的第一个参数是类加载器,
第二个参数是被代理类所实现的接口,
第三个参数是一个接口InvocationHandler,必须覆盖这个接口的invoke方法并在该方法中添加系统业务.
7,委托机制;
|– java中可以有多个类加载器,默认的有三个类加载器,他们分别加载特定位置上的类
|– BootStrap 用来加载jre\lib\rt.jar
|– ExtClassLoad 用来加载jre\lib\ext目录下的所有.jar
|– AppClassLoad 用来加载ClassPath所指定的所有.jar
|– 因为类加载器ClassLoad本身也是一个类,也需要被类加载器所加载,
所以必须要一个不是java类的类加载器,这个类加载器就是BootStrap,它是嵌套在JVM内核中的一个类加载器,
|– 委托机制
|– 为了保证类加载器父类的优先加载,java采用了委托机制来加载类,
|– 委托机制就是类加载器在加载每一个类的时候都会先委托给它的父类来加载,以此类推直到BootStrap的时候
如果BootStrap没有加载到指定类的时候在一级级退回来,直到类加载的发起者如果还没有加载到指定类的时候则会抛ClassNotFoundException类未找到异常.
8,IO字符流复制文件、字节流复制文件、复制文件夹;
|– 字符流复制文件(只能是纯文本文件),
|– 定义一个带缓冲的字符读取流与文件关联
|– 创建一个文本文件,定义一个字符写入流与此关联
|– 完成文件的读写
|– 关闭资源
|– 字节流复制文件
|– 定义一个字节读取流与文件关联
|– 创建一个文本文件,在定义一个字节写入流于此关联
|– 完成文件的读写
|– 关闭资源
|– 字符流复制文件夹(只能是纯文本文件)

   |-- 字节流复制文件夹

9,泛型,说了个上下限说是什么时候用;
|– 泛型其实就是为了限定集合中的输入类型,让编译器挡住程序的非法输入,避免了强制类型转换的问题
|– 泛型的上限 格式为

0 0
原创粉丝点击