什么是面向对象?谈谈你对面向对象的理解

  1. 谈跟面向过程的区别
  2. 谈面向对象的三大特性

image.png
image.png
image.png

JDK、JRE、JVM三者的区别和联系

  1. 谈三者分别是啥
  2. 谈包含关系

image.png
image.png

JDK常用包

image.png

== 和 euqals的区别

  1. == 既能比较基本数据类型(比较值)也能比较引用数据类型(比较内存地址)
  2. equqls方法属于Object类,没有重写默认也是==,

    我们看到的String等类等equals方法是被重写过的,容易形成equals就是比较值的误区。
    image.png
    image.png
    image.png
    image.png

    1. @Test
    2. public void test222() {
    3. Integer i = new Integer(1);
    4. Integer j = new Integer(1);
    5. System.out.println(i == j); //false
    6. Integer m = 1;
    7. Integer n = 1;
    8. System.out.println(m == n);//true
    9. Integer x = 128;
    10. Integer y = 128;
    11. System.out.println(x == y);//false
    12. Integer a = 127;
    13. Integer b = 127;
    14. System.out.println(a == b);//true -128~127
    15. }

简述final作用

  1. final 表示最终的
  2. 修饰类、方法、变量

image.png
image.png
image.png

成员变量和局部变量的区别

image.pngimage.png

为什么局部内部类和匿名内部类只用访问局部final变量

  1. 首先内部类和外部类是同一个级别 编译之后会生成两个class文件
  2. 外部类结束,局部变量就会被销毁,但内部类可能还持有引用,这就形成矛盾
  3. 所以实际上我们是将局部变量复制了一份作为内部类的成员变量,
  4. 为了保持一致性,我们将局部变量设置为final,保证建立的拷贝一致。

image.png
image.png

说说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
image.png
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

重载和重写的区别

注意一点:方法的返回值和访问修饰符可以不同,但是他们的不同不构成方法的重载。
image.png
image.png
image.png

接口和抽象类的区别

image.png
image.png

Object类中的方法

image.png

Java的四种访问级别

  • public

具有最大的访问权限,可以访问任何一个在classpath下的类、接口、异常等。它往往用于对外的情况,也就是对象或类对外的一种接口的形式。

  • protected

主要的作用就是用来保护子类的。它的含义在于子类可以用它修饰的成员,其他的不可以,它相当于传递给子类的一种继承的东西。

  • default

有时候也称为friendly,它是针对本包访问而设计的,任何处于本包下的类、接口、异常等,都可以相互访问,即使是父类没有用protected修饰的成员也可以。

  • private

访问权限仅限于类的内部,是一种封装的体现,例如,大多数成员变量都是修饰符为private的,它们不希望被其他任何外部的类访问。

image.png

final 、 finally 、 finalize

简单聊聊Java集合类

image.png

List和Set的区别与联系

  • 都继承Collection接口
  • 区别有序可重复 无序不可重复
  • list适合追加, 插入,删除,效率低
  • set适合随机存储,插入删除,但是遍历时效率低

image.png

hashCode与equals

image.png
image.png

ArrayList和LinkedList、Vector区别

  1. 底层是什么实现,存储空间,适合干啥
  2. 缺点

image.png
拓展
image.png

HashMap和HashTable的区别?底层实现是什么?

image.png
image.png
image.png

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
image.png

hashMap的特点 以及为什么

image.png

HashMap的扩容,还有参数,1.7 1.8区别

image.png
image.png
https://blog.csdn.net/qq_36520235/article/details/82417949 可以进来看看大牛的解释

HashMap为什么要使用红黑树

红黑树可以在log n 时间内做查找、插入和删除等操作
image.png
补充:为什么红黑树阈值是8,而不是7或20
容器中节点分布在hash桶中的频率遵循泊松分布,桶的长度超过8的概率非常非常小。所以作者应该是根据概率统计而选择了8作为阀值

哈希表如何解决哈希冲突

  • 好的Hash算法
  • 良好的扩容机制
  • 良好的解决措施
  • 良好的数据结构

image.png

HashMap 的PUT方法流程

image.png
image.png

集合类怎么解决高并发

  • Vector
  • Collections.synchronizedList()
  • Collections.synchronizedSet()
  • CopyOnWriteArrayList
  • Concurrenthashmap

ConcurrentHashMap原理,jdk7和jdk8的区别?

大神回答:https://blog.csdn.net/qq_35190492/article/details/103589011?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161560436016780255263293%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=161560436016780255263293&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-103589011.first_rank_v2_pc_rank_v29&utm_term=ConcurrentHashMap

  • JDK1.7 1.8的不同主要体现在实现线程安全问题的方式上不同。

线程安全 Hashtable是全局锁。 ConcurrentHashMap是分段锁
JDK7 ConcurrentHashMap底层数据结构 ReentrantLock + Segment + HashEntry
JDK8 sychronized + CAS +Node + 红黑树
image.pngimage.png
image.png
image.png
image.png
image.png
jdk8 只锁定当前链表或红黑树的首节点,只要不发生hash冲突,就不会产生并发,效率提升N倍
image.png

Java中并发Queue种类

  • ConcurrentLinkedQueue 无锁 不允许null
  • BlockingQueue 记几种

image.png
image.png

Java中的异常体系

image.png
image.png
image.png

Java常见异常

最常见的runtime exception运行时异常?
数字转换异常,类异常ClassCastException
NumberFormatException
ArrayIndexOutOfBoundsException:数组越界 ClassCastException:类型转换错误
ArithmeticException算术错误,典型的就是0作为除数的时候。
IllegalArgumentException非法参数
IndexOutOfBoundsException
NullPointerException
SystemException ArrayStoreException

JDK 1.8 新特性

image.png

Java反射机制的作用

1)在运行时判断任意一个对象所属的类。
2)在运行时构造任意一个类的对象。
3)在运行时判断任意一个类所具有的成员变量和方法。
4)在运行时调用任意一个对象的方法

获取运行时类的实例方法

image.png

序列化机制

简单来说序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,我们可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。而把Java对象转换为字节序列的过程称为对象的序列化。image.png

范型

泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,高代码的重用率。
image.png

I/O流 编写程序,完成文件的复制功能

image.png

 //实现对图片的复制
    @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 哈希冲突解决方案

  1. 开放定值法
  2. 链地址法
  3. 再Hash法