JavaSe
面向对象
- Java对象创建的流程步骤,和方法
- 怎样唯一确定一个类?如果两个类的全限定名相同怎么办?
- 为什么要有封装类
- static和final区别。
- static表示属于类,只有一个
- static修饰的字段什么时候初始化,放在哪
- 对于static变量的理解,有什么用
- static变量分配内存的时候发生在哪个环节?
- static加在类上和不加区别,除了修饰类、属性、方法还有吗? 代码块
- 写一个static main方法,能调用非静态方法吗?如果要调用要怎么调用?为什么不能不创建对象调用?
- 实例化:
- class B {
- static B t1 = new B();
- static B t2 = new B();
- {
- System.out.println("代码块");
- }
- static {
- System.out.println("静态块");
- }
- }
- public class Main {
- public static void main(String[] args) throws Exception {
- B b = new B();
- }
- }
- //输出什么
复制代码
- 重载的重写的区别
- 多态用在哪里,有什么用处。
- final
- final修饰变量和静态变量在哪里可以赋值
- final修饰类、方法(重写)、字段、对象的作用,fin al修饰一个对象是什么不变。
- final可以修饰接口吗。不可
- final修饰变量 不能改写 修饰list集合,可以加数据吗
- 继承:Java支持多继承吗?从开发的角度说一下为什么不支持多继承
- 接口和抽象类的区别?应用场景?
- 普通类和抽象类区别,可以被new吗
- 抽象类可以实现接口吗 -- 可以
- 两者是否可以实例化
- set接口可以定义私有成员变量吗
- 接口:多继承
- Java权限修饰符
- 面向对象的三个特性
- 和面向过程编程有什么区别?
- 什么是结构化编程、面向对象编程以及函数式编程?
- Object 类有什么方法--举出常用方法
- == 和equals的区别
- equals是判断引用是否一样。看是否重写。
- String类里面的equals方法实现看过吗,源码解析
- 自己实现equals要注意什么
- finalize方法
- hashcode方法
- 浅拷贝和深拷贝的区别,深拷贝怎么实现,引用拷贝。
- 深拷贝会在堆上创建一个新的对象。
- 引用类型在浅克隆后,要对引用的变量再进行嵌套克隆。
- 可以看javaguide,引用/浅拷贝/深拷贝的区别
- 浅拷贝
- Object[] o, 可以存放各种类型的数据,底层怎么存放的
- 内部类--了解即可:
常用工具类String-Arrays
java原生类中用的最多的类
- Arrays类(工具类),常用方法
- String类
- 常用方法和构造,valueOf
- java7 String 存储结构和API 变更
- string为什么设计成不可变,好处
- private且final无法继承。
- java的string类的设计思想,jdk1.9前后区别。
- 底层char / byte,在 Java 9 之后,String 类的实现改用 byte 数组存储字符串
- 解释
- 换成不定长的存储数组会有什么问题, "12我是"12占用两个字节,我是占用应该是6个字节,这样存在什么问题。
- string为什么不能是基本数据类型
- String直接赋值 stringpoll 和 new一个对象的区别。
- String str = new String("abc") 创建字符串对象 --这里涉及两个对象
- new String("a") + new String("b") 涉及几个对象
- String a = "a", String b = new String(a + "b"); 创建了几个对象
- String str = "i"; String str2 = new String("i") 一样吗
- 字符串常量池
- 字面量,字面量是对象吗,能调用方法吗
- 如何设置大小
- intern( )方法, 见JVM
- 内存位置在哪
- 方法区-元空间- 本地内存
- 探秘位置在哪 -- 真正意义上字符串常量池在堆中存储,元空间可能有引用堆中字符串常量,运行时常量池在方法区中
- 优化常量池的方法
- StringBuffer(synchronized)和StringBuilder的区别和String的区别
- StringBuilder的方法
- StringBuffer和StringBuilder是如何实现可变的呢?底层原理是什么?如何优化
- 如果让你来实现StringBuffer和StringBuilder,你会怎么实现?
复制代码- String的+=和stringBuilder哪个性能高?面试官答其实差不多,+=在一行的时候会隐性转换为stringbuilder
- 基本数据类型和包装类
- String是什么类型
- 基本数据类型介绍
- 基本类型几种,分别占用空间
- 成员变量没有手动赋值,系统会默认赋值(局部变量不会)
- 除了基本数据类型,数组存放的都是对象的引用地址
- 包装类,为什么要包装类
- 包装类常量池
- int和Integer区别,int有几个字节
- Integer的构造方法。
- Int i =1 和 integer i=1存储区别
- 如何声明一个int的List(不能,只能声明Integer的List)
- Integer是线程安全的吗,哪些类是线程安全的
- 给Integer最大值+1结果
- String int Integer直接相互转换 : 静态方法
- Long 缓存池,包装类
- switch可以放哪些类型
- String / int, 但byte,short,char自动转成int
- 方法参数传递:JAVA中值传递还是引用传递
- DateFormat
- java中浮点数精度怎么解决,有了解过实现吗,为什么有精度问题
- 判断BigDecimal是否相等
- 如何进行计算、怎么四舍五入
- 常量池和包装类的缓存
- 为什么有常量池,思想
- 分类,两类。
- 包装类和常量池的区别
异常:
- 基本介绍
- exception和error区别
- 异常继承的根类
- Exception有哪些,从上往下说说看
- 编译期异常和非编译期异常区别
- 异常的本质是什么,发生在什么时候
- 编译异常:
- 运行时异常:
- 遇到过哪些异常,(空指针在哪遇到了、SQL 异常、类型转换异常)
- 谈谈 Java 异常处理机制,异常处理的两种方式:
- throws的作用
- try/catch机制
- try finally不用catch行吗
- finally一种情况下不会执行
- 为什么有些异常需要捕获try catch,有些直接往上抛就可以,面试官提示了一下编译那一块
- final/finally/finalize
- 如何自定义异常
集合框架:
- 介绍Java集合(容器),什么是集合存什么
- 几个常用的数据结构的底层原理
- 介绍Java里面常见的集合、整体框架,父接口
- 如何升级成线程安全的容器--Collections
- 两个大的父类
- Collection接口
- 继承了哪个接口:
- 哪些继承了Collection,特点和函数
- 常用方法方法:add clear remove toArray()
- Collection集合的输出方式
- 简单讲讲List和Set的区别(都是接口),都继承了哪个接口,Map继承了上述接口吗
- List, Set, Queue, Map 四者的区别
- Collections 和 Collection
List:
- List集合的特有方法(List是接口)
- ArrayList和LinkedList
- 区别,底层结构,优缺点和使用场景
- ArrayList:
- 惰性初始化,构造方法
- arraylist扩容机制(初始容量,为啥扩容是1.5),底层arraycopy函数,删除和加入代价都很大
- 一个关于ArrayList扩容的场景题优化扩容,让自己设计增强类去实现。
- 为什么可以随机读取,
- 应用:
- ArrayList中删除偶数,不能用remove
- 多线程往ArrayList中写10万条数据,会出现什么问题
- ArrayList一边遍历一边删除的时候怎么做,remove
- 写时复制并发安全CopyOnWriteArrayList
- 写入操作的实现,不适用于哪种场景。参考
- Collections/vector
- LinkedList
- LinkedList为什么是双端链表
- 分别分析一下插入、删除、查找的时间复杂度
- 可以通过什么数据结构来加快LinkedList的访问
- ArrayList和linkedlist的多线程问题如何解决
- 数组和List的转换方法有哪些
- Vector ,扩容
Map:
- 集合关系(Collection和Map)
- Map集合的体系特点。
- map集合下常用的子类有哪些/实现类
- 常用的api
- Map集合的遍历方式:有几种,效率
- HashMap集合
- 源码
- key如何保证唯一
- 底层结构-哈希表优点
- Node是什么,里面存了什么东西,hashMap底层是什么数组
- contains方法底层用的什么,原理
- hashCode()和equals()有什么作用、区别。
- key通过hashCode得到hash值(怎么算的,为什么要扰动),怎么到下标-长度,hashMap数组长为什么是2的整数幂
- equals的作用,不重复equals比对象的key,什么时候调用。
- 什么时候要重写hashcode和equals
- 不重写hashcode的后果,以hashSet/hashMap为例。重写equals必须重写hashcode
- map中的key如果是对象并且是我们自己声明需要注意什么
- hash碰撞的解决方法,分为开放地址(线性-平方)和链地址法,各自的场景,一致性hash
- 1.8之前为什么这么设置,解决hash冲突有别的办法吗
- 数组初始容量,为什么负载因子是0.75 ,怎么扩容
- 成员属性:
- 1.8之后:为什么引入红黑树(为什么不用avl树,而不是BST、B+、堆等等)? 红黑树自旋条件,平衡自旋怎么做的复杂度多少? 红黑树的性质、红黑树如何调节平衡
- 什么时候转红黑树,为什么红黑树阈值是8,不是6或者10
- 红黑树会退化成链表吗,什么时候
- 转红黑树的数组最小长度(64)见源码,先扩展数组,resize()为短链表
- 成员方法:
- 1.8的三个优化:红黑树,尾插,插入扩容逻辑还有位置
- Put操作流程,源码
- Key冲突的是怎么处理的,如何判断是覆盖还是加数据
- 插入还要看是链表还是红黑树
- JDK1.7 冲突的时候为什么采用头插法,有什么缺点(循环链表),头插法和尾插法的区别,扩容
- 扩容机制的区别,前扩容和后扩容
- 并发异常
- java的hashmap的fastfail机制。
- 为什么不是线程安全的。它在什么情况下会出现线程不安全的问题,不安全情况下会出现什么现象?说一下场景
- 平时使用hashmap要关注那些方面的东西
- 有措施能让Hashmap变得线程安全吗?
- ConcrrentHashmap,Hashtable,Collections.synchronizedMap
- hashmap和treemap有什么区别,什么时候用?
- concurrentHashmap
Set:
- HashSet: hashset是怎么基于hashmap实现的。
- 如果自己什么设计
- 如何去重:
- hashcode比较和equals比较
- 一个自定义的对象的话,那我这个对象应该是有什么动作吗
- LinkedHashSet为什么有序:
- HashSet和TreeSet有什么区别?
- 集合是如何排序的
- 如果传入TreeMap的key值是对象,那么对象应该满足什么条件
- 为对象的类//用的集合设置比较器,实现Comparable接口,重写compareTo方法。
- 比较器底层原理Comparator,比较器类
- 代码如何写
- treeSet和treeMap的关系
Queue
泛型
<ul>什么时候起作用
使用泛型有什么好处 ,理解和应用场景
类方法接口
通配符
<ul>泛型中如何确定上下限( |