1、java中原始数据类型有哪些?它们的大小及对应的封装类型是什么?
boolean 数据类型非true 即 false ,数据类型表示1bit
boolean Boolean
byte 1byte Byte
short 2bytes Short
int 4bytes Integer
long 8bytes Long
float 4bytes Float
double 8bytes Double
char 2bytes Character
2、"=="与"equal()"区别?
"=="判断的是两个对象的内存地址是否一样 适用原始数据类型和枚举类型
"equal()" 是Object类的方法 Object对它的实现是比较内存地址,我们可以重写这个方法来自定义
比较原始数据类型和枚举类型使用 "==",对于引用类型的相等性比较 应该适用equal();
3、java中的四种引用及其使用场景市什么?
强引用:通常我们使用 new 操作符创建一个对象时所返回的引用即为强引用
软引用:若一个对象只能通过软引用到达,那么这个对象在内存不足时会 被回收,可用于图片缓存中,内存不足时系统会自动回收不再使用的Bitmap
弱引用:若一个对象只能通过弱引用到达,那么它就会被回收(即使内存 充足),同样可用于图片缓存中,这时候只要 Bitmap 不再使用就会被回收
虚引用:虚引用是 Java 中最“弱”的引用,通过它甚至无法获取被引用的对象,它存在的唯一作用就是当它指向的对象回收时,它本身会被加入到引用队列中,这样我们可以知道它指向的对象何时被销毁。
4、object 中定义了哪些方法?
clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()
5、ArrayList, LinkedList, Vector 的区别是什么?
String: 不可变的字符序列,若要向其中添加新字符需要创建一个新的 String 对象
1.7 数组+链表 1.8 数组+链表+红黑树
1.7 采用头插法 1.8 采用尾插法
1.7 hash 1.8 简化hash算法
1.7 扩容 需要重新计算hash值 1.8 改变位置 或者改变索引+改变原数组长度
hashMap死循环头 插法 + 链表 + 多线程并发 + HashMap 扩容 解决有效方法 就是采用安全容器ConcurrentHashMap
HashMap 死循环的常用解决方案有以下 3 个:
使用线程安全容器 ConcurrentHashMap 替代(推荐使用此方案)。
使用线程安全容器 Hashtable 替代(性能低,不建议使用)。
使用 synchronized 或 Lock 加锁 HashMap 之后,再进行操作,相当于多线程排队执行(比较麻烦,也不建议使用)。
如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。
解决hash冲突的方法有很多,HashMap底层是通过链表来解决hash冲突的。
transient Entry[] table;//存储元素的实体数组
transient int size;//存放元素的个数
int threshold; //临界值 当实际大小超过临界值时,会进行扩容threshold = 加载因子*容量
final float loadFactor; //加载因子
transient int modCount;//被修改的次数
hashMap 默认初始容量16 默认负载系数0.75
默认初始容量(数组默认大小):16,2的整数次方static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
最大容量static final int MAXIMUM_CAPACITY = 1 << 30;
默认负载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;
装载因子用来衡量HashMap满的程度,表示当map集合中存储的数据达到当前数组大小的75%则需要进行扩容 链表转红黑树边界static final int TREEIFY_THRESHOLD = 8;
红黑树转离链表边界static final int UNTREEIFY_THRESHOLD = 6;
哈希桶数组transient Node<K,V>[] table;
实际存储的元素个数transient int size;
当map里面的数据大于这个threshold就会进行扩容int threshold 阈值 = table.length * loadFactor
哈希表为解决冲突,可以采用地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。
10、TreeMap, LinkedHashMap, HashMap 的区别是什么?
1、目的
overload用于增加程序的可读性(做法不同但是做的同一事情)。 override用于提供其超级类已经提供的方法的特定实现。
2、范围
overload 在相同的类范围内内执行。 override发生在两类具有继承(继承)的关系。
3、参数
overload参数必须不同,override参数必须相同。
4、多态性
overload 静态多态,调用的函数在编译时被选中。 override 是运行时多态性的。
5、返回类型
overload中可以相同或不同。但你必须改变参数。 override必须是相同的或协变的。
1.重写必须继承,重载不用。
2. 重写的方法名,参数数目相同,参数类型兼容,重载的方法名相同,参数列表不同。
3. 重写的方法修饰符大于等于父类的方法,重载和修饰符无关。
4. 重写不可以抛出父类没有抛出的一般异常,可以抛出运行时异常
总的来说,方法重载就是同名不同参.
14、接口与抽象类的区别
![](https://img-blog.csdnimg.cn/ed929be4bf4b44238bcb60b32c1bdd54.png)
希望本文章能够帮助到你们,后续会继续更新内容,有需要程序猿扫上面二维码,可以和我交流,如果文章不对请大家指正,谢谢大家!