学习资源
面试题目收集->浏览对应的部分->提出问题,示例代码,用自己的语言解释。
文档
- Number 类 和 Math类
- String类
- Iterator:用于访问集合 hasNext Next()
教学视频
尚硅谷Java入门视频教程(在线答疑+Java面试真题)
- [311-]:面向对象 下
- [404-446]:多线程
- [516]:集合
黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程[/572]
- [99-133]:面向对象
- [220-249]:集合
- [279-302]:I/O流
- [324-338]:多线程
-
Java基础
JRM=JVM+核心类库。JDK=JRM+开发人员的工具(JVM调优)。
基本语法
import java.util.*;
public class Main {
public static void main(String[] args) {
}
}
1KB=2^10B=1024B=1024*8bit,一个字节8个比特
包装数据类型与基本数据类型区别?
- 包装类型可以用于泛型
- 包装类型是对象,对象实例都存在堆中。
8个基本数据类型?
- byte short int long
- float double
- char
- boolean
double(16字节)比float的精度更高
hashCode和equals?
- hash就是将输入散列成固定长度的int,int可能相同。
- equals比较内容,不比较数据类型;==比较类型
- hashMap(数据+链表)用来存储数据,通过key-value进行数据的存储。key被散列,再取模,如果取模后冲突(hash冲突)就通过链表放到之后的位置。
- switch实现字符串比较的原理是:比较字符串的哈希值。swithc还是比较的整型变量。
抽象类abstract和接口interface?
- 接口只有常量,抽象类只有常量,
- 没有构造方法
-
面向对象_类的组成
构造方法:初始化类
- 属性
-
面向对象_封装继承多态
重载和重写的区别?
重载是多态内容,在一个类中方法名称相同,参数个数,类型、顺序不同。
- 重写的继承,发生在父子类中,方法名称、参数列表必须相同。
面向对象_关键字
**static**
作用?
- 即使没有创建实例也可以使用类的属性和方法。
**final**
关键字的作用?
- 修饰类:表示该类不能继承。
- 修饰方法:该方法不能被子类重写。
- 修饰变量:只能在静态代码块或者声明时指定初始值。
**abstract**
与**interface**
的区别?
- 抽象类可以定义构造函数,接口不可以。
- 抽象类可以有抽象方法和具体方法,接口中只能有抽象方法。
- 抽象类只能继承一个,接口可以有多个实现。
- 抽象类的成员变量可以是多种类型,接口只能是
public ``static ``final
类型。异常处理
- Exception与Error区别?Exception可以程序可以处理,Error程序无法处理。
try、catch、finally如何使用?
try
用于捕获异常,catch
用于处理异常,不管怎样都要执行finally
。Java高级
枚举与注解
注解就是代码的特殊标记,需要配合反射一起使用。
- 基本注解:
- ArrayList使用连续内存存储,适合下标访问。
- 基于链表,数据分散存储在内存中,适合删除和插入,每次查询都要从头开始。
HashTable与HashMap的区别?
- 进程是正在运行的程序,系统调用的单位,有自己的内存和资源。
- 线程是单个顺序流,只有一条执行路径,一个进程可能同时进行着多个线程。
创建线程的方式?
Thread
类继承了Runable
接口,所以我们可以通过实现Runable接口或者继承Thread类来创建线程,将执行代码放在run()
方法中。- 然后就是
Callable
接口,这个接口是Runable的增强版本,执行代码的方法是call()
方法,这个call方法可以有返回值。 - 最后就是通过线程创建线程。通过Executors类的静态方法创建线程池,可以创建4种线程池。
- 一般都用线程池创建线程,提前造好线程,使用的时候直接用,用完返回。提高响应速度,降低资源便于管理。打个比方,你去一个地方不用每次都从造车开始,直接使用公共交通工具。
线程都有哪些方法?
wait()
方法就是线程等待,调用方法后进入waitting状态,只有notify()
后才会释放对象的锁。sleep()
就是让线程休眠,此时线程处于阻塞状态,sleep()
不会释放CPU,wait()会释放。
理解一下线程中的锁?
- 锁就是为了当多个线程访问一个数据的时候为了保证数据的安全,我们要对操作数据的代码进行加锁。
- 一般用静态变量作为锁,锁用
synchronized
关键字包裹,当操作完后数据后释放锁,然后其他线程获取到锁后,才能执行数据操作的代码。 - 但是操作不当可能会造成死锁,就是A和B都在等待对方释放锁。
- 锁分为乐观锁和悲观锁,
synchronized与Lock的区别?
synchronized
是内置的关键字,Lock是Java的一个类。- synichronized是自动释放锁,Lock需要手动释放。
I/O流
- 序列化就是将:数据结构或者对象转换成字节流的过程。私用场景
I/O流分类
- 字符流:记事本打开人能读懂的
- 写入后,需要刷新。
new OutputStreamWriter(new FileOutputStream("E:\\glzty\\Gitee\\Test\\src\\fos.txt"));
- 写入后,需要刷新。
- 字节流:图片等,写入的是数字
//输入整数 int i = sc.nextInt();
//空格结束 String str1 = sc.next();
//换行符结束 String str2 = sc.nextLine();
//将str2中所有的str1都换掉 str2.replaceAll(str1,””);
//截取字符串,包括str2.atChar[2] str2.substring(2)
- Object类是所有类的父类。
**对象相等和引用相等的区别?**
1. 对象相等比较内存存放的内容是否相等。
1. 引用相等比较的是内存地址是否相等。
**String、StringBuffer、StringBuilder区别?**
1. String是final修饰的类,无法修改,每次修改都创建新的String对象。
1. StringBuffer线程安全
1. StringBuilter线程不安全。
**String new 和**`** = ""**`**的区别?**
- String用`="hello"`赋值,如果内容相同,只会创建一个对象,即使变量名字不同。
<a name="k0muE"></a>
## 反射
**什么是反射?反射的原理?**
- 反射:在运行过程中,获得类或者对象的属性和方法。
- 原理:类在堆内存加载后,会产生一个Class类型的对象,这个对象包括了这个类完整的信息。
**反射的入口?**
- Class.forname("类名")、
- 类名.class
- 对象.getClass()
**创建对象的方式?**
- 创建对象的方式:new、反射、clone、序列化。
<a name="NMaO9"></a>
## Lambda、Stream
1. Lambda本质就是函数式接口(只有一个方法)的实现。
1. Collection有关数据静态存储,Stream有关数据计算。
<a name="fZcC5"></a>
# Java拓展
<a name="oer0n"></a>
## JVM
**你对Java虚拟机的理解?**
1. JVM包括4个部分:类加载器、字节码执行引擎、本地接口、运行时数据区。
1. 类加载:JVM生成`.class`字节码文件,字节码就是虚拟机可以识别编码,并且将文件加载到内存中,只要符合文件的结构就加载,不管能否运行。
1. 字节码执行器:解释命令,交给操作系统执行,这里有垃圾回收。
1. 运行时数据区:拿到内存后,对内存进行割分。
**加载方式?**
- 加载其中有4种类型的加载器,这些加载器有层级关系:最高是Java核心库的加载器;其次加载扩展包里的类的加载器;再加载用户自定义的类的加载器。
- 但是在加载类的时候不会直接属于自己的加载器去加载,而是用父加载器,不断迭代,当父加载器不能加载的时候才用子加载器进行加载。这样可以避免重复加载和保障安全性(不能随意重写核心库)。
**介绍一下内存泄漏和内存溢出?**
1. 内存泄漏是申请内存后,无法释放内存。
1. 内存溢出,无法申请到足够的内存以供申请者使用。
**内存溢出的类型有哪些?**
1. 递归容易发生栈内存溢出,请求栈的深度大于允许的深度就会报出栈溢出错误,内存不够就会报OUT OF MEMORY。
2. JVM内存有:新生代(回收频繁,如果eden扫描后还有就放到suvivor中);老年代(多次扫描suvivor还在);持久代。为了对不同的区域实行不同的GC(垃圾回收)策略。
**垃圾回收算法?**
- 引用计数法:每个对象都有一个引用计数的属性,新增一个引用+1,释放一个-1,计数为0就回收内存。
- 可达性分析:从GC ROOTS开始向下搜索,当一个对象没有任何引用链相连,证明此对象不可用,虚拟机判定可以回收。
<a name="sG6FY"></a>
## 常用设计模式?
```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)
- 设计模式是面向对象编程的设计思想,都是代码经验:如何创建对象(工厂、单例)?如何设计类和对象的组合(适配器)?对象之间通信(观察者)?
- 单例设计模式:一个类只有一个对象。