目录
3、Concurrenthashmap 为什么是线程安全的?
TreeMap,HashMap,LinkedHashMap 的区别?
7、ArrayList,Vector, LinkedList 的存储性能和特性?
10、String、StringBuilder、StringBuffer区别
19、为什么重写 equals 时必须重写 hashCode 方法?
26、final,finalize 和 finally 的不同之处?
43、Collection 和 Collections 的区别?
45、Comparable 和 Comparator 接口的区别?
46、switch 能否作用在 byte,long,String 上?
48、Iterator 和 ListIterator 的区别是什么?
49、Enumeration 接口和 Iterator 接口的区别有哪些?
Java基础
1、Hashmap底层原理
它的底层是数组、链表、因此在JDK1.8之后,加上了红黑树 数组初始默认长度是16,加载因子为0.75,当超过16*0.75时会扩容到原来的两倍; 1、通过hash算法计算出当前的hashcode值,跟据数组长度取余,跟据获得的余数存储到相应的数组中。 2、通过下标存储键值时,如果当前数组下标没有其他键直接存入,如果数组中存有其他键值时则会发生hash碰撞。 3、发生哈希碰撞后,会继续比较该下标处所有的key值,如果equals返回true,进行覆盖操作,false,就在最后一个键值对后面进行追加操作,形成单向链表。 4、如果链表长度>=8,数组长度<64就进行扩容操作,并且会重新排序,若>=64则会形成红黑树。 5、当调用remove方法时,会删除元素,当红黑树剩余的键值对个数<=6时,会重新还原成单向链表。
2、如何解决哈希冲突
1、拉链法(用的) 2、在哈希法 3、创建公共溢出区 4、开放寻址法: (1)线性探测法 (2)平方探测法
2.1你知道HahsMap死循环问题吗 ?
HashMap在扩容数组的时候,会将旧数据迁徙到新数组中,这个操作会将原来链表中的数据颠倒,比如a->b->null,转换成b->a->null这个过程单线程是没有问题的,但是在多线程环境,就可,能会出现a->b->a->b....,这就是死循环 在JDK1.8后,做了改进保证了转换后链表顺序一致,死循环问题得到了解决。但还是会出现高并发时数据丢失的问题,因此在多线程情况下还是建议使用ConcurrentHashMap来保证线程安全问题
3、Concurrenthashmap 为什么是线程安全的?
TreeMap,HashMap,LinkedHashMap 的区别?
LinkedHashMap 可以保证 HashMap 集合有序。存入的顺序和取出的顺序一致。 TreeMap 实现SortMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。 HashMap 不保证顺序,即为无序的,具有很快的访问速度。
4、super和this的共同点的区别
this引用当前对象的实例变量或方法,帮助区分同名的局部变量和成员变量。 而 super引用父类的成员变量或方法,通常用来调用父类的方法或构造函数。 this 和 super 的共同点在于它们都用于访问对象的属性或方法,但 this 指向当前实例,而 super 指向父类。
5、final关键字
被final修饰的类不能被继承,修饰方法不能被重写,修饰的变量不能改变。
6、集合
6.1、map
键值对,键值key是不能重复的,value可以,一个key对应一个value treemap有序,hashmap无序
6.2、set
不可重复的集合,只能用iterator实现单项遍历
6.3List
有序可重复,用 Iterator 实现单向遍历,用ListIterator 实现双向遍历
6.4、Queu
先进先出,offer()来添加元素,使用 poll()来移除元素
6.5、Stack
遵从后进先出原则,
7、ArrayList,Vector, LinkedList 的存储性能和特性?
ArrayList 和 Vector 都是使用数组方式存储数据,Vector用了synchronized方法(线程安全)改查快,而 LinkedList 使用双向链表实现存储,增删快
8、内存泄漏和溢出
泄露是应用程序在申请内存后,无法释放已经申请的内存空间,及时关闭流和数据库链接释放 溢出是申请内存时,没有足够的内存空间供其使用,分批提交。
9、int和Integer的区别
Integer是int的包装类,int是基本类型,直接存储数值;Integer是对象,里面有方法
10、String、StringBuilder、StringBuffer区别
String字符串常量,不可变,使用字符串拼接时是不同的 2 个空间 StringBuffer字符串变量,可变,线程安全,字符串拼接直接在字符串后追加 StringBuilder字符串变量,可变,非线程安全,字符串拼接直接在字符串后追加
11、hashtable和hashmap的区别
hashtable是线程安全的,不允许key和value值为null,多一个elements方法 hashmap是非线程安全的,key和value可以为null
12、方法重载的规则?
方法名一致,参数列表中参数的顺序,类型,个数不同。 重载与方法的返回值无关,存在于父类和子类,同类中。 可以抛出不同的异常,可以有不同修饰符。
13、方法的重写的规则
参数列表、方法名、返回值类型必须完全一致,构造方法不能被重写; final修饰的方法不可以 声明为 static 的方法不存在重写 访问权限不能比父类低, 异常抛出范围不能比父类大
14、thow和thows的区别
thow: 在方法体内,表抛出异常,由方法体内的语句处理。执行thow就是一定抛出异常 thows: 用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。表示出现异常的一种可能性,并不一定会发生这种异常。
15.、抽象(abstract)类和接口的区别?
1、接口中所有的方法都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。 2、类可以实现所有的接口,但只能继承一个抽象类 3、类实现接口,必须实现接口中所有的方法,但是继承抽象类不用,不过这个类也成抽象类 4、抽象类可以在不提供接口方法实现的情况下实现接口。 5、Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。 7、接口是绝对抽象的,不可以被实例化(java 8 已支持在接口中实现默认的方法)。抽象类也不 可以被实例化,但是,如果它包含 main 方法的话是可以被调用的。
16、Java的基本类型和字节大小
布尔型 boolean 8 位;字节型 byte 8 位; 字符型 char 16 位; 短整型 short 16 位;整形 int 32 位; 长整形 long 64 位; 浮点型 float 32 位;双精度 double 64 位;
17、访问修饰符的区别访问级别?
public:公共的,都可以访问 protected:受保护的,只要同类中、同包下、子类中可以访问 没有访问修饰符:只能同类中、同包下可以访问 private:私有的,只能同类中可以访问
18、HashSet 的底层实现是什么?
底层是hashmap,hashset的值就是hashmap的key存在hashmap
19、为什么重写 equals 时必须重写 hashCode 方法?
如果两个对象相等,则hashcode一定相等,但是hashcode默认是对对堆上的对象产生独特值,如果没有重写hashcode,两个对象无论如何都不会相等
20、HashSet 和 TreeSet 有什么区别?
hashset是由一个 hash 表来实现的,因此,它的元素是无序的。O(1) TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的O(logn)
21、Java 中的四大引用分别是什么?
1、强引用 String s = "abc",只要强引用存在,则垃圾回收器就不会回收这个对象。 2、软引用 如果内存足够,不回收,如果内存不足,则回收 3、弱引用 一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存 4、虚引用 在任何时候都可能被垃圾回收器回收
22、数组在内存中如何分配
使用 new 关键字创建的时候,会在堆上分配内存空间,每个数组成员是一个引用(指针) 引用到栈上的空间。
23、Java 中怎么创建一个不可变对象?
1.对象的状态在构造函数之后都不能被修改,任何修改应该通过创建一个新对象来实现. 2.所有的对象属性应该都设置为 final。 3.对象创建要正确,例如:对象的应用不能在构造函数中被泄露出去 4.对象要设置为 final,确保不要继承的 Class 修改了 immutability 特性
24、Java 中++操作符是线程安全的吗?
不是线程安全的操作,它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可 能会出现多个线程交差。
25、==与equals()区别
一般用==比较基本类型,是不是指向同一个内存空间。 用equals比较对象,只有对象可以调用,默认是比较对象地址是否相同,比如 String 的 equals 是比较的内容。