凌乱的面试题小结——回头汇总整理


java基础

封装继承多态

封装

高内聚,低耦合,不允许外部干涉,仅暴露少量的方法给外部使用,属性私有 get/set(set可加安全的验证--及一些条件的判断)

封装的意义

  1. 提高程序的安全性,保护数据
  2. 隐藏代码实现细节
  3. 统一接口
  4. 系统可维护增加

继承

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

只有单继承,没有多继承

继承是类和类之间的关系,extends

私有的无法被继承

super注意点

  1. super调用父类的构造方法,必须在构造方法的第一个
  2. super必须只能出现在子类的方法或者构造方法中
  3. super和this不能同时调用构造方法

多态

多态是方法的多态,属性没有多态

父类和子类,有联系

存在的条件:继承关系,方法重写、父类引用指向子类对象

子类转换为父类,向上转型

父类转换成子类,向下转型:强制转换

方便方法的调用,减少重复的代码,提高利用率

实现多态方式:

1.接口多态性。
2.继承多态性。
3.通过抽象类实现的多态性。

抽象类和接口的异同

区别

  1. 抽象类可以用构造方法,接口不能有构造方法
  2. 抽象类可以有普通成员变量,接口不可以
  3. 抽象类可以包含非抽象的普通方法(抽象方法abstract修饰,没有方法体,有方法体的即非抽象方法),接口方法必须都是抽象(默认public abstract修饰了)
  4. 抽象类可以包含静态方法,接口不能
  5. 一个类可以实现多个接口,只能继承一个抽象类

相同

  • 都不能被实例化
  • 都可以包含声明方法
  • 派生类必须实现未实现的方法
    抽象类

    接口 对比

string 、stringbuffer、StringBuilder三者区别

StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,StringBuffer、StringBuilder、可变长

  1. 在执行速度方面的比较:StringBuilder > StringBuffer

  2. 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时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用

  1. 我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。
  2. Iterator只可以向前遍历,而LIstIterator可以双向遍历。
  3. ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、获取前面或后面元素的索引位置。

多线程的实现方式有几种

  1. 继承Thread类 (单)

  2. 实现runnable接口 (单)

  3. 实现callable接口通过FutureTask包装器来创建Thread线程

  4. 通过线程池创建线程 ,使用线程池接口ExcutorService结合Callable、Future实现有返回结果的多线程 (多) 禁止的原因:

    线程参数

    spring的循环依赖是怎么解决的

    三级缓存

  5. 一级缓存 ,实例化、初始化都完成的map

  6. 二级缓存 , 实例化完成未初始化完成的map

  7. 三级缓存 ,比较特别相当于一个对象工厂的map

dI (DEpendency Injection)

即依赖注入,依赖指的是Bean对象的创建依赖于容器,是Bean对象的依赖资源

实现DI的方式

  1. 构造器注入

  2. set注入

  3. p命名和c命名注入

IOC

**控制反转,其实是对这种依赖注入的一种具体实现 **

IOC的作用

  1. 管理对象的创建和依赖关系的维护。(对象的创建并不是一件简单的事,在对象关系复杂时,如果依需要程序员来维护数相当的头疼。)

  2. 解耦,由容器去维护具体的对象

  3. 托管了类的产生过程,

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组件常用

  1. 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:分布式统一配置管理
posted @ 2021-03-09 17:16  仅此忆念  阅读(50)  评论(0)    收藏  举报