1. == 和 equials 的区别
== 值得是空间引用的地址相同 equials 比较的是内容的值
2. 堆和栈
堆中存放的是对象或者数组或者方法,每次创建一个对象或者数组就会在堆开辟一块位置存放,而这个位置会有一个路径,这个指向的路径存在在栈中 栈中存放的是实例对象或者方法的引用名称
比如我创建一个String str = “abc”,首先回去寻找有没有指向abc的路径,如果没有,就在堆中创建一个内存存放abc ,而存放str的是栈
3. String ,Stringbuilder StringBuffer
String是常量,创建后不能被更改不可以被继承,但是可以通过创建StringBuffer或者是StringBuilder对象 进行更改
StringBuffer是线程安全的 StringBuilder 线程不安全的操作效率高
4.ArrayList 和LinkedList
- 都是实现了List接口
- ArrayList是动态添加数组,get和set效率高,但是指定位置或者删除效率低
- LinkedList 链表式数组,基于指针操作,新增和删除效率高,但是占用内存大
5. 静态数据 静态块 成员变量 构造方法 父子类执行先后顺序
父类静态变量 父类静态代码块 子类静态变量 子类静态块 父类成员变量 父类构造方法 子类成员变量 子类构造方法
6. Map的实现类有哪些各有什么特性
- hashMap 线程不安全 数组链表机构
- TreeMap和LinkedHashMap 是有序的
7. 抽象类和接口的异同
- 接口和抽象类都不可实例化,必须要继承和实现
- 接口只能做方法的声明,抽象类可以声明也可以方法实现
- 接口定义的常量只能是公共的静态常量,抽象类的是普通变量
8. 三种单利模式
- 懒汉单例
public class Singleton {
private statisc Singleton singletion ;
pubiic Singleton (){
}
public Singleton getInstance(){
singleton =new Singleton ();
return singleton;
}
}
- 饿汉单例
public class Singleton {
private statisc Singleton singletion = new Singleton();
pubiic Singleton (){
}
public Singleton getInstance(){
return singleton;
}
}
- 双重校验锁
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
JVM
1. JVM调优
jvm自带了很多监控工具 都是位于JDK的bin目录 ,其中最常用的是jconsole 和 jvisualvm这两款视图监视工具
- jconsole:用于对jvm内存、线程和类的监控
- jvisualvm:分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存变化等、gc变化
2.jvm常见的调优参数
- Xms2g :初始化堆内存为 2G
- Xmx2g: 堆最大内存为2g
- XX:NewRatio =4 设置新生代和老年代的比例为1:4
- XX: UseParNewGC 指定使用parNew和 Serial Old 垃圾回收器组合
- XX:UseParalleOldGC 指定使用parNew parOld垃圾回收器组合
- XX: PrintGC 开启打印GC回收日志
- XX: PrintGCDetails 打印GC详细日志
3. jvm垃圾回收算法
- 标记清理算法
- 标记整理算法
- 复制算法
- 分代算法
4. 垃圾回收期分类
- 新生代回收器:Serial、ParNew、Parallel Scavenge
- 老年代回收器:Serial Old、Parallel Old、CMS
- 整堆回收器:G1
新生代垃圾回收器一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收。
5. JVM组成部分
- 类加载器
- 运行时数据区
- 执行引擎
- 本地库接口
运行流程: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载到内存中,而字节码文件只是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
SpringCloud
微服务的优点
- 专一性,每一个服务只做一件事,开发效率高
- 支持多种语言编程 面向接口编程
- 可以灵活搭配,连接公共库,连接独立库
微服务的缺点
- 分布式系统的责任大
- 部署维护,成本大 相对比较复杂
springclound和dubbo的区别
- 服务的调用方式不同 dubbo的是RPC,springcloud是Rest Api
- 注册中心 dubbo的是zookeeper 后者是eureke 或者zookeeper
- 服务网关 dubbo需要第三方的 后者有Zuul路由网关
微服务之间的通讯
- 远程调用
- 消息服务器
jdk 1.8 新特性
lambda表达式
前置 | 语法 |
---|---|
无参无返回值 | ()->System.out.println(“test”) |
一个参数无返回值 | (x)->System.out.println(x) |
仅有一个参数无返回值 | x->System.out.println(x) |
多个参数有返回值有多条lambda表达式 | (x,y)->{System.out.print(x);return x,y} |
多个参数有返回值,只有一条lambda表达式 | (X,y)->xxx |
stream API
函数式接口
- Consumer:消费型接口,有参无返回值
- Supplier:供给型接口,无参有返回值
- Function<T,R>:函数式接口,有参有返回值
- Predicate : 断言型接口,有参有返回值,返回值是boolean类型
@Test
public void test(){
changeStr("hello",(str) -> System.out.println(str));
}
/**
* Consumer<T> 消费型接口
* @param str
* @param con
*/
public void changeStr(String str, Consumer<String> con){
con.accept(str);
}
@Test
public void test2(){
String value = getValue(() -> "hello");
System.out.println(value);
}
/**
* Supplier<T> 供给型接口
* @param sup
* @return
*/
public String getValue(Supplier<String> sup){
return sup.get();
}
@Test
public void test3(){
Long result = changeNum(100L, (x) -> x 200L);
System.out.println(result);
}
/**
* Function<T,R> 函数式接口
* @param num
* @param fun
* @return
*/
public Long changeNum(Long num, Function<Long, Long> fun){
return fun.apply(num);
}
public void test4(){
boolean result = changeBoolean("hello", (str) -> str.length() > 5);
System.out.println(result);
}
/**
* Predicate<T> 断言型接口
* @param str
* @param pre
* @return
*/
public boolean changeBoolean(String str, Predicate<String> pre){
return pre.test(str);
}
- 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期的API I LocalDate | LocalTime | LocalDateTime
常见的设计模式
总共有23种设计默认
- 单例模式
- 工程模式
- 抽象工厂模式
- 建造模式