凌乱的面试题小结——回头汇总整理
java基础
封装继承多态
封装
高内聚,低耦合,不允许外部干涉,仅暴露少量的方法给外部使用,属性私有 get/set(set可加安全的验证--及一些条件的判断)
封装的意义
- 提高程序的安全性,保护数据
- 隐藏代码实现细节
- 统一接口
- 系统可维护增加
继承
继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
只有单继承,没有多继承
继承是类和类之间的关系,extends
私有的无法被继承
super注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中
- super和this不能同时调用构造方法
多态
多态是方法的多态,属性没有多态
父类和子类,有联系
存在的条件:继承关系,方法重写、父类引用指向子类对象
子类转换为父类,向上转型
父类转换成子类,向下转型:强制转换
方便方法的调用,减少重复的代码,提高利用率
实现多态方式:
1.接口多态性。
2.继承多态性。
3.通过抽象类实现的多态性。
抽象类和接口的异同
区别
- 抽象类可以用构造方法,接口不能有构造方法
- 抽象类可以有普通成员变量,接口不可以
- 抽象类可以包含非抽象的普通方法(抽象方法abstract修饰,没有方法体,有方法体的即非抽象方法),接口方法必须都是抽象(默认public abstract修饰了)
- 抽象类可以包含静态方法,接口不能
- 一个类可以实现多个接口,只能继承一个抽象类
相同
- 都不能被实例化
- 都可以包含声明方法
- 派生类必须实现未实现的方法
抽象类
![]()
接口 对比
![]()
![]()
string 、stringbuffer、StringBuilder三者区别
StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,StringBuffer、StringBuilder、可变长
-
在执行速度方面的比较:StringBuilder > StringBuffer
-
StringBuilder:单线程操作字符串缓冲区 下操作大量数据。线程非安全的
StringBuffer:多线程操作字符串缓冲区 下操作大量数据,线程安全的
如果要操作少量的数据用 String
StringBuffer常用方法
append方法
public StringBuffer append(boolean b)
该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接,调用该方法以后,StringBuffer对象的内容也发生改 变,例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.append(true);
则对象sb的值将变成”abctrue”
使用该方法进行字符串的连接,将比String更加节约内容,经常应用于数据库SQL语句的连接。
b、deleteCharAt方法
public StringBuffer deleteCharAt(int index)
该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“KMing”);
sb. deleteCharAt(1);
该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变 为”King”。
还存在一个功能类似的delete方法:
public StringBuffer delete(int start,int end)
该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb. delete (1,4);
该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。
c、insert方法
public StringBuffer insert(int offset, boolean b),
该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“TestString”);
sb.insert(4,false);
该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
d、reverse方法
public StringBuffer reverse()
该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
StringBuffer sb = new StringBuffer(“abc”);
sb.reverse();
经过反转以后,对象sb中的内容将变为”cba”。
Stringbuilder常用方法
一、创建Stringbuilder对象
StringBuilder strB = new StringBuilder();
1、append(String str)/append(Char c):字符串连接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"
2、toString():返回一个与构建起或缓冲器内容相同的字符串
System.out.println("String:"+strB.toString());
//return "String:ch111c"
3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this
System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));
//return "StringBuilder.appendCodePoint:ch111c"
集合框架总结
list
-
ArrayList数组列表
ArrayList实现了可变的数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问。缺点是向指定的索引位置插入或删除对象的速度较慢。
-
LinkedList双向链表(JDK1.6之前循环链表,1.7以后取消了循环。)
LinkedList类采用链表结构保存对象,这种结构的优点是便于向集合中插入和删除对象,但对于随机访问集合中的对象效率较低。
Arraylist与Linkedlist异同:
Arraylist与Linkedlist都是不同步的,也就是不保证线程安全。
Arraylist 底层使用的是Object数组,适用于快速随机访问;LinkedList 底层使用的是双向链表数据结构,适用于元素插入删除。
set (没有重复元素的集合)
-
HashSet(无序,唯一)
HashSet类实现set接口,由哈希表支持(实际上是一个HashMap实例)支持。它不保证Set的迭代顺序,set集合元素允许为null。HashSet是无序的,不能保证取出顺序就是放置顺序;
-
TreeSet(有序,唯一)自然顺序递增排序
TreeSet类实现了Set接口,遍历集合时可以按自然顺序递增排序,排序是由红黑树完成的。
Map
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value集合。
-
HashMapHashMap类**是基于哈希表的Map接口的实现,允许null值和null键,但必须保证键的唯一性。此类不保证映射的顺序,特别是不保证该顺序恒久不变
HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap的实现方式是数组链,不同的对象根据其哈希码(hashCode方法的返回值)找到对应的数组下标,然后存入数组。
-
TreeMapTreeMap集合中的映射关系是有序的,不允许键对象是null
HashMap 是非线程安全的,HashTable 是线程安全的,他们创建时容量初始值不同,且HashMap允许null键和null值
-
HashTable
HashMap 是非线程安全的,HashTable 是线程安全的,他们创建时容量初始值不同,且HashMap允许null键和null值
Iterator和ListIterator之间的区别
Iterator认为是在两个元素之间,当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用
- 我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。
- Iterator只可以向前遍历,而LIstIterator可以双向遍历。
- ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。
多线程的实现方式有几种
-
继承Thread类 (单)
-
实现runnable接口 (单)
-
实现callable接口通过FutureTask包装器来创建Thread线程
-
通过线程池创建线程 ,使用线程池接口ExcutorService结合Callable、Future实现有返回结果的多线程 (多) 禁止的原因:
线程参数
spring的循环依赖是怎么解决的
三级缓存
-
一级缓存 ,实例化、初始化都完成的map
-
二级缓存 , 实例化完成未初始化完成的map
-
三级缓存 ,比较特别相当于一个对象工厂的map
dI (DEpendency Injection)
即依赖注入,依赖指的是Bean对象的创建依赖于容器,是Bean对象的依赖资源
实现DI的方式
-
构造器注入
-
set注入
-
p命名和c命名注入
IOC
**控制反转,其实是对这种依赖注入的一种具体实现 **
IOC的作用
-
管理对象的创建和依赖关系的维护。(对象的创建并不是一件简单的事,在对象关系复杂时,如果依需要程序员来维护数相当的头疼。)
-
解耦,由容器去维护具体的对象
-
托管了类的产生过程,
Spring框架中都用到了哪些设计模式?
1.工厂模式: BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
2.单例模式: Bean默认为单例模式。
3.代理模式: Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
4.模板方法:用来解决代码重复的问题。比如. RestTemplate,JmsTemplate,JpaTemplate。
5.观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现-ApplicationListener。
springMVC从前段请求到后端的响应
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;!
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4) DispatcherServlet调用HandlerAdapter处理器适配器;↓
(5)HandlerAdapter经过适配调用具体处理器(Handler,也叫后端控制器);!
(6)Handler执行完成返回ModelAndView;!
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8) DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;!
(9)ViewResolver解析后返回具体View;
(10) DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)↓
(11) DispatcherServlet响应用户。
SpringCloud组件常用
- Spring Cloud Eureka(现在闭源了)︰服务注册与发现 同行 还有zookeeper consul
2.Spring Cloud Zuul (gateway):服务网关
3.Spring Cloud Ribbon:客户端负载均衡
4.Spring Cloud Feign:声明性的Web服务客户端
5.Spring Cloud Hystrix:断路器
6.Spring Cloud Config:分布式统一配置管理




浙公网安备 33010602011771号