1、异常的分类
throwable 分为 error 和 exception
error 错误有jvm处理
exception 分为运行时异常 和 非运行时异常
运行时异常 比如 int a = 1/0
非运行时异常必须去捕获 或者继续跑出
2、String StringBuffer StringBuilder 之间的区别
String
是不可变的,每次对Sting 操作都会生成新的String 对象。开辟新的内存对象
String 为什么是不可变的,通过查看源码,简单来说就是String类利用了final修饰的char类型数组存储字符 private final char value[] ;保存字符串 所以String 对象是不可变的
StringBuffer
可变字符串 效率低,线程安全 通过查看源码可知 由synchronized 修饰的
1 | @Override |
Stringbuilder
不可变字符串 效率高线程不安全
3、线程
参考:https://www.cnblogs.com/happy-coder/p/6587092.html
线程状态
1、新建状态 (new) :线程对象被创建后,就进入新建状态 Thread thread = new Thread();
2、就绪状态 (runable) 调用了该对象的start() 方法 从而启动线程 例如 thread.start() 处于就绪状态,随时可能被cpu调度执行
3、运行状态(running) 线程获得cpu 的执行权限,线程只能从就绪进入运行状态
4、阻塞状态 阻塞状态是线程因为某种原因放弃cpu 的执行权限,暂时停止运行,直到线程进入就绪状态才有机会转到运行状态。阻塞的情况分为三种
5、死亡状态:线程执行完了或者因异常退出了 run() 方法,该线程结束生命周期
4、序列化和反序列化
序列化:把对象转成字节序列的过程称为序列化
反序列化:把字节序列恢复为对象的过程称为反序列化
用途:
把对象的字节序列永久的保存在硬盘上 通常是保存在一个文件中
把网络上传送对象的字节序列
5、基本类型和引用类型
基本数据类型
byte 8位
short 16位
int 32位
long 64位
float: 浮点型 32位
double 双精度浮点型 64位
char 字符型 16位
Boolean 布尔类型 1位
内存存储上的区别
基本数据类型 是直接存储在内存中的内存栈上
引用类型 使用内存堆和内存占进行存储,简单来说 引用 是存储在有序的内存栈上,而对象本身的值存储在内存堆上的
6、 ==与equals(重要)
== 他的作用是判断两个对象的地址是不是相等,即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)
eques() : 他的作用也是判断对象是否相等。蛋挞一般有两种使用情况:
情况1、类没有覆盖equals() 方法。则通过equals() 比较该类的两个对象时,等价于通过 “==” 比较这两个对象
情况2、类覆盖了equals() 方法。一般,我们都覆盖equals() 方法来两个对象的内容相等;若他们的内容相等,则返回true
举个例子
1 | public class test1 { |
上述运行结果
- String 中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。
- 当创建String类型的对象是,虚拟机会在常量池查找有没有已经存在的值和要创建的值相同的对象。如果有就把它赋给当前引用,如果没有就在常量池中重新创建一个String对象
7、什么是反射机制?反射机制的应用场景有哪些?
8、谈谈几种设计模式
9、重载和重写的区别
重载: 在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同
重写: 发生在父子类中,方法名、参数列表必须相同,返回值返回小于父类,抛出的异常返回小于等于父类,访问修饰符范围大于等于父类。如果父类方法访问修饰符为private 则子类就不能够重写该方法
注意点: 父类的静态方法可以被继承,但不能被子类重写, 方法加静态后就属于类不属于对象了
10、接口和抽象类的区别
抽象方法: 通过abstract修饰的方法,该方法只能生命没有具体的实现 格式 abstract void fun();
抽象类: 如果一个类含有抽象方法,则该类为抽象类,类前必须用abstract 关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象,但是一个类不包含抽象方法,也可以是抽象类,只要他用abstract关键字修饰了就是抽象类。
抽象类和普通类主要三点区别
- 抽象方法俺必须是public 或者protected (因为如果是private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
- 抽象类不能创建对象
- 如果一个类继承了抽象类,则子类必须实现父类的抽象方法,如果子类没有实现父类的抽象方法,则必须将子类也定义为abstract类
接口: 接口可以含有变量和方法,但是注意:接口中的变量会被隐式的指定为public static final 变量(并且只能是public static final变量,用private修饰会报编译错误)而方法会被隐式的指定为public abstract 方法,而且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中的所有方法不能有具体的实现,也就是说,接口中的方法必须是抽象方法,从而可以看出,接口和抽象类的区别,接口是一种极度抽象的类型,他比抽象类更加“抽象类”,并且一般情况下不在接口中定义变量。可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
二者的区别:
语法上: 一个类只能继承一个抽象类,而一个类可以实现多个接口
接口中不能含有静态代码块已经静态方法。而抽象类可以
抽象类中的成员变量可以是各种类型,而接口的成员变量只能是public static final类型的
抽象类可以提供成员方法的实现细节,而接口只能存在public abstract方法(抽象类可以有具体的方法实现,而接口是能都是抽象方法)
11、简单介绍下Java的面向对象
https://www.cnblogs.com/hysum/p/7100874.html#_label1
三大特征: 封装 继承 多态
封装:
概念:将类的某些信息隐藏在类的内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
继承:
java 的继承是单继承,即一个类只能继承一个父类
多态:
引用多态: 父类的引用可以指向本类对象,父类的引用指向子类对象
方法多态: 创建本类对象时,调用的方法为本类的方法,创建子类对象时,调用的方法为子类重写的方法或者继承的方法。
多态存在的条件: 继承,重写
多态的作用是相处类型之间的耦合关系
在实践项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(B b = new A());如果在A类中重写B类的方法的时候,
输出的是A类放在里面的信息(B b = new A())
注意:如果子类写有一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法。
12、servlet的生命周期
- 实例化servlet
- init():servlet实例化时调用此方法
- service(): 客户请求相应调用此方法
- destroy(): 服务终止
13、jsp 的内置对象
jsp本质是一个servlet
request对象
response对象
page对象
session对象
application对象
out对象
exception对象
config对象
pageContext对象
14、简单介绍下mvc
model view controller 模型 试图 控制器 最经典的MVC 就是 jsp + servlet javabean
model 数据模型,提供要展示的数据
view 负责进行模型的展示,一般是用户见到的用户界面
controller 控制器 接收用户请求
15、简单介绍下Tomcat
16、jdbc的步骤
加载程序驱动 class,forname(“com.mysql.jdbc.driver”)
建立连接 需要用到drivermanager 类中静态方法getconnection()
1
Connection connection=DriverManager.getConnection("jdbc:mysql://localhost/Contacts?serverTimezone=UTC", "root", "Cc229654512");
创建运行对象 运行对象statement 负责运行sql语句。有connection对象产生
1
Statement st = connection.createStatement();
执行sql语句,可以使用方法executeUpdate(String sql) 来执行数据定义语言或者更新语句 可以使用executeQuery(String sql)来执行sql 查询语句。结果在resultset中返回
1
ResultSet resultSet=statement.executeQuery("select Name, PhoneNumber, Email, QQ, Note from Contacts");
处理resultset
结果集 resultset 可以获得表的当前行,可以使用nextt 方法移动行。可以使用get 方法获取当前行的值
1
2
3
4
5
6
7while(resultSet.next())
{
System.out.println(resultSet.getString(1)+"\t"+resultSet.getString(2)+"\t"+resultSet.getString(3));
}释放资源
17、java的反射机制
概念: 在运行状态中,对于任意一个类,都能知道这个类的属性和方法,对于任意一个对象,都能调用他的方法和属性
反射的作用:
- 在运行时判断任意对象所属的类
- 在运行时判断任意对象所具有的的成员属性和方法
- 在运行时构造任意一个类的对象
18、volatile 关键字的作用
synchronized 是属于重量级,volatile 是轻量级
保证共享变量对所有线程的可见性
1、当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去
2、这个写操作会导致其他线程中的缓存无效
禁止指令重排
19、java 创建线程池的几种方式
- newScheduledThreadPool() 创建一个定长的线程池 支持定时及周期性任务执行
- newCachedThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行
20、面向接口编程的优点
降低程序的耦合,最大限度的解耦,所谓的解耦,就是解耦合的意思
易于程序的扩展
有利于程序的维护
开闭原则:对扩展开放,对修改关闭
其恰恰就是遵循的是使用接口来实现。在使用面向接口的编程过程中,将具体逻辑与实现分开,减少各个类的相互依赖,当各个类变化时,不需要对已经编写的系统进程改动,添加新的实现类就可以了,不在担心新的改动的类会对系统的其他模块造成影响。
21、事务的实现方式
- 编程式事务
- 基于TransactionProxyFactoryBean的声明式事务管理
- 基于@transactional的声明式事务管理
- 基于AOP配置事务
事务的四种特性ACID
atomic 原子性 consistency 一致性 isolation 隔离性 durability 持久性
22、mybatis 的 $ 和 # 的区别
#{} 是预编译处理的 ${} 是字符串替换 mybatis在处理 #{} 时,会将sql中的 #{} 替换为 ? 在 ${} 替换成变量的值 使用#{} 可以防止sqk注入
23、& 和 && 的区别
& 两个判断条件都需要进行判断 而 && 只要左边表达式为false 右边的表达式不会继续判断 整个表达式为false
24、float f = 3.4 是否正确
不正确 3.4浮点型默认是double 双精度类型的 定义为 float 属于向下转型,需要强转或者 写成 float f = 3.4f float f = 3.4F float f = (float)3.4;
补充 1 默认是 int 型
25、a = a + b 和 a+=b 的区别
26、冒泡算法
27、final, finally, finalize 的区别
final 用于声明 属性 方法 类 分别表示属性不可变,方法不可覆盖,类不可继承
finally 是异常处理语句结构的一部分,表示总是执行
finalize 是object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收。
28、int 和 Integer 区别
int 是基础数据类型,java为其提供封装类, int 默认值是0 integer是 null,是引用类型
29、说说自定义注解的场景及实现
未完待续…