学习资源

面试题目收集->浏览对应的部分->提出问题,示例代码,用自己的语言解释。

文档

菜鸟教程-Java

  1. [311-]:面向对象 下
  2. [404-446]:多线程
  3. [516]:集合

黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程[/572]

  1. [99-133]:面向对象
  2. [220-249]:集合
  3. [279-302]:I/O流
  4. [324-338]:多线程
  5. [339-354]:网络编程

    Java基础

  6. JRM=JVM+核心类库。JDK=JRM+开发人员的工具(JVM调优)。

    基本语法

    1. import java.util.*;
    2. public class Main {
    3. public static void main(String[] args) {
    4. }
    5. }
  7. 1KB=2^10B=1024B=1024*8bit,一个字节8个比特

包装数据类型与基本数据类型区别?

  1. 包装类型可以用于泛型
  2. 包装类型是对象,对象实例都存在堆中。

8个基本数据类型?

  • byte short int long
  • float double
  • char
  • boolean

double(16字节)比float的精度更高
hashCode和equals?

  1. hash就是将输入散列成固定长度的int,int可能相同。
  2. equals比较内容,不比较数据类型;==比较类型
  3. hashMap(数据+链表)用来存储数据,通过key-value进行数据的存储。key被散列,再取模,如果取模后冲突(hash冲突)就通过链表放到之后的位置。
  4. switch实现字符串比较的原理是:比较字符串的哈希值。swithc还是比较的整型变量。

抽象类abstract和接口interface?

  1. 接口只有常量,抽象类只有常量,
  2. 没有构造方法
  3. 成员方法只能是抽象的。

    面向对象_类的组成

  4. 构造方法:初始化类

  5. 属性
  6. 方法

    面向对象_封装继承多态

    重载和重写的区别?

  7. 重载是多态内容,在一个类中方法名称相同,参数个数,类型、顺序不同。

  8. 重写的继承,发生在父子类中,方法名称、参数列表必须相同。

    面向对象_关键字

    **static**作用?
  • 即使没有创建实例也可以使用类的属性和方法。

**final**关键字的作用?

  • 修饰类:表示该类不能继承。
  • 修饰方法:该方法不能被子类重写。
  • 修饰变量:只能在静态代码块或者声明时指定初始值。

**abstract****interface**的区别?

  • 抽象类可以定义构造函数,接口不可以。
  • 抽象类可以有抽象方法和具体方法,接口中只能有抽象方法。
  • 抽象类只能继承一个,接口可以有多个实现。
  • 抽象类的成员变量可以是多种类型,接口只能是public ``static ``final类型。

    异常处理

  1. Exception与Error区别?Exception可以程序可以处理,Error程序无法处理。
  2. try、catch、finally如何使用?try用于捕获异常,catch用于处理异常,不管怎样都要执行finally

    Java高级

    枚举与注解

  3. 注解就是代码的特殊标记,需要配合反射一起使用。

  4. 基本注解:
    1. orverride:重写父类方法

      Java集合

      java集合.gif
      ArrayList与LinkedList的区别?
  • ArrayList使用连续内存存储,适合下标访问。
  • 基于链表,数据分散存储在内存中,适合删除和插入,每次查询都要从头开始。

HashTable与HashMap的区别?

  • HashTable线程是安全,HashMap的的线程不是安全的。
  • HashMap允许key value可以为null。

    泛型

    什么是泛型?

  • JDK5引入的新特性。可以用泛型参数指定传入对象的类型。

    多线程

    进程与线程的区别?

  1. 进程是正在运行的程序,系统调用的单位,有自己的内存和资源。
  2. 线程是单个顺序流,只有一条执行路径,一个进程可能同时进行着多个线程。

创建线程的方式?

  1. Thread类继承了Runable接口,所以我们可以通过实现Runable接口或者继承Thread类来创建线程,将执行代码放在run()方法中。
  2. 然后就是Callable接口,这个接口是Runable的增强版本,执行代码的方法是call()方法,这个call方法可以有返回值。
  3. 最后就是通过线程创建线程。通过Executors类的静态方法创建线程池,可以创建4种线程池。
  4. 一般都用线程池创建线程,提前造好线程,使用的时候直接用,用完返回。提高响应速度,降低资源便于管理。打个比方,你去一个地方不用每次都从造车开始,直接使用公共交通工具。

线程都有哪些方法?

  • wait()方法就是线程等待,调用方法后进入waitting状态,只有notify()后才会释放对象的锁。
  • sleep()就是让线程休眠,此时线程处于阻塞状态,sleep()不会释放CPU,wait()会释放。

理解一下线程中的锁?

  1. 锁就是为了当多个线程访问一个数据的时候为了保证数据的安全,我们要对操作数据的代码进行加锁。
  2. 一般用静态变量作为锁,锁用synchronized关键字包裹,当操作完后数据后释放锁,然后其他线程获取到锁后,才能执行数据操作的代码。
  3. 但是操作不当可能会造成死锁,就是A和B都在等待对方释放锁。
  4. 锁分为乐观锁和悲观锁,

synchronized与Lock的区别?

  • synchronized是内置的关键字,Lock是Java的一个类。
  • synichronized是自动释放锁,Lock需要手动释放。

I/O流

  1. 序列化就是将:数据结构或者对象转换成字节流的过程。私用场景

I/O流分类

  1. 字符流:记事本打开人能读懂的
    1. 写入后,需要刷新。new OutputStreamWriter(new FileOutputStream("E:\\glzty\\Gitee\\Test\\src\\fos.txt"));
  2. 字节流:图片等,写入的是数字
    1. O输出磁盘:new FileOutputStream("E:\\glzty\\Gitee\\Test\\src\\fos.txt");
    2. I输入内存:new FileInputStream("E:\\glzty\\Gitee\\Test\\src\\fos.txt");

      常用类

      ```java //扫描系统输入 Scanner sc = new Scanner(System.in);

//输入整数 int i = sc.nextInt();

//空格结束 String str1 = sc.next();

//换行符结束 String str2 = sc.nextLine();

//将str2中所有的str1都换掉 str2.replaceAll(str1,””);

//截取字符串,包括str2.atChar[2] str2.substring(2)

  1. - Object类是所有类的父类。
  2. **对象相等和引用相等的区别?**
  3. 1. 对象相等比较内存存放的内容是否相等。
  4. 1. 引用相等比较的是内存地址是否相等。
  5. **StringStringBufferStringBuilder区别?**
  6. 1. Stringfinal修饰的类,无法修改,每次修改都创建新的String对象。
  7. 1. StringBuffer线程安全
  8. 1. StringBuilter线程不安全。
  9. **String new 和**`** = ""**`**的区别?**
  10. - String`="hello"`赋值,如果内容相同,只会创建一个对象,即使变量名字不同。
  11. <a name="k0muE"></a>
  12. ## 反射
  13. **什么是反射?反射的原理?**
  14. - 反射:在运行过程中,获得类或者对象的属性和方法。
  15. - 原理:类在堆内存加载后,会产生一个Class类型的对象,这个对象包括了这个类完整的信息。
  16. **反射的入口?**
  17. - Class.forname("类名")、
  18. - 类名.class
  19. - 对象.getClass()
  20. **创建对象的方式?**
  21. - 创建对象的方式:new、反射、clone、序列化。
  22. <a name="NMaO9"></a>
  23. ## Lambda、Stream
  24. 1. Lambda本质就是函数式接口(只有一个方法)的实现。
  25. 1. Collection有关数据静态存储,Stream有关数据计算。
  26. <a name="fZcC5"></a>
  27. # Java拓展
  28. <a name="oer0n"></a>
  29. ## JVM
  30. **你对Java虚拟机的理解?**
  31. 1. JVM包括4个部分:类加载器、字节码执行引擎、本地接口、运行时数据区。
  32. 1. 类加载:JVM生成`.class`字节码文件,字节码就是虚拟机可以识别编码,并且将文件加载到内存中,只要符合文件的结构就加载,不管能否运行。
  33. 1. 字节码执行器:解释命令,交给操作系统执行,这里有垃圾回收。
  34. 1. 运行时数据区:拿到内存后,对内存进行割分。
  35. **加载方式?**
  36. - 加载其中有4种类型的加载器,这些加载器有层级关系:最高是Java核心库的加载器;其次加载扩展包里的类的加载器;再加载用户自定义的类的加载器。
  37. - 但是在加载类的时候不会直接属于自己的加载器去加载,而是用父加载器,不断迭代,当父加载器不能加载的时候才用子加载器进行加载。这样可以避免重复加载和保障安全性(不能随意重写核心库)。
  38. **介绍一下内存泄漏和内存溢出?**
  39. 1. 内存泄漏是申请内存后,无法释放内存。
  40. 1. 内存溢出,无法申请到足够的内存以供申请者使用。
  41. **内存溢出的类型有哪些?**
  42. 1. 递归容易发生栈内存溢出,请求栈的深度大于允许的深度就会报出栈溢出错误,内存不够就会报OUT OF MEMORY
  43. 2. JVM内存有:新生代(回收频繁,如果eden扫描后还有就放到suvivor中);老年代(多次扫描suvivor还在);持久代。为了对不同的区域实行不同的GC(垃圾回收)策略。
  44. **垃圾回收算法?**
  45. - 引用计数法:每个对象都有一个引用计数的属性,新增一个引用+1,释放一个-1,计数为0就回收内存。
  46. - 可达性分析:从GC ROOTS开始向下搜索,当一个对象没有任何引用链相连,证明此对象不可用,虚拟机判定可以回收。
  47. <a name="sG6FY"></a>
  48. ## 常用设计模式?
  49. ```java
  50. //扫描系统输入
  51. Scanner sc = new Scanner(System.in);
  52. //输入整数
  53. int i = sc.nextInt();
  54. //空格结束
  55. String str1 = sc.next();
  56. //换行符结束
  57. String str2 = sc.nextLine();
  58. //将str2中所有的str1都换掉
  59. str2.replaceAll(str1,"");
  60. //截取字符串,包括str2.atChar[2]
  61. str2.substring(2)
  1. 设计模式是面向对象编程的设计思想,都是代码经验:如何创建对象(工厂、单例)?如何设计类和对象的组合(适配器)?对象之间通信(观察者)?
  2. 单例设计模式:一个类只有一个对象。