【干货】面试总结——Java基础知识.docx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《【干货】面试总结——Java基础知识.docx》由会员分享,可在线阅读,更多相关《【干货】面试总结——Java基础知识.docx(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【干货】面试总结一一Java基础知识 Java语言有啥特点?简单易学 面向对象(封装、继承、多态、抽象) 跨平台(JVM实现跨平台) 可靠性 安全性 支持多线程 支持网络编程 编译和解析并存 JVM是什么? JVM (Java虚拟机):是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现,目的是使 用相同的字节码,它们都会给出相同的结果。 字节码:JVM可以理解的代码,扩展名为.class的文件。它不面向任何特定的处理器,只面向虚拟 机。Java通过字节码的方式,在一定程度上解决了传统解析型语言执行效率低的问题,同时又保留 了解析型语言可移植的特定。所以Java程序运行比较高效。 字节
2、码和不同系统的JVM的实现是Java语言一次编译,随处可运行的关键。 Java程序运行过程.java文件(源代码).java文件(源代码)JDK中的 ,javac编译.class文件。VM可 理解的Java字节)JVM机器可执行的二进制机器码 OracleJDK 和 OpenJDK 的对比? OpenJDK是一个参考模型并且是完全开源的;而OracleJDK是基于OpenJDK7构建的,并不是 完全开源的。 OracleJDK比OpenJDK更稳定。两者代码几乎相同,但OracleJDK有更多的类和一些错误的修 复。 在响应性和JVM性能方面,OracleJDK更出色一些。 import ja
3、va 和 javax 有什么区另(J ?刚开始Java API所必需的包是java开头的包,javax是扩展API包来使用。后来javax逐渐成为Java API的组成部分。字符型常量和字符串常量的区别?形式上:字符型常量是单引号引起的一个字符;字符串常量是双引号引起的0个或若干个字符;/读取文本文件的内容Scanner scanner = nul 1;try scanner = new Scanner(new File(D:/list.txt);while (scanner. hasNextO) System.out.pri ntln(scanner.nextLi ne();) catch
4、(FileNotFoundException e) e.pri ntstackTrace(); finally if (scanner != null) scanner.close();)使用Java 7之后的try-with-resources语句改造上面的代码:try (Scanner scanner = new Scanner(new FileCD:/list.txt) while (scanner. hasNextO) System.out.pri ntlnfscanner.nextLi ne();) catch (FileNotFoundException e) e.pri ntst
5、ackTrace();)当多个资源需要关闭的时候,通过使用分号分隔。try (Bufferedlnputstream in = new Bufferedlnputstream(new FileinputStream(new FileCdV/in.txt);BufferedoutputStream out = new Bufferedoutputstream(new Fileoutputstreamfnew FileCd:/out.txt) int b;while (b = in.readO) != -1) out.write(b);) catch (lOException e) e. prin
6、tstackTrace(); ) Java中IO流分为几种? 按照流的流向分:分为输入流和输出流; 按照流的操作单元分:分为字节流和字符流; 按照流的角色分:分为节点流和处理流; Java 10流有40多个类,都是从以下4个抽象类基类中派生出来的。 Inputstream / Reader :所有的输入流的基类,前者是字节输入流,后者是字符输入流。 Outputstream/Writer :所有输出流的基类,前者是字节输出流,后者是字符输出流。按操作方式Reader字符读取Reader字符读取Writer字符写出按操作对象BufferedlnputStreamBufleredOutputStr
7、eam缓冲操作BufferedReaderSufferedWrrterDatalnputStream基本数据类型操作Inputstream 字节读取OutputStream 字节写出FMWad9r节点流CharArrayReaderInputStrM/nAMdOfRewrite,节点设MeArraylnpulStrearYiPipedWrtlefpnntWrrterPipedReadefOutputStream WriterBuffefodReaderBufferedWruerChafArrayWmerP*pedlnpvtStream处理流DataOutputStreamFilelnputSt
8、reamJava 10节点流既然有了字节流,为什么还要有字符流?不管是文件读写还是网络传输,信息的最小存储单元都是字节,那为什么I/。流操作要分为字节流 和字符流?字符流是由于Java虚拟机将字节转换得到的,这个过程比较复杂耗时,并且,如果不知道编码类 型很容易出现乱码问题。所以,I/O流提供了一个直接操作字符的接口,方便对字符进行流操作。怎么解决浮点数进度丢失?使用 BigDecimal浮点数之间的等值判断,基本数据类型不能用“= = ”来比较,包装类型不能用“equals”来 判断。(具体原理与浮点数的编码方式有关,精度丢失)float a = 1.Of - 0.9f;float b =
9、0.9f - 0.8f;System.out.println(a);/ 0.100000024System.out.println(b);/ 0.099999964System.out.println(a = b);/ false使用BigDecimal来定义浮点数,再进行运算操作BigDecimal a = new BigDecimal(1.0)BigDecimal b = new BigDecimal(0.9)BigDecimal c = new BigDecimal(n0.8)BigDecimal xBigDecimal yBigDecimal xBigDecimal ya.subtra
10、ct(b);b.subtract(c);System.out.println(x); /* 0.1 */System.out.println(y); /* 0.1 */System.out.println(Objects.equals(x, y); /* true */在使用BigDecimal时,为防止精度丢失,推荐使用它的BigDecimal(String)构造方法或者 BigDecimal.valueOf方法来创建对象,禁止使用构造方法BigDecimal(double)的方式把double 值转化为BigDecimal对象。 BigDecimal a = new BigDecimal(
11、O.lf);实际存储值为:BigDecimal a = new BigDecimal(0.1); 正解 BigDecimal a = new BigDecimal.valueOf(O.l); 正解工具类Arrays.asList。使用注意事项? Arrays.asListO将数组转换为集合后,底层其实还是数组,不能使用其修改集合相关的方法,它的 add/remove/clear 方)去会抛出 UpsupportedOperationException 异常。 Arrays.asListO的返回对象是一个Arrays的内部类,并没有实现集合的修改方法。体现的是适配 器模式,只是转换接口,后台的数
12、据仍是数组。String strs = new Stringa, b, c;List list = Arrays.asList(strs);第 一布1P倩)兄:list. add (d);- 运彳丁小j异常(UnsupportedOperationException): 免二种情况:strs = ndn; - list .get (匚)的值脸之改变为传递的数组必须是对象数组,而不是基本类型。(Arrays.asListO是泛型方法,传入的对象必须是 对象数组)int myArray = 1, 2, 3;List myList = Arrays.asList(myArray);System.ou
13、t.println(myList.size();/ISystem.out. printlnCmyList.get(0);/数组地址值System, out. println(myList. get(1) ;/报错:ArraylndexOutOfBoundsExceptionint array =myList.get(0);System.out.println(array0);/I当传入一个基本类型的数组时,Arrays.asList。的得到的参数不是数组中的元素,而是数组本身。 此时List的唯一元素就是这个数组。如何将数组转换为ArrayList ?自定义方法实现static List ar
14、rayToList(f1nal T array) final List 1 = new ArrayList(array.length); for (final T s : array) 1. add(s);)return 1; 结合Arrays.asList()实现(推荐)List list = new ArrayListo(Arrays.asList(an, bH, 使用Java 8的Stream (推荐)integer myArray = 1, 2, 3 ;List myList = Arrays.stream(myArray).collect(Collectors.toList(); /
15、基本类型也可以实现转换(依赖boxed的装箱操作)1 nt myArray2 = 1, 2, 3 ;List myList = Arrays.stream(myArray2).boxed().collect(Collectors.toList(); 使用Java 9的Listof()方法lnteger array = 1, 2, 3; /*不支持基本数据类型*/ List list = Li st.of(array);System.out.println(list); /* 1, 2, 3 */不要在foreach循环里进行元素的remove / add操作? fail-fast (快速失败)
16、机制:java集合(Collection )中的一种错误机制。当多个线程对同一个集合内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator遍历某集合的过程中,若该集合内容被其他线程所改变了 , 那么线程A访问该集合时,就会抛出ConcurrentModificationException异常。单线程下,在foreach循环里调用集合类的remove方法,将抛出 ConcurrentModificationException 异常。解决方案一 :Java 8开始可以使用(:。1曲节。门#1。丫6开()方法删除满足条件的元素。List list = new A
17、rrayListoC);for (int i = 1; 1 filter % 2 = 0) ; /* 删除 1 ist中的所有偶数 */System.out.println(list); /* 1, 3, 5, 7, 9 */解决方案二:使用Iterator方式。(如果并发,需要对Iterator对象加锁)List list = new ArrayListO ();3for (int i = 1; i = 10; +i) list.add(i);一Iterator iterator = list.iterator();Elwhile (iterator.hasNext () 3 if (ite
18、rator .next () % 2 = 0) /* 删除list中的所有偶数 */ iterator remove();-(list); /* 1, 3, 5, 7, 9 */解决方案三:使用 CopyOnWriteArrayList 替换 ArrayList; fail-safe (安全失败)机制:采用安全失败机制的容器,在遍历时不是直接在集合内容上访问的, 而是先复制原有集合内容,在拷贝的集合上进行遍历。所以,在遍历过程中对原集合所做的修改并 不能被迭代器检测到,故不会抛ConcurrentModificationException异常。创建对象的方式有哪几种? new方法。 clone
19、():使用 Object 的 clone 方法。 反射调用public无参构造函数,若没有,则会报异常。Object obj = clazz.newlnstance();调用带有参数的构造函数,先获取到其构造对象,再通过构造方法类获取实例。/ 获取构造函数类的对象 Constructor constructor = User.class.getConstructor(String.class); / 使用构造对象的 newlnstance 方法初始化对象 Object obj = constructor.newlnstance(name);发序列化创建对象。(被创建实例的类需实现Seriali
20、zable接口)如何实现静态代理?优缺点?实现方式1.为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口。 2.在创建对象时,通过构造器塞入一个目标对象,然后在代理对象的方法内部调用目标对象同 名方法。优点在客户端和目标对象之间充当中介的作用,保护目标对象;可以扩展目标对象的功能;(在调用目标对象方法的前后增加其他一些方法。)比如:打印日 志缺点需要为每一个目标类编写对应的代理类,产生的类太多,工作量大。相比直接调用目标对象的方法,效率低一些。 了解动态代理?在哪些地方用到?作用为其它对象提供一种代理以控制对这个对象的访问。 JDK动态代理的实现在运行时,通过反射机制动态生
21、成代理对象; 调用程序必须实现InvocationHandler接口 ;使用Proxy类中的newProxylnstance方法动态的创建代理类。在哪些地方应用到? AOP、RPC框架中都有用到。 JDK的动态代理与CGLIB的区别JDK动态代理只能代理实现了接口的类;而CGLIB可以代理未实现任何接口的类。 JDK动态代理是通过反射的方式创建代理类;而CGLIB动态代理是通过生成一个被代理类的子 类来拦截被代理类的方法调用,因此不能将代理类声明为final类型的类和方法;JDK动态代理的效率更优。对Java注解的理解,解决声明问题? Java语言中的类、方法、变量、参数和包等都可以注解标记,
22、在程序运行期间可以获取到相应的注 解以及注解中定义的内容。注解极大地简化了代码,通过注解可以帮助我们简单地完成一些事情;比如:Spring中如果检测到 你的类被Component注解标记的话,Spring容器在启动的时候就会把这个类进行管理,我们 可以通过Autowired注解注入类的实例。内存泄漏和内存溢出?内存泄漏定义:是指不再使用的对象持续占用内存或者它们占用的内存得不到及时释放,从而造成内存 空间的浪费。 根本原因:长生命周期的对象持有短生命周期对象的引用;内存泄漏场景静态集合类引起:静态成员的生命周期是整个程序运行期间。例如M叩是在堆上动态分配对象,正常情况下使用完毕后,就会被gc回
23、收。而如果M叩 被static修饰,且没有删除机制,静态成员是不会被回收的,所以导致很大的M叩一直停 留在堆内存中。懒初始化static变量,尽量避免使用。 当集合里的对象属性被修改后,再调用remove。方法是不起作用的。当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值 的字段,否则对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了。 各种连接对象(I。流对象、数据库连接对象、网络连接对象)使用后未关闭。因为每个流在操作系统层面都对应了打开的文件句柄,流没有关闭,会导致操作系统的文 件句柄一直处于打开状态,而JVM会消耗内存来跟踪操作系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 干货 面试 总结 Java 基础知识
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内