对面向对象的理解:
面向对象是Java中的一种编程思想,规定设计了对象的创建 实现,方法的生成 属性的赋值等实现过程及原理
面向对象的三大特征:封装 继承 多态
1、JDK JRE JVM分别是什么?以及他们之间的关系
JDK全程是java development kit,是Java中常用的工具包,有多个版本,版本之间功能不同,主要是程序开发人员使用
JRE全称是java runtime environment,是运行java程序 主要是java程序使用的使用
JVM:JVM虚拟机
JRE=JVM+类库
JDK=JRE+JAVA工具类
2、JDK1.8和1.8之后的区别:
1.8之前 接口只能定义静态常量和抽象方法
1.8之后 接口可以有默认方法和静态方法
如何使用:
静态常量和静态方法:通过接口名使用
默认方法:有实现类调用
3、 接口和抽象类的区别:
语法区别:抽象类不一定要有抽象方法,但有抽象方法的类一定是抽象类
功能区别:jdk1.8之前,接口只能定义抽象方法和静态常量
4、final、finally,以及finalize的区别:
final的意思为最终,被它修饰的类不能被继承,被它修饰的方法不能被重写,被他修饰的常量需要有初始值才能被调用,且只能调用一次;
finally一般用在抓取异常中try...chah...,在它的代码块内的代码可以被执行
finalize一般用在是在Object中定义的方法,垃圾回收器在将对象从堆内存中回收之前,会调用对象的finalize方法
5、局部变量和成员变量的区别:
定义位置:局部变量在方法内定义,成员变量在类中定义
作用范围不同:局部变量只能在本方法内使用,而成员变量则分为静态成员变量和非静态成员变量,静态成员可以在所有方法中使用,而非静态成员之能在非静态方法中使用
默认值不同:局部变量有默认值,基本类型为0,
成员变量无默认值,需要手动赋值
生命周期不同:局部变量随着方法入栈而生成,随着方法的出栈而销毁
成员变量随着类的加载而加载 随着类的销毁而销毁
非静态成员变量随着对象的创建而生成,随着对象被回收而销毁
6、值传递和引用传递的区别
值传递:方法被调用时,将实参传递给形参
值传递:基本数据类型存储的是数值本身
引用传递:引用数据类型存储的是对象的地址值
7、==号和equals的区别:
==:如果比较基本数据类型,则是比较数据本身 如果比较的是引用数据类型,则比对的是它的地址值
equals:是Object类中的方法,是一个运算符 用来比较变量的内容是否相同
该方法默认实现的是当前对象和传进来的对象是否指向同一个对象
8、hashcode和equals的区别:
相同点:都是Object类中的方法
不同点:equals比对的是对象地址值是否一样
hashcode是基于native方法实现的,底层是通过hash函数返回一个hash值;
注意:该问题通常会结合HashSet和HashMap为何要要求元素重写hashCode和equals方法
9、重载和重写的区别:
重载:在一个类中定义多个方法名相同,参数列表不同的方法,目的是方便调用,并且可以达到调用区分
重写:子类声明父类的方法名,形参列表相同,返回值类型如果是引用类型,可以是父类方法和返回值的子类类型 返回值如果是基本类型 必须子父类保持一致。
访问权限修饰符:子类方法 >=父类方法
异常抛出声明:抛出异常可以是父类异常的子类异常
private修饰的方法无法被重写
10、java数据类型一共几种:
基本数据类型:整数类: byte short int long
浮点数:float double
字符:char
布尔:boolean
引用数据类型:类 接口 数组 注解
11、包装类和基本数据类型的区别:
包装类就是对基本数据类型的封装
11、为什么要提供包装类?
作用:方便操作 提供了基本数据类型对应的最大值、最小值等属性,及相关方法
12、包装类和基础类型怎么转换?
1、基本类型转化为包装类型--->装箱 格式:包装类.valueOf(基本类型);
2、包装类型转化为基本类型--->拆箱 格式:对象.xxValue();
3、jdk1.5后提供了自动拆箱和自动装箱
13、 构造器代码块、局部代码块、静态代码块执⾏顺序和执⾏次数?
执行顺序:
静态代码块:当类加载时执行 如果类中有多个静态代码块,则按顺序执行
构造器代码块:对象被创建之前执行,优先于构造方法,如有多个按顺序执行
局部代码块:当方法执行的时候执行,如果方法中有多个 则按顺序执行
执行次数:
静态代码块:一次
构造代码块:每次创建对象都会执行
局部代码块:每次调用方法都会执行
14、构造代码块的作用:
可以把所有构造代码块公共的代码放在构造代码块中
匿名内部类的初始化操作,匿名内部类没有明显的构造方法
15、Integer String 是否可以被继承?为什么?
不可以 因为public final class Integer extends Number ,被final就是的
16、Integer缓存区间?什么时候触发缓存区间?
[-128,127]范围的Integer实例
基本数据类型转化为包装类型的时候,如果基本数据类型范围[-128,127]从数组中返回Integer实例,否则创建Integer实例
17、String str = "abc" 和 String str = new String("abc")区别?
String str = "abc" 如果常量池中没有”abc“ 则在常量池中创建 str 指向常量池的”abc“
String str = new String("abc")
如果常量池中没有”abc“ 则创建;在堆中创建对象 将参数”abc“复制到堆中 str指向队中对象
18:String、StringBuffer、StringBuilder区别?是否线程安全?怎么做的到线程安全?
String 底层维护的是char[ ]数组,用final修饰,无法赋值,String中的方法,替换,拼接 分割都是返回一个新的字符串,是不可变的字符串,线程安全
StringBuffer StringBuilder 底层同样维护的是char[ ]数组,没有使用final修饰,方法都是远在对象字符数组的基础上进行操作,不会产生新的对象
StringBuffer 的所有方法上有加的synchronized进行修饰 线程安全
StringBuilder 线程不安全
使用场景:如果不经常使用字符串拼接 使用string
如果有拼接字符串的需求,没有线程安全需求的 用Builder 否则用Buffer
19、包装类型 Math String类的常用方法有那些?
包装类:常用方法有两大类 1.将包装类转为基本类型数据 2.将字符串转为基本类型数据
包装类转基本类型数据的方法有XXXValue()/如 intValue();而字符串转基本类型数据有
Integer.parseInt(String s) 将字符串转int
Math常用方法有:
取绝对值:Math.abs
向上取整:Math.ceil/向下取整Math.floor
取最大值Math.max/取最小值Math.min
返回大于等于0.0小于1.0的随机小数Math.random
20、Comparable 和Comparator的区别,分别说出使⽤场景?
Comparable自然排序,排序逻辑写在需要排序的类上,该类要实现Comparable接口,重写int compareTo(E o1)方法
Comparator比较器排序,排序逻辑在另一个类中实现,重写int comparable(E o1,E o2) 方法
使用场景:TreeSet、Collections.sort(List<E> list)、Collections.sort(List<E> list,Comparator<E> comparator)
21、JDK1.8之后有哪些新特性?
lambda表达式
stream
接口增强
并行数组排序
Optional
可重复注解
新的时间和日期API
22、Java中深克隆和浅克隆的区别?怎么实现?
浅克隆,对当前对象进行克隆,并克隆该对象所包含的8种基本数据类型和String类型属性,如果该对象中有除8种基本数据类型以外的数据类型 或String类型属性以外的属性,那么不能克隆
深克隆,深克隆是在浅克隆的基础上,递归地克隆除8种基本数据类型和String类型属性以外的数据。即为这些属性重新分配内存而非引用原来对象中的属性
特点:被克隆的对象的类应实现 Cloneable 接口,并重写 clone() 方法
23、Object类和范型的区别,说出范型的执⾏机制,为什么要使⽤范型?
编译时自动检查类型安全。如果使用Object类的话,你没法保证返回的类型一定是String,也许是其它类型。这时你就会在运行时得到一个类型转换异常
24、 Error 和Exception 有什么区别?
1、从继承体系来看,Error和Exception都是Throwable的子类、
2、从功能来说 Error是程序无法处理的异常,Exception出现的异常可以被处理
25、什么是反射?
在运行状态中。对于任意一个类,能够调用它的任意属性和方法 对任意一个对象,都能够调用它的任意属性和方法,这种动态获取信息及动态调用对象的功能就是反射机制
简单理解:
利用反射可以无视就是符,获取类里面所有属性和方法
动态获取配置文件信息,通过反射撞见对象调用方法
26、设计模式
创建型模式:提供了对象创建过程中的各种问题的解决办法 有 单例模式 抽象工厂模式 原型模式 构建这模式 工厂方法模式
结构性模式:对类在设计上总结,比较关注类继承 组合关系 有代理模式(静态代理 动态代理) 适配器模式 桥接模式
行为型模式:对象直接的交互和职责划分总结 包括 观察者模式 模板模式 策略模式 职责模式 迭代器模式 状态模式 访问者模式
27、java中常用的容器有哪些?
Collection 包含 Queue
1、List : Vector---->Stack Arrarylist linekdList
2、Set : HashSet TreeSet
3、Queue: PriorityQueue ArrayDeque LinekdList
Map
HashMap TreeMap HashTable
28、Collection和Collections的区别?
Collection
1、是集合的顶级接口,定义了集合中统一的接口方法
2、Collection接口有很多常用的实现类
3、Collection的意义是为了具体的集合提供了最大化的统一操作方法
4、其直接继承的接口有List和Set及Queue
Collections
1、集合的工具类
2、提供了很多静态方法用于对集合元素进行排序,搜索及线程安全等操作
29、HashMap是线程安全的吗? 如何得到一个线程安全的Map? 什么是哈希值?
1、HashMap底层时Hash表,无序 不可重复 存取不一致 无索引,索引不能通过索引操作元素,
2、线程不安全,底层是”数组+链表+红黑树“,多线程添加元素时,会导致元素覆盖,所以我们想要得到一个线程安全的HashMap就需要使用ConcurrentHashMap,它通过对桶进行加锁的方式,以较小的性能来保证线程的安全。
哈希值是JDK根据对象地址,或者属性值,计算出来int类型的值
Object类中的hashcode方法,根据对象的地址来计算哈希值并返回
对象哈希值的特点:
1、如果我们没有重写hashcode方法,则根据对象的地址值来计算哈希值,如果重写了hashcode的方法,则根据属性值来计算哈希值
30、List和Set的区别?
List 和Set继承Collection的接口
list:有序 有索引 可重复 有两个实现类 ArrayList 和LinkedList
ArrayList:可变数组 可保存所有元素,查询快 增删慢
LinkedList:采用链表结构保存对象,查询慢 增删快
Set:无序 无索引 不可重复 常用的实现类是 HashSet和TreeSet
HashSet:底层是HshMap实现的 hashSet的元素储存在HashMap的key ,它的值Value统一采用private static final Object PRESENT = new Object();
31、HashMap 和Hashtable 的区别?
HashMap:hashmap基于哈希表的Map接口实现的 允许有null值 hashtable不允许
hashtable是线程安全的 hashmap是线程不安全的
32、如何实现数组和List的之间的转化?
1、List转化为数组 toArray()T[ ]
2、数组转化为List Arrays.asList(T...t) List<T>
33、ArrayList和Vector的区别?
1、他们底层都是基于数组实现的
2、线程安全: Vector是线程安全(synchronized)
ArrayList不是
如果需要一个线程安全的ArrayList,一般推荐CopyOnWriteArrayList
3、扩容:ArrayList扩容1.5倍 Vector默认扩容2倍
34、Iterator和ListIterator的区别?
1、Iterator和ListIterator都是迭代器接口,不同的集合有不同的实现 ListIterator是Iterator的子接口
2、Iterator可以遍历List也可以遍历Set,因为List和Set接口中都有
3、ListIterator不能遍历Set 只有List接口中有
4、ListIterator只能向后遍历(hashNext,next),ListIterator不仅可以向后遍历,还可以向前遍历
5、Iterator中对集合元素的操作只有删除,ListIterator提供了获取前一个元素索引,后一个元素索引,添加元素,替换元素等方法
35、HashMap底层数据结构是什么?1.7和1.8有什么区别?
HashMap底层是Hash表结构,
1、1.7是数组加链表的形式 而1.8是在之前的基础上加上了红黑树
36、HashMap链表什么时候转化为红黑树?
1、如果链表中存储的元素很多,在进行存储和查找的时候效率比较低
2、对数组进行扩容时
3、数组扩容有可能解决不了问题 极端情况:如果存入的元素hashcode的值都是一样,元素的同索引一样;变成红黑树
数组长度大于等于64,并且链表长度超树化阈值8
37、HashMap存储元素的流程?
1、当使用put方法存储key value数据
2、首先会获取key的hashCode
3、对hashcode进行二次hash
4、对hash值取模数组的长度,得到数组索引(桶下标)
5、将key value存入到指定索引的链表或者红黑树中
38、HashMap什么时候扩容
1、capac 即数组容量默认16
2、localFactor加载因子,默认时0.75
3、threshold阈值。阈值=容量*加载因子
4、当hashMap中元素个数超过阈值,就会触发扩容,没次扩容一倍
39、HashMap同中为什么不直接存放红黑树
1、链表短的时候就和红黑树性能差不多
2、红黑树一个节点占用的内存要比链表一个节点占用的内存大
3、如果hash值很随机,按照罗松分布,长度超过8的链表概率很低
Set的去重原理:
Set存储自定义类型元素,并要去重时,需要在该元素中重写HashCode 方法和equals方法