Java基础
-
String是什么数据类型?(Java中数据类型)
Java中数据类型分为两种:基本数据类型和引用数据类型。
根据下图可以看出String为引用类型。 -
String、StringBuilder、StringBuffer的区别
(1)String是字符串常量,一旦创建后就不可改变,String的拼接会创建新的字符串常量对象并回收之前的对象,频繁的String拼接对内存消耗较大,并且耗时。
(2)StringBuilder就是为了解决频繁String拼接造成的问题,StringBuilder是可变长度的,频繁的拼接直接对对象进行修改,无需重新创建和销毁对象。
(3)StringBuffer和StringBuilder类似,他俩的区别就是StringBuffer是线程安全的,无需考虑多个线程间数据同步问题,但效率会比StringBuilder慢一些。
(4)总结下来就是String适合少量字符串操作,StringBuilder适合单线程内大量字符串操作,StringBuffer适合多线程中字符操作。 -
堆栈内存的区别(全局变量存放在哪里?)
-
synchronized和volatile的区别
(1)volatile仅能作用于变量,synchronized可以作用于变量、方法和类上
(2)volatile仅能实现对变量的修改可见性,不能保证原子性,synchronized可以保证 原子性和可见性
(3)volatile不会造成线程阻塞,synchronized可能会造成线程阻塞
(4)volatile修饰的变量不会被编译器优化(在不同线程中不会出现副本),synchronized修饰的可以被编译器优化(但能保证原子性)。 -
Java中锁的分类(synchronized用的是公平锁还是非公平锁)
synchronized使用的是非公平锁,允许插队,提高性能。
Java中锁的分类:参见该文章 -
抽象类和接口的区别
(1)抽象类中可以定义普通成员变量,接口中只能定义static final变量,并且需要进行初始化
(2)抽象类可以有构造方法,接口没有
(3)抽象类中可以定义普通方法,接口中所有的方法都是抽象的
(4)抽象类中的抽象方法可以定义为public或protected,接口中只能是public
(5)一个类只能继承一个抽象类,但是可以实现多个接口
(6)抽象类中可以包含静态方法,接口中不能有静态方法 -
什么时候一个对象会被GC(引用计数法、可达性分析)
一个对象被GC,也就是对象无法被任何地方访问,那么如何进行判断呢,有两种常用方法。- 引用计数法:引用计数法就是给对象添加一个引用计数器,当对象被强引用的时候,计数+1,否则-1,如果对象的引用计数器为0,那么对象就没有被使用。该方法的优势就是高效,简单,但无法解决对象之间互相引用造成的问题。
- 可达性分析:可达性分析就是通过一系列的被称为“GC Roots”的对象,从这些节点向下进行搜索,搜索走过的路径被称为引用链,当一个对象到GC Roots没有任何引用链时,证明这个对象是不可用的。JVM采用的就是这种方法。
-
Java中集合相关问题
-
Java中集合都有哪些类型
-
ArrayList和LinkedList的实现和区别
ArrayList是由数组实现的,数组结构插入和删除速度慢,访问速度快。
LinkedList是由链表实现的,链表结构插入和删除速度快,访问速度慢。 -
ArrayList初始长度、负载因子、增加倍数(同理其他的也有可能问到)
ArrayList的初始长度为10,负载因子是1,扩容增量为0.5 -
HashMap的底层实现
HashMap的实现原理是数组加链表或者红黑树来实现,当我们调用put方法时,先去获取key的hash值,然后根据hash值经过算法来确定bucket数组中的下标,如果该下标处没有值,则将node放置在这里,如果对应位置上有链表,则调用key的equals方法和链表上的每一个key进行比较,如果有重复的,那么对应的key位置将会被替换掉,如果没有,则添加到链表末尾。
同理,调用put方法的时候,先调用key的hash值找到bucket对应下标,然后从链表中调用equals方法来获取我们需要找的value。HashMap中数组中某个下标处的链表大小超过8个时,将改为红黑树结构,小于8个时,重新改为链表结构。
-
HashMap中bocket的下标到底是怎么算的
对传入的key取hashcode,然后对hashCode以及hashCode右移16位做异或运算static final int hash(Object key) { int h;
-