java基础面试题

2020-10-10 16:21:14 浏览数 (1)

1. == 和 equials 的区别

== 值得是空间引用的地址相同 equials 比较的是内容的值

2. 堆和栈

堆中存放的是对象或者数组或者方法,每次创建一个对象或者数组就会在堆开辟一块位置存放,而这个位置会有一个路径,这个指向的路径存在在栈中 栈中存放的是实例对象或者方法的引用名称

比如我创建一个String str = “abc”,首先回去寻找有没有指向abc的路径,如果没有,就在堆中创建一个内存存放abc ,而存放str的是栈

3. String ,Stringbuilder StringBuffer

String是常量,创建后不能被更改不可以被继承,但是可以通过创建StringBuffer或者是StringBuilder对象 进行更改

StringBuffer是线程安全的 StringBuilder 线程不安全的操作效率高

4.ArrayList 和LinkedList
  1. 都是实现了List接口
  2. ArrayList是动态添加数组,get和set效率高,但是指定位置或者删除效率低
  3. LinkedList 链表式数组,基于指针操作,新增和删除效率高,但是占用内存大
5. 静态数据 静态块 成员变量 构造方法 父子类执行先后顺序

父类静态变量 父类静态代码块 子类静态变量 子类静态块 父类成员变量 父类构造方法 子类成员变量 子类构造方法

6. Map的实现类有哪些各有什么特性
  1. hashMap 线程不安全 数组链表机构
  2. TreeMap和LinkedHashMap 是有序的
7. 抽象类和接口的异同
  1. 接口和抽象类都不可实例化,必须要继承和实现
  2. 接口只能做方法的声明,抽象类可以声明也可以方法实现
  3. 接口定义的常量只能是公共的静态常量,抽象类的是普通变量
8. 三种单利模式
  1. 懒汉单例
代码语言:javascript复制
public class Singleton {
    private statisc Singleton singletion ;
    
    pubiic Singleton (){
        
    }
    
    public Singleton getInstance(){
        singleton =new Singleton ();
        return singleton;
    }
    
}
  1. 饿汉单例
代码语言:javascript复制
public class Singleton {
    private statisc Singleton singletion = new Singleton();
    
    pubiic Singleton (){
        
    }
    
    public Singleton getInstance(){
        return singleton;
    }
    
}
  1. 双重校验锁
代码语言:javascript复制
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类型
代码语言:javascript复制
@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种设计默认

  • 单例模式
  • 工程模式
  • 抽象工厂模式
  • 建造模式

0 人点赞