Java基础
JRE与JDK
什么是面向对象
面向对象的特点
封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口。例如将类属性私有化,然后提供特定方法调用。
继承:继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态:多态同一个行为具有多个不同表现形式或形态的能力。如方法重载和重写
方法重载和重写
重载overload和重写override都是java多态的体现,重载用于一个类中同名方法拥有不同的参数列表。重写发生在子类与父类之间,重写方法可以改变返回值的类型,不能比父类被重写方法声明更多的异常。
== 和 equals
==如果比较的是基本数据变量:比较两个变量保存的数据是否相等(不一定要类型相同)
如果比较的是引用数据变量:比较两个对象的地址值是否相等。
equals:如果没有重写比较的是地址是否相等,重写后比较内容是否相等
&和&&
&:位运算与,不管成功与否都会吧判断条件全部执行
&&:逻辑与也是短路与及如果第一个条件不成立则不用执行第二个条件
String和StringBuild/StringBuffer的区别
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容
经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer
的toString()方法
Object类的常用方法
equals() // 比较对象的地址值是否相等,如果子类重写,则比较对象的内容是否相等;
hashCode() // 获取哈希码
toString() // 把数据转变成字符串
clone() // 创建并返回此对象的副本。
wait() // 多线程中等待功能
notify() // 多线程中唤醒功能
notifyAll() // 多线程中唤醒所有等待线程的功能
权限修饰符
抽象类和接口的区别
类型 | Abstract class | interface |
---|---|---|
继承 | 抽象类可以继承一个类实现多个接口(单继承,多实现);子类只可以继承一个抽象类 | 接口只可以继承接口;子类可以实现多个接口 |
构造方法 | 可以定义构造方法;可以有抽象方法和具体方法,也可以没有抽象方法 | 接口是抽象的,没有构造方法,且方法都是默认时抽象方法,但是jdk1.8,接口中的方法可以具体实现,用default关键字 |
实现方法 | 子类使用extend关键字来继承抽象类;如果子类不是抽象类的话,它需要提供抽象类中所有声明方法的实现 | 子类使用implements来实现接口,子类需要提供接口中所有声明的方法的实现 |
作用 | 把相同的东西提取出来,即代码复用 | 对类的行为进行约束,降低耦合 |
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中可以包含静态方法,接口中不能包含静态方法
5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
6. 一个类可以实现多个接口,但只能继承一个抽象类。
Java创建对象的方式
- 通过new语句实例化话对象
- 通过反射机制创建对象:(三种获取class类)
Class.forName(类的路径);类名.Class;实例.getClass() - 通过clone()方法创建一个对象
- 通过反序列化的方式创建对象
如何实现对象克隆
- 实现cloneable接口并重写Object类中的clone()方法
- 实现serializable接口通过对象的序列化和反序列化实现克隆
Java中有几种类型的流
字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。
冒泡排序
public static int[] mysort(int[] list) {
int temp = 0;
for (int i = 0;i<list.length - 1;i++) {
for (int j = 0;j<list.length - i - 1; j++) {
if (list[j] > list[j+1]) {
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
return list;
}
二分查找
public static int binarySearch(int target, int[] a) {
int low = 0;
int high = a.length - 1;
while(low <= high) {
int mid = (low + high) / 2;
if (a[mid] > target) {
high = mid - 1;
} else if (a[mid] < target) {
low = mid + 1;
} else {
return mid;
}
}
return -1;
}
打印质数
public static int primeNum(int range) {
int count = 0;
for(int i = 2;i <= range; i++) {
for(int j = 2; j <= i;j++) {
if(j<i && i%j==0) {
break;
} else if (j==i){
System.out.println(i);
count++;
}
}
}
return count;
}
异常
Java中的异常处理机制的简单原理和应用
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都java.lang.Thowable的子类。
error和exception的区别
Error:程序无法处理的系统错误,编译器不做检查;是jvm需要担负的责任。
Exception:程序可以处理的异常,捕获后可能恢复;
RuntimeException(非受检异常)是程序应该负担的责任;
Checked Exception (受检异常)可检查异常时Java编译器应该负担的责任。
throw 和 throws 的区别
throw:
- 出现在方法体,后面跟异常类对象名。
- 只能抛出一个异常对象名。
- 表示抛出异常you该方法类的语句来处理
- 执行throw一定出现了某种异常。
throw常用于自定义异常
throws:
- 出现在方法名,后面跟异常类名。
- 可以跟多个异常类名用逗号隔开
- 表示抛出异常由该方法的调用者处理
- throws表示有出现异常的可能性,并不一定出现这些异常
常见的异常类有哪些?
- ArithmeticException(算术异常)
- ClassCastException (类转换异常)
- IllegalArgumentException (非法参数异常)
- IndexOutOfBoundsException (下标越界异常)
- NullPointerException (空指针异常)
- SecurityException (安全异常)
final、finally、finalize的区别
final 的用途
final 修饰的类叫最终类,该类不能被继承。例如String
final 修饰的方法不能被重写,但能够重载
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
finally
finally在异常处理时提供 finally块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会
被执行。一般情况下,都把关闭物理连接(IO流、数据库连接、Socket连接)等相关操作,放入到此代码块中。
finalize
finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。
finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 一般情况下,此方法由JVM调用,程序员不要去调用!
容器
Collection和Collections的区别
Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。
List、Set、Map是否继承自Collection接口
List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。
List、Map、Set三个接口存取元素时,各有什么特点
List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。
ArrayList和Vector的区别
- 同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
- 数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。
HashMap和Hashtable的区别
- Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的。
- 只有HashMap可以让你将空值作为一个表的条目的key或value
- Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。
什么是java序列化,如何实现java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的
对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时
所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,
implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)
来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的
writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
多线程
多线程程序有几种实现方式?
两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。
Java 5以后创建线程还有第三种方式:实现Callable接口
sleep()和wait()有什么区别
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监
控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定
池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行
状态。
启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM
调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
同步有几种实现方法,都是什么
synchronized,wait与notify
线程池都有哪些状态?
1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表示线程阻塞于锁。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6.终止(TERMINATED):表示该线程已经执行完毕。
设计模式
单例设计模式
数据库
事务的四大特性ACID
- 原子性(Atomicity):数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错就会回滚到事务开始前的状态,所有的操作就像没有发生一样不会对数据库有任何影响。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,即一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是5000,这就是事务的一致性。
- 隔离性(Isolation):当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离,比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转入钱。
- 持久性(Durability):一个事务一旦被提交,则对数据库的所有更新将被保存到数据库中,不能回滚。
事务的隔离级别
计算机网络
OSI七层模型
前端
JSP
Java Web
Servlet的生命周期
加载和实例化、初始化、处理请求以及服务结束。
生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX
方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
forward()与redirect()的区别
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳
转,浏览器将会得到跳转的地址,并重新发送请求链接。
什么情况下调用doGet()和doPost()?
Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。
框架
Spring
控制翻转ioc
面向切面aop
SpringMVC
Mybatis
Spring Boot/Spring Cloud
什么是 spring boot?
通过Spring Boot,可以轻松地创建独立的,基于生产级别的Spring的应用程序,您可以“运行”它们。大多数Spring Boot应用程序需要最少的Spring配置。
为什么要用 spring boot?
spring boot 核心配置文件是什么?
application.properties
application.yml
spring boot 配置文件有哪几种类型?它们有什么区别?
spring boot 有哪些方式可以实现热部署?
spring-boot-devtools
Spring Loaded
Jrebel
模版热部署
spring boot集成mybatis
mybatis-spring-boot-starter
spring boot集成mysql
mysql-connector-java
JVM
jvm的内存布局
Java 8 虚拟机规范规定,Java 虚拟机所管理的内存将会包括以下几个区域:
程序计数器(Program Counter Register)
Java 虚拟机栈(Java Virtual Machine Stacks)
本地方法栈(Native Method Stack)
Java 堆(Java Heap)
方法区(Methed Area)
GC是什么?为什么要有GC
GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错
误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用
域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。