- 什么是面向对象?谈谈你对面向对象的理解
- JDK、JRE、JVM三者的区别和联系
- JDK常用包
- == 和 euqals的区别
- 简述final作用
- 成员变量和局部变量的区别
- 为什么局部内部类和匿名内部类只用访问局部final变量
- 说说String特性
- String、StringBuffer、StringBuilder区别和使用场景
- 重载和重写的区别
- 接口和抽象类的区别
- Object类中的方法
- Java的四种访问级别
- final 、 finally 、 finalize
- 简单聊聊Java集合类
- List和Set的区别与联系
- hashCode与equals
- ArrayList和LinkedList、Vector区别
- HashMap和HashTable的区别?底层实现是什么?
- HashMap和TreeMap的异同
- HashSet和TreeSet的异同
- JDK7中扩容为什么会出现死锁?8如何解决这个问题
- hashMap的特点 以及为什么
- HashMap的扩容,还有参数,1.7 1.8区别
- HashMap为什么要使用红黑树
- 哈希表如何解决哈希冲突
- HashMap 的PUT方法流程
- 集合类怎么解决高并发
- ConcurrentHashMap原理,jdk7和jdk8的区别?
- Java中并发Queue种类
- Java中的异常体系
- Java常见异常
- JDK 1.8 新特性
- Java反射机制的作用
- 获取运行时类的实例方法
- 序列化机制
- 范型
- I/O流 编写程序,完成文件的复制功能
- 小知识点快速过
- 补充:HashMap 哈希冲突解决方案
什么是面向对象?谈谈你对面向对象的理解
- 谈跟面向过程的区别
- 谈面向对象的三大特性
JDK、JRE、JVM三者的区别和联系
- 谈三者分别是啥
- 谈包含关系
JDK常用包
== 和 euqals的区别
- == 既能比较基本数据类型(比较值)也能比较引用数据类型(比较内存地址)
equqls方法属于Object类,没有重写默认也是==,
我们看到的String等类等equals方法是被重写过的,容易形成equals就是比较值的误区。
@Test
public void test222() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j); //false
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true
Integer x = 128;
Integer y = 128;
System.out.println(x == y);//false
Integer a = 127;
Integer b = 127;
System.out.println(a == b);//true -128~127
}
简述final作用
- final 表示最终的
- 修饰类、方法、变量
成员变量和局部变量的区别
为什么局部内部类和匿名内部类只用访问局部final变量
- 首先内部类和外部类是同一个级别 编译之后会生成两个class文件
- 外部类结束,局部变量就会被销毁,但内部类可能还持有引用,这就形成矛盾
- 所以实际上我们是将局部变量复制了一份作为内部类的成员变量,
- 为了保持一致性,我们将局部变量设置为final,保证建立的拷贝一致。
说说String特性
String:字符串,使用一对””引起来表示
1.String声明为final的,不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的。IO流的时候再细说
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据。 JDK9变成了byte[]
4.String:代表不可变的字符序列。 简称:不可变性
体现:当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
5.通过字面量(区别于new)的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会储存相同内容的字符串的。
String、StringBuffer、StringBuilder区别和使用场景
不能回答考虑线程安全就用StringBuffer 不考虑就用StringBuilder
1基本点
String:不可变的字符序列;底层使用final char[]存储
StringBuffer:可变的字符序列;线程安全的(所有方法用synchronized修饰),效率低。底层使用char[]存储
StringBuilder:可变的字符序列;JDK1.5才新增;线程不安全的,效率高;底层使用char[]存储
**
2从源码上看
StringBuffer和StringBuilder底层创建的是一个“value”+16大小的char数组,(默认16大小,或者指定)
而且这个数组是可扩容的。扩容一般为原来的2倍+2,int newCapacity = (value.length << 1) + 2;
特殊情况2种:有一种是扩大两倍还不够的,就直接以if (newCapacity - minCapacity < 0) { newCapacity = minCapacity;
}``它本身作最大值了
还有一个小点,Buffer和Builder可以用append(String s = null),即可以存,父类有一个方法判断null的话把null作为4个字符存入。
3 指导意义:开发过程中,如果我们明确知道可能频繁修改且长度超过16,建议大家使用StringBuffer(int capacity) 指定扩容长度
Ps:一个需要注意的点,虽然给Buffer和Build分配的空间是16,但是这不意味着length()方法是16,他输出的其实类似于total
重载和重写的区别
注意一点:方法的返回值和访问修饰符可以不同,但是他们的不同不构成方法的重载。
接口和抽象类的区别
Object类中的方法
Java的四种访问级别
- public
具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。
- protected
主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。
- default
有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。
- private
访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。
final 、 finally 、 finalize
简单聊聊Java集合类
List和Set的区别与联系
- 都继承Collection接口
- 区别有序可重复 无序不可重复
- list适合追加, 插入,删除,效率低
- set适合随机存储,插入删除,但是遍历时效率低
hashCode与equals
ArrayList和LinkedList、Vector区别
- 底层是什么实现,存储空间,适合干啥
- 缺点
拓展
HashMap和HashTable的区别?底层实现是什么?
HashMap和TreeMap的异同
这个在唯品会面试的时候问到过
1、HashMap是通过hashcode()对其内容进行快速查找的;HashMap中的元素是没有顺序的;
TreeMap中所有的元素都是有某一固定顺序的,如果需要得到一个有序的结果,就应该使用TreeMap;
2、HashMap和TreeMap都不是线程安全的;
3、HashMap继承AbstractMap类;覆盖了hashcode() 和equals() 方法,以确保两个相等的映射返回相同的哈希值;
TreeMap继承SortedMap类;他保持键的有序顺序;
4、HashMap:基于hash表实现的;使用HashMap要求添加的键类明确定义了hashcode() 和equals() (可以重写该方法);为了优化HashMap的空间使用,可以调优初始容量和负载因子;
TreeMap:基于红黑树实现的;TreeMap就没有调优选项,因为红黑树总是处于平衡的状态;
5、HashMap:适用于Map插入,删除,定位元素;
TreeMap:适用于按自然顺序或自定义顺序遍历键(key);
HashSet和TreeSet的异同
1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
JDK7中扩容为什么会出现死锁?8如何解决这个问题
其实是死循环
核心问题的 Thread1扩容完后,元素的顺序发生了变化。而Thread2在Thread1已经扩容完了的基础上进行扩容,就会造成死循环
循环链表主要产生在多线程扩容的时候 方法是transfer
https://www.bilibili.com/video/BV1J54y1x7Sv?from=search&seid=18313152560621740531
解决方案:
改用concurrentHashMap
hashMap的特点 以及为什么
HashMap的扩容,还有参数,1.7 1.8区别
https://blog.csdn.net/qq_36520235/article/details/82417949 可以进来看看大牛的解释
HashMap为什么要使用红黑树
红黑树可以在log n 时间内做查找、插入和删除等操作
补充:为什么红黑树阈值是8,而不是7或20
容器中节点分布在hash桶中的频率遵循泊松分布,桶的长度超过8的概率非常非常小。所以作者应该是根据概率统计而选择了8作为阀值
哈希表如何解决哈希冲突
- 好的Hash算法
- 良好的扩容机制
- 良好的解决措施
- 良好的数据结构
HashMap 的PUT方法流程
集合类怎么解决高并发
- Vector
- Collections.synchronizedList()
- Collections.synchronizedSet()
- CopyOnWriteArrayList
- Concurrenthashmap
ConcurrentHashMap原理,jdk7和jdk8的区别?
- JDK1.7 1.8的不同主要体现在实现线程安全问题的方式上不同。
线程安全 Hashtable是全局锁。 ConcurrentHashMap是分段锁
JDK7 ConcurrentHashMap底层数据结构 ReentrantLock + Segment + HashEntry
JDK8 sychronized + CAS +Node + 红黑树
jdk8 只锁定当前链表或红黑树的首节点,只要不发生hash冲突,就不会产生并发,效率提升N倍
Java中并发Queue种类
- ConcurrentLinkedQueue 无锁 不允许null
- BlockingQueue 记几种
Java中的异常体系
Java常见异常
最常见的runtime exception运行时异常?
数字转换异常,类异常ClassCastException
NumberFormatException
ArrayIndexOutOfBoundsException:数组越界 ClassCastException:类型转换错误
ArithmeticException算术错误,典型的就是0作为除数的时候。
IllegalArgumentException非法参数
IndexOutOfBoundsException
NullPointerException
SystemException ArrayStoreException
JDK 1.8 新特性
Java反射机制的作用
1)在运行时判断任意一个对象所属的类。
2)在运行时构造任意一个类的对象。
3)在运行时判断任意一个类所具有的成员变量和方法。
4)在运行时调用任意一个对象的方法
获取运行时类的实例方法
序列化机制
简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。而把Java对象转换为字节序列的过程称为对象的序列化。
范型
泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,高代码的重用率。
I/O流 编写程序,完成文件的复制功能
//实现对图片的复制
@Test
public void testFileInputStreamFileOutputStream(){
FileInputStream fr = null;
FileOutputStream fw = null;
try {
//1.创建File类的对象,指明读入文件和写出的文件
File inputFile = new File("psu.jpg");
File onputFile = new File("copy_psu.jpg");
//2.创建FileReader输入流和FileWriter输出流的对象,用于数据的读入的和写出
fr = new FileInputStream(inputFile);
fw = new FileOutputStream(onputFile, true);
//3.使用read()读 使用write()写
byte[] bt = new byte[5];
int len;
while ((len = fr.read(bt)) != -1){
fw.write(bt,0,len); //不要直接调构造器write(cr)啊 典型错误
}
} catch (IOException e) {
e.printStackTrace();
} finally {
//下面这种第一个try-catch已经处理了这个异常了,所以下一个try-catch还是能执行
try {
if(fr != null) {
//4.资源的关闭
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fw != null) {
//4.资源的关闭
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
小知识点快速过
数组有没有length()这个方法,String有没有length()这个方
数组没有length()方法,但有length属性
String有length()方法。
写几个线程安全类,不安全的,支持排序的类名?
线程安全类:Vector 、Hashtable、
不安全的类:ArrayList、HashMap、Linkedlist
支持排序的类:TreeSet
JDK也提供一个对集合类进行线程安全处理的类
Collections类,可以对一些非结程安全的
类进行同步处理。
补充:HashMap 哈希冲突解决方案
- 开放定值法
- 链地址法
- 再Hash法