1 Java基础语法
1、JDK和JRE,JVM有什么区别?
jdk是java开发工具包,包含了jre和jvm
jre是开发环境,包含了jvm和核心类库
jvm是虚拟机
2、说下你对==和equals的认识,它们有什么差别?(高频)
对于==来说,如果比较基本数据类型比较的就是值,比较引用数据类型比较的就是地址
对于equals来说,只能比较引用数据类型,对于equals()方法,在Object类中所定义的equals方法底层也是==比较对象的地址值,重写了equals方法后,比较的就是内容
3、如果两个对象的 hashCode值一样,则它们用equals()比较也是为 true,是不是?(高频)
不是.
object中,hashcode()和equals()是两个方法,hashcode()默认返回的是对象的地址,equals比较的是对象的地址,可以通过重写hashCode()方法让让不同值的对象有相同的hashCode ,但是equals不一定相同.
4、综合说下final的作用?和finally,finalize有什么区别
final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量为常量不能被重新赋值
finally 一般在try..catch结构中,不管是否出现异常,finally后面的语句都会执行
finalize是Object类的方法,用在垃圾回收器中
5、String str="abc"与 String str=new String("abc")的定义方法一样吗?
不一样
String str="abc": 是在常量池中创建了一个对象abc
String str=new String("abc"): 创建了两个对象."abc"字符串对象在常量池中 ,new String("")在堆内存中又创建了一个新对象
6、String 类的常用方法都有那些?(高频)
indexOf():返回指定字符的索引。
length():返回字符串长度。
equals():字符串比较。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
reverse(): 对字符串进行反转
7、是否可以继承String类?为什么用final修饰
不能,String是final修饰的类,不能被继承,为了效率和安全
1.只有字符串是不可变的,字符串池才有可能被继承
2.只有字符串是不可变的,所以多线程是安全的,同意个字符串实例可以被多个多线程共享
3.因为字符串是不可变的,所以他在被创建的时候就已经被hashcode缓存了,不需要重新计算,使得字符串很适合做map中的键.
4.如果字符串是可变的,会引用很严重的安全问题
8、什么是面向对象编程?
面向对象编程的基本思想就是类 方法 继承 封装 多态 等概念进行程序设计,从实现世界中实际存在的事物(对象)出发来构造软件系统,尽可能的运用人类的自然思想进行程序设计
9、面向对象的三大特征?
继承:子类继承父类可以实现代码代码的抽取和复用,单继承,多实现
封装:将事物的属性和行为抽取出来封装到类中
多态:父类的引用指向子类的实现 三个条件:继承 重写 向上转型
10、this和super的区别
this指向的是自身的对象,代表对象本身
super指向的是自己的一个超类对象,这个超类对象是最近的一个父类
this()调用的是本类的其他构造方法
super()调用的是父类的构造方法
11、break,continue,return 的区别及作用
break跳出当前循环
continue结束当前循环进入下一个循环
return 结束整个方法
12、抽象方法能被final修饰吗?
不能,final修饰的类不能被继承,而抽象类本身就是用来被继承的,相桲所以不能
13、局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final?
因为生命周期不一样,局部变量保存在栈中当方法结束后 非final
14、重载和重写的区别
重载:方法名称相同 参数类型不同 参数类型:参数数量 参数类型 参数顺序
重写:发生在父类中 方法的名称参数必须相同 抛出的异常小于父类 访问修饰符大于等于父类
15、构造器是否可以被重写
构造器不能被继承,所以不能被重写,但是可以被重载
16、Java中创建对象的方式有哪里
1 使用new关键字
2 使用class类的newInstance方法
3 使用constructor类的newInstance方法
4使用clone方法
5使用反序列化
3 集合
1、ArrayList和LinkList的区别
ArrayList查询速度快,局部增删快,头部增删慢,随机访问速度快;
LinkList头尾增删速度快,中间不高,性能远比arrayList差 ,不适合做查询;真想查询hashMap
(1) 是否保证线程安全:ArrayList和LinkedList都不保证线程安全
(2)底层数据结构:ArrayList底层使用的是数组;LinkeList底层使用的是双链表
(3)插入和删除是否受元素位置的影响:
ArrayList采用数组存储,所以插入和删除元素时间复杂度受元素位置的影响
LinkList采用链表存储,所以插入删除元素复杂度不受元素位置的影响
(4)是否支持快速随机访问:LinkedList不支持高效的随机元素访问,ArrayList实现了RandomAccess接口,所以有随机访问功能
(5)内存空间占用:
ArrayList的空间浪费主要是尾部会预留一定的容量空间
LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间
2、HashMap的底层原理
jdk8之前:数组+链表
jdk8之后:数组+链表+红黑树
3、HashMap的resize过程是什么?
HashMap的底层是数组+链表,1.8之后会引入红黑树.会初始化一个长度为16的数组,负载因子为0.75,当数组长度大于阈值(数组长度*0.75)的时候就会扩容到之前的两倍.链表长度大于8数组长度大于64就会转换成红黑树.
4、HashMap和HashTabled的区别?
1 HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containskey()方法
2 Hashtable是同步的,HashTable是非同步的效率上要比HashTable高
3 HashMap允许有空键值对,但是HashTable不行
5、List Map set三个接口,存取元素时,有什么特点
List集合:有序无索引可重复
Map集合:以key-value方式存储,value可以多个
Set集合:无序 无索引 不可重读
6、HashSet是如何保证元素的唯一性
通过元素的两个方法Hashcode和equals比较
7、TreeSet怎么对元素中的集合进行比较
TreeSet的底层是二叉树
对元素自身具备比较性:需要元素对象实现comparable接口,覆盖comperTO方法
对集合自身具备比较性:需要定义一个实现了comparator接口的比较器,覆盖compare方法
8、map的两种取方式
通过map.keyset,先拿到map集合的键,在根据键拿到值
通过map.entrymap拿到所有的键值对
9、collection和collections的区别
collection是集合类的顶层接口,继承他的接口主要有set和list
collections是工具类,有很多操作集合的方法
10、concurrentHashMap的工作原理以及代码实现
concurrentHashMap底层采用分割的概念,只对Map的一部分进行上锁,这样能保证同步的同时,锁住的不是整个Map
11、HashCode的方法和作用
hashcode()的作用是读取哈希码也称散列码;它实际上是返回一个int整数,这个哈希码的作用就是确定该对象在哈希表中的索引位置.
3 IO流
7 java 中 IO 流分为几种?
按功能分:输入流(input)和输出流(output)
按类型分:字节流和字符流
8、BIO、NIO、AIO 有什么区别?(高频)
BIO:是Block IO的简称,同步阻塞式IO,就是平常经常使用的传统 IO,特点是简单方便,但并发处理能力低。
NIO:是new IO的简称,同步非阻塞IO,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用(由一个线程管理多个通道默认管理的通道数量为1024个)。
AIO:是Asynchronous IO,是 NIO 的升级,实现了异步非堵塞 IO ,它是基于事件和回调机制。