侧边栏壁纸
博主头像
峰峰火火

一条咸鱼罢了

  • 累计撰写 121 篇文章
  • 累计创建 87 个标签
  • 累计收到 59 条评论

目 录CONTENT

文章目录

Java面试大纲及题目

峰峰火火
2021-02-27 / 0 评论 / 0 点赞 / 275 阅读 / 28,066 字 / 正在检测是否收录...
温馨提示:
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

部分题目已做

img

附题目

一、JavaSE部分

❤1、Java基础

1、为什么重写equals还要重写hashcode

==equals重写后如果Hashcode不重写;会只是equals相同,hashcode还是内存地址;一定不相同;==

==这与定义不符合;会影响性能;所以必须重写hashcode;==

2、说一下map的分类和常见的情况

==HashMap,HashTable,TreeMap,LinkedHashMap,ConcurrentHashMap;==

3、Object若不重写hashCode()的话,hashCode()如何计算出来的?

==调用本地方法来计算;C语言写的HashCode计算方法;==

4、==比较的是什么?

==类型或者对象内存地址==

5、若对一个类不重写,它的equals()方法是如何比较的?

==对象地址==

6、java8新特性

==Lambda,方法引用,stream();==

7、说说Lamda表达式的优缺点。

==优点:简化代码量;可能未来趋势;==

==缺点:可读性不强;没学过lambda的人难以接手;==

8、一个十进制的数在内存中是怎么存的?

==二进制的补码形式存==

9、为啥有时会出现4.0-3.6=0.40000001这种现象?

==2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。==

10、Java支持的数据类型有哪些?什么是自动拆装箱?

==boolean,byte,char,short,int,float,double,long==

==自动装箱: 就是将基本数据类型自动转换成对应的包装类。==

==自动拆箱:就是将包装类自动转换成对应的基本数据类型。==

11、什么是值传递和引用传递?

==值传递不会改变原对象;引用传递可能会改变对象==

12、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

==Array可以存基础类型和对象类型;ArrayList只能存对象类型;==

==固定大小就Array,需要扩容就ArrayList;==

13、你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?

==大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界 。==
==大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。==

14、String是最基本的数据类型吗?

==引用类型==

15、int 和 Integer 有什么区别

==int:基础类型;Integer,封装int的对象,提供各种对int的操作;==

16、String 和StringBuffer的区别

==String:不可变对象,变化之后都会new String();==

==StringBuffer:可变对象,append方法附加,到达一定长度,扩容char数组;==

17、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?

String str=new String("开始打圣地".getBytes(StandardCharsets.UTF_8));
System.out.println(str);

18、int和Integer有什么区别?

19、&和&&的区别?

&两边都要判断;&&不符合条件不用判断后一个;一般采用后面

20、在Java中,如何跳出当前的多重嵌套循环?

标记tag

tag:
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        System.out.println(i+" "+j);
        break tag;
    }
}

21、你能比较一下Java和JavaSciprt吗?

==都是语言;Java需要编译;JavaScript不用编译,浏览器直接运行;==

22、简述正则表达式及其用途。

==快速匹配字符串中符合条件的列表;==

23、Java中是如何支持正则表达式操作的?

==Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作==

24、请你说说Java和PHP的区别?

❤2、关键字*

1、介绍一下Syncronized锁,如果用这个关键字修饰一个静态方法,锁住了什么?如果修饰成员方法,锁住了什么?

==synchronized 是 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码,而这段代码也被称为临界区。==

==对于普通的同步方法:==
==锁是当前的对象==
==对于静态函数的同步方法:==
==锁是指引用当前类的class对象==
==对于同步方法块的内容:==
==锁是指Synchonized括号里配置的对象==

2、介绍一下volatile?

==volatile是Java提供的轻量级的同步机制,比sync的开销要小==

==1.保证此变量对所有的线程的可见性,这里的“可见性”==

==2.禁止指令重排序优化。==

3、锁有了解嘛,说一下Synchronized和lock

image-20201019160501348

4、讲一讲Java里面的final关键字怎么用的?

❤3、面向对象

1、wait方法底层原理

==native 本地方法;==

2、Java有哪些特性,举个多态的例子。

==封装,继承,多态==

==多态:Map map=new HashMap();==

3、String为啥不可变?

==final char[] ;==

==不可修改;定长;==

4、类和对象的区别

5、请列举你所知道的Object类的方法。

==equals;hashcode;wait;==

6、重载和重写的区别?相同参数不同返回值能重载吗?

==重载:相同函数名不同参数;重写:子类继承父类,重写父类的方法;==

==不能==

7、”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?

8、String能继承吗?

==不能;被final修饰;==

9、StringBuffer和StringBuilder有什么区别,底层实现上呢?

==线程安全不安全;==

10、类加载机制,双亲委派模型,好处是什么?

==某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。==

==使用双亲委派模型的好处在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。==

11、静态变量存在哪?

==全局区==

12、讲讲什么是泛型?

13、解释extends 和super 泛型限定符-上界不存下界不取

==extends 指定上界限,只能传入本类和子类==

==super 指定下界限,只能传入本类和父类==

14、是否可以在static环境中访问非static变量?

==不能==

15、谈谈如何通过反射创建对象?

==方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()==

==方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance(“Hello”);==

16、Java支持多继承么?

==不支持;支持多接口;==

17、接口和抽象类的区别是什么?

==接口只能定义方法;不能有实现;==

==抽象类,可定义方法和抽象方法;也可以实现;==

==都不能实例化;接口可以匿名内部类;==

18、Comparable和Comparator接口是干什么的?列出它们的区别。

==Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序==

19、面向对象的特征有哪些方面

==封装,继承,多态;==

20、final, finally, finalize的区别。

==final:修饰方法或者变量;不可继承,不可修改;==

==finally:配合 异常使用;无论执行是否出错,都会被执行;==

==finalize:gc回收时,调用的函数;==

21、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

22、abstract class和interface有什么区别?

23、Static Nested Class 和 Inner Class的不同

24、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

==引用传递;==

25、Java的接口和C++的虚类的相同和不同处。

26、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

==throws 声明在函数上;代表该函数可能发生的错误;==

==throw 代码块中,抛出一个错误;==

==try,catch,finally配合使用;捕获异常;try不可省略,catch和finally有一个可省略;==

==finally用来执行一些回收,释放资源操作;==

==try中;可以抛出异常;==

27、内部类可以引用他包含类的成员吗?有没有什么限制?

28、两个对象值相同(x.equals(y) == true),但却可有不同的hash code说法是否正确?

29、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

30、如何通过反射获取和设置对象私有字段的值?

31、谈一下面向对象的"六原则一法则"。

32、请问Query接口的list方法和iterate方法有什么区别?

33、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

34、Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

35、hashCode()和equals()方法有什么联系?

❤4、集合

1、Map和ConcurrentHashMap的区别?

2、hashMap内部具体如何实现的?

3、如果hashMap的key是一个自定义的类,怎么办?

4、ArrayList和LinkedList的区别,如果一直在list的尾部添加元素,用哪个效率高?

5、HashMap底层,负载因子,为啥是2^n?

6、ConcurrentHashMap锁加在了哪些地方?

7、TreeMap底层,红黑树原理?

8、concurrenthashmap有啥优势,1.7,1.8区别?

9、ArrayList是否会越界?

==会,并发操作时,可能会导致size++;就会越界现象;==

10、什么是TreeMap?

11、ConcurrentHashMap的原理是什么?

12、Java集合类框架的基本接口有哪些?

13、为什么集合类没有实现Cloneable和Serializable接口?

14、什么是迭代器?

15、Iterator和ListIterator的区别是什么?

16、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?

17、HashMap和Hashtable有什么区别?

18、ArrayList和LinkedList有什么区别?

19、ArrayList,Vector,LinkedList的存储性能和特性是什么?

20、Collection 和 Collections的区别。

21、你所知道的集合类都有哪些?主要方法?

22、List、Set、Map是否继承自Collection接口?

23、阐述ArrayList、Vector、LinkedList的存储性能和特性

24、List、Map、Set三个接口存取元素时,各有什么特点?

❤5、线程

==四种多线程:可缓存线程池,控制线程最大并发数的定长线程池,支持定时操作的定长线程池,单线程化的线程池;==

1、多线程中的i++线程安全吗?为什么?

2、如何线程安全的实现一个计数器?

3、多线程同步的方法

4、介绍一下生产者消费者模式?

5、线程,进程,然后线程创建有很大开销,怎么优化?

6、线程池运行流程,参数,策略

7、讲一下AQS吧。

8、创建线程的方法,哪个更好,为什么?

9、Java中有几种方式启动一个线程?

10、Java中有几种线程池?

11、线程池有什么好处?

12、cyclicbarrier和countdownlatch的区别

13、如何理解Java多线程回调方法?

14、创建线程有几种不同的方式?你喜欢哪一种?为什么?

15、概括的解释下线程的几种可用状态。

16、同步方法和同步代码块的区别是什么?

17、启动线程有哪几种方式,线程池有哪几种?

18、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

19、sleep() 和 wait() 有什么区别?

20、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

21、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。使用内部类实现线程,对j增减的时候没有考虑顺序问题。

22、启动一个线程是用run()还是start()?

23、请说出你所知道的线程同步的方法

24、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

25、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

26、线程的sleep()方法和yield()方法有什么区别?

27、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

28、请说出与线程同步以及线程调度相关的方法。

29、举例说明同步和异步

30、什么是线程池(thread pool)?

31、说说线程的基本状态以及状态之间的关系?

32、如何保证线程安全?

❤6、锁

什么是锁

  将某种资源私有化的物品;Java里面的锁也有这种特性;他可以让某个方法,某个变量或者某个通道在某个时刻下只能被一个线程占用;只有当这个锁被释放了,另外的线程才能使用;

临界区

  多线程访问共享资源;防止出现数据不一致情况;引入了临界区;临界区是一个用来访问共享资源的代码块,同一时间只能一个线程进行访问;

有几种锁?

  synchronized 非公平锁 :效率比较低,不够灵活,不可中断,无法感知获取锁

  ReentrantLock 重入锁(公平,非公平锁):效率较高,灵活,可感知获取锁,可公平可非公平,可中断

  ReadWriteLock 非公平锁 :读写分离控制(读多写少),读读并行,读写串行,写写串行

什么是死锁:

  死锁是指两个或者两个以上进程在执行过程中;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力的作用下;他们都无法推进下去;此时称系统状态处于死锁状态;这些永远相互等待的进程称为死锁进程;

死锁的原因:

系统资源不足;

程序执行顺序有问题;

程序资源分配不当;

死锁的四个必要条件:

互斥条件;一个资源只能被一个进程使用;

请求与保持条件;一个进程因请求资源而阻塞时,对已获得的资源保持不放;

不剥夺条件;进程已获得的资源,在未使用完之前,不能强行剥夺;

循环等待条件;若干进程之间形成一条头尾相接的循环等待资源关系;

如何解决死锁:

  了解了死锁的四个必然条件,就可以最大化的避免、预防、解除死锁。

  在系统设计,进程调度等方面注意如何不让这四个条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源;也要防止进程处于等待状态的情况下占用资源。因此,需要对资源进行合理的分配;

数据库中的锁

事务四个特性:原子,一致,隔离,持久

数据库死锁

  数据库要修改一条数据时,会给他加上锁,保证数据的一致性;

  而死锁发生在多个进程访问同一数据库时,其中每个进程所用的锁是其它进程所需的,由此造成每个进程无法继续下去;

  简单地说就是:进程A等待进程B释放她的锁;进程B等待进程A释放她的锁;相互等待,就形成了死锁;

降低死锁

同一顺序访问对象;

避免事务中用户交互;

保持事务简短并在一个批处理中;

使用低隔离级别;

使用绑定连接;

1、讲一下非公平锁和公平锁在reetrantlock里的实现。

2、讲一下synchronized,可重入怎么实现。

定义:若一个程序或子程序可以“在任意时刻被中断然后操作系统调度执行另外一段代码,这段代码又调用了该子程序不会出错”,则称其为可重入的。即当该子程序正在运行时,执行线程可以再次进入并执行它,仍然获得符合设计时预期的结果。与多线程并发执行的线程安全不同,可重入强调对单个线程执行时重新进入同一个子程序仍然是安全的。

==每个锁关联一个线程持有者和一个计数器。当计数器为0时表示该锁没有被任何线程持有,那么任何线程都都可能获得该锁而调用相应方法。当一个线程请求成功后,JVM会记下持有锁的线程,并将计数器计为1。此时其他线程请求该锁,则必须等待。而该持有锁的线程如果再次请求这个锁,就可以再次拿到这个锁,同时计数器会递增。当线程退出一个synchronized方法/块时,计数器会递减,如果计数器为0则释放该锁。==

3、锁和同步的区别。

4、什么是死锁(deadlock)?

5、如何确保N个线程可以访问N个资源同时又不导致死锁?

==使用多线程时,一种非常简单的避免死锁的方式就是:指定锁的顺序,并强制线程按照指定的顺序获取锁。因此所有的线程都是以同样的加锁和释放锁,就不会出现死锁了==

6、请你简述synchronized和java.util.concurrent.locks.Lock的异同?

❤7、JDK

1、Java中的LongAdder和AtomicLong的区别

2、JDK和JRE的区别是什么?

❤8、反射

1、什么是Java类中的反射?

当程序运行时,允许改变数据结构或者变量类型,这种语言称为动态语言;然而Java不是动态语言;但是它提供了一个类似的机制:反射;

Reflection 是Java语言的开发特征之一,它允许运行中的Java程序获取自身的信息,并且可以操作类和对象的属性。

反射的核心:是 JVM 在运行时才动态加载的类或调用方法或属性,他不需要事先(写代码的时候或编译期)知道运行对象是谁。

2、Java反射框架提供的功能?

1、在运行时判断任意一个对象所属的类

2、在运行时构造任意一个类的对象

3、在运行时判断任意一个类所具有的成员变量和方法

4、在运行时调用一个对象的方法

3、反射的用途?

1、当在使用IDE时,输入一个对象或者类,调用他们的属性和方法时,输入.点号时,编译器就会自动列出它的属性或方法,这就用到了反射;

2、开发各种通用框架:比如spring是配置化的,通过xml文件配置JavaBean,Action之类的,为了保证框架的通用性,他们可能根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射----运行时动态需要加载的对象;

4、反射的基本运用?

反射相关类一般都在 java.lang.relfect包里

步骤:

1、获得Class对象

  (1)使用Class类的forName()静态方法:

Class.forName(driver)(JDBC开发用此方法加载驱动)

  (2)直接获取一个对象的class:

Class classInt = Integer.TYPE;

  (3)调用一个对象的getClass()方法:

StringBuilder str = new StringBuilder("123");
Class<?> klass = str.getClass();

2、判断是否为某个类的实例

一般地,我们用 instanceof关键字来判断是否为某个类的实例。同时我们也可以借助反射中Class对象的 isInstance()方法来判断是否为某个类的实例,它是一个 Native 方法:

3、创建实例(两种方式)

  (1)使用Class对象的newInstance()方法来创建对象对应类的实例。

Class c = String.calss;
Object str = c.getInstance();

  (2)先通过 Class 对象获取制定的 Constructor 对象,在调用 Constructor 对象的 newInstance() 方法来创建实例。这种方法可以用指定的构造器构造类的实例。

//获取String所对应的Class对象
Class c = String.class;
//获取String类带一个String参数的构造器
Constructor constructor = c.getConstructor(String.class);
//根据构造器创建实例
Object obj = constructor.newInstance("23333");
System.out.println(obj); 

😀9、JVM

JVM的位置

JVM是运行在操作系统之上,相当于一个软件

JVM是用C、C++语言编写的

image.png

JVM结构

image.png

JVM调优几乎都是调堆里面的东西;

lombok插件,实际上在执行引擎上动态加载了get,set;

类加载器

通过一个类的全限名来获取描述此类的二进制字节流,这个动作放在JVM外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码模块称为“类加载器”

当一个对象创建之后,它的引用放在栈里面,对象本身放在堆里面

类加载器的种类

1、启动加载器:根加载器,主要是加载环境变量目录下的核心api,如rt.jar;

2、扩展类加载:负责加载lib,ext目录下的所有jar包;

3、应用程序加载器:加载项目工程的ClassPath目录下的类库,可以自定义类加载器;

面试题:Class.forName 和 ClassLoader 有什么区别?
简单总结:

Class.forName() 方法实际上也是调用的 CLassLoader 来实现的。

Class.forName 加载类是将类进了初始化,而 ClassLoader 的 loadClass 并没有对类进行初始化,只是把类加载到了虚拟机中。

双亲委派机制

当一个类在加载的时候,都会先委派它的父类加载器去加载,这样一层层的向上委派,直到最顶层的启动加载器;如果顶层无法加载,即找不到对应的类,就会一层层的向下查找,直到找到为止。这就是双亲委派机制。

目的:保证安全,防止开发员自定义与源码中相同的类;

沙箱安全机制

Java安全模型的核心就是Java沙箱;

沙箱:是一个限制程序运行的环境;

沙箱机制就是将Java代码限定在JVM特定的运行范围内,并且严格限制代码对本地资源的访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏;

系统资源:CPU、内存、文件系统、网络;

Native

凡是带有native关键字的,说明Java的作用域达不到了,会去调用底层C语言的库;

native关键字修饰的方法会进入本地方法栈,然后调用本地方法,本地接口;

程序计数器

每个线程都有一个程序计数器,是线程私有的,相当于一个指针,指向方法区中方法的字节码,在执行引擎读取下一条指令。是一个非常小的内存空间。

方法区

所有线程共享,所有字段和方法字节码,以及一些特殊方法,

所有定义的方法的信息都保存在该区域,属于共享空间。

静态变量,常量,类信息,运行时的常量池,实例变量存在堆内存中,和方法无关

main函数最先被压入栈中,最后弹出;

栈存放的内容

八大基本类型;

对象引用;

实例方法;

程序正在执行的方法,一定在栈的顶部;

Heap,一个JVM只有一个堆内存,堆内存大小是可以调节的。类加载器读取了类文件后,一般把类的实例放在堆中,即堆保存的是引用类型的真实对象;

堆分为三个区域

1、新生区:伊甸园,幸存0区,幸存1区

2、养老区

3、永久存储区

垃圾回收种类:轻GC,重GC,垃圾回收一般在伊甸园区和养老区

堆内存满的话,会出现OOM错误  java.lang.OutOfMemoryError:Java heap space

出现的几种情况

1、一个启动类加载了大量第三方jar包

2、Tomcat部署了太多应用

3、大量动态生成反射类

永久区:也叫元空间,存放jdk自带的Class对象,interface元数据,存放的是Java运行时的一些环境或者类信息,不能被回收;

面试题:在写程序的过程中,遇见过OOM吗?怎么解决的?
1、尝试扩大堆内存,看效果
2、使用专业工具分析内存,看一下那个地方出现了问题

1、JVM回收算法和回收器,CMS采用哪种回收算法,怎么解决内存碎片问题?

2、类加载过程

3、JVM分区

4、eden区,survial区?

5、JAVA虚拟机的作用?

6、GC中如何判断对象需要被回收?

7、JAVA虚拟机中,哪些可作为ROOT对象?

8、JVM内存模型是什么?

9、jvm是如何实现线程?

10、jvm最大内存限制多少

11、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

12、描述一下JVM加载class文件的原理机制?

❤10、GC

什么是垃圾回收

释放垃圾占用的空间,防止内存泄漏;

做垃圾回收,必须知道哪些是垃圾

1、引用计数法

通过在对象头中分配一个空间来保存该对象被引用的计数如果该对象被其他对象引用,则引用计数加一,如果删除对该对象的引用,则减一,当引用计数为0时,就会被回收;

缺点:出现相互引用的那种对象

2、可达性分析算法

通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,当一个对象到GC Roots没有任何引用链相连时,则证明该对象是不可用的;

GC Root 的对象

1、栈中引用的对象;

2、方法区中类静态属性引用的对象;

3、方法区中常量引用的对象;

4、本地方法栈中引用的对象;

回收垃圾算法:

1、标记清除算法

2、复制算法

3、标记整理算法

4、分代收集算法分代收集算法

1、java中内存泄露是啥,什么时候出现内存泄露?

内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。但内存泄漏堆积后的后果就是内存溢出

内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

2、minor gc如果运行的很频繁,可能是什么原因引起的,minor gc如果运行的很慢,可能是什么原因引起的?

minor gc运行的很频繁可能是什么原因引起的?

1、 产生了太多朝生夕灭的对象导致需要频繁minor gc

2、 新生代空间设置的比较小

minor gc运行的很慢有可能是什么原因引起的?

1、 新生代空间设置过大。

2、 对象引用链较长,进行可达性分析时间较长。

3、 新生代survivor区设置的比较小,清理后剩余的对象不能装进去需要移动到老年代,造成移动开销。

3、阐述GC算法

4、GC是什么? 为什么要有GC?

5、垃圾回收的优点和原理。并考虑2种回收机制

两种常见的回收机制:

定时回收,当垃圾占到某个百分比的时候,进行回收

6、java中会存在内存泄漏吗,请简单描述。

7、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?(垃圾回收)

不可达对象时,GC就有责任回收;调用System.GC 通知GC运行,但是并不能保证GC一定会执行

❤11、IO和NIO、AIO

1、怎么打印日志?

2、运行时异常与一般异常有何异同?

3、error和exception有什么区别?

==Exception是java程序运行中可预料的异常情况,咱们可以获取到这种异常,并且对这种异常进行业务外的处理。==

==Error是java程序运行中不可预料的异常情况,这种异常发生以后,会直接导致JVM不可处理或者不可恢复的情况。所以这种异常不可能抓取到,比如OutOfMemoryError、NoClassDefFoundError等。==

4、给我一个你最常见到的runtime exception

空指针

5、Java中的异常处理机制的简单原理和应用。

6、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

7、什么是java序列化,如何实现java序列化?

8、运行时异常与受检异常有什么区别?

二、JavaEE部分

附加Redis

什么是Redis

基于内存的亦可数据持久化的高性能的非关系型(NoSQL)的键值对数据库。

优点

读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。

支持数据持久化,支持AOF和RDB两种持久化方式。

支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。

数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。

支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

Redis有哪些数据类型

String,List,Set,Zset,Hash

持久化

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

Redis 的持久化机制

Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:

RDB:是Redis DataBase缩写快照

RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

AOF:持久化

AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。

当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

Redis的过期键的删除策略

Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理。

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。
  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。
  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

Redis中同时使用了惰性过期和定期过期两种过期策略。

Redis的内存淘汰策略

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。

全局的键空间选择性移除

  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。

设置过期时间的键空间选择性移除

  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

缓存异常

缓存雪崩

缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

缓存击穿

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

缓存降级

当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

❤1、Spring

1、说一下IOC和AOP?

AOP

可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术

主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等,解决代码复用。

实现:

AOP:【动态代理】
          指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
  
  1、导入aop模块;Spring AOP:(spring-aspects)
  2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)
  3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;
          通知方法:
              前置通知(@Before):logStart:在目标方法(div)运行之前运行
              后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
              返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
              异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
              环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())
  4、给切面类的目标方法标注何时何地运行(通知注解);
  5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
  6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
  7、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
          在Spring中很多的 @EnableXXX;
  
  三步:
      1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)
      2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)
      3)、开启基于注解的aop模式;@EnableAspectJAutoProxy

IOC

控制反转,有时候也被称为DI依赖注入,它是一种降低对象耦合关系的一种设计思想。

它并不是一种技术实现,而是一种设计思想。在任何一个项目中,会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等等)。

注入方式:*构造方法注入,set注入,基于注解的注入*

实现原理:使用反射机制+XML技术

image.png

IOC是解耦,提供一种构造对象的方式,使得一种功能能有多种实现,且不构成依赖。spring 的IOC的缺点:占用内存多、构造对象慢、启动慢。springAOP是提供一种基于spring框架的切面编程企业级解决方案,虽然这个已经很强大,但是依然还是没有aspectj强大,比如:目前还不支持流程切面。织入慢执行效率低、不支持new关键字创建的对象的切入,必须使用bean factory织入。

2、介绍一下bean的生命周期

3、Spring里面注解用过没有?autowired 和resource区别?

4、@Controller和@RestController的区别?

5、依赖注入的方式有几种,哪几种?

6、springIOC原理?自己实现IOC要怎么做,哪些步骤?

7、Spring中BeanFactory和ApplicationContext的区别?、

8、什么是IoC和DI?DI是如何实现的?

9、请问Spring中Bean的作用域有哪些?

10、谈谈Spring中自动装配的方式有哪些?

11、aop的应用场景?

12、AOP的原理是什么?

13、你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?

14、Spring支持的事务管理类型有哪些?你在项目中使用哪种方式?

15、介绍一下spring?

16、Struts拦截器和Spring AOP区别?

17、spring框架的优点?

18、选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?

19、持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些?

❤2、Hibernate

1、阐述实体对象的三种状态以及转换关系。

2、Hibernate中SessionFactory是线程安全的吗?Session是线程安全的吗(两个线程能够共享同一个Session吗)?

3、Hibernate中Session的load和get方法的区别是什么?

4、如何理解Hibernate的延迟加载机制?在实际应用中,延迟加载与Session关闭的矛盾是如何处理的?

4、简述Hibernate常见优化策略。

5、锁机制有什么用?简述Hibernate的悲观锁和乐观锁机制。

6、Hibernate如何实现分页查询?

7、谈一谈Hibernate的一级缓存、二级缓存和查询缓存。

❤3、Struts

1、说说STRUTS的应用

❤4、Mybatis

1、解释一下MyBatis中命名空间(namespace)的作用。

2、MyBatis中的动态SQL是什么意思?

❤5、MVC

1、Spring MVC注解的优点

2、springmvc和spring-boot区别?

3、SpringMVC的运行机制,运行机制的每一部分的相关知识?

4、谈谈Spring MVC的工作原理是怎样的?

❤6、各框架对比与项目优化

1、Mybatis和Hibernate区别?

2、介绍一下你了解的Java领域的Web Service框架。

❤7、JPA

1、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。

2、EJB与JAVA BEAN的区别?

3、EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的?

4、EJB的角色和三个对象是什么?

5、说说EJB规范规定EJB中禁止的操作有哪些?

6、EJB的激活机制是什么?

7、EJB的几种类型分别是什么

8、EJB需直接实现它的业务接口或Home接口吗,请简述理由。

三、Java web编程

❤1、web编程基础

1、启动项目时如何实现不在链接里输入项目名就能启动?

2、1分钟之内只能处理1000个请求,你怎么实现,手撕代码?

3、什么时候用assert

4、JAVA应用服务器有那些?

5、JSP的内置对象及方法。

6、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?(JSP)

7、说一说四种会话跟踪技术

8、讲讲Request对象的主要方法

9、说说weblogic中一个Domain的缺省目录结构?比如要将一个简单的helloWorld.jsp放入何目录下,然后在浏览器上就可打入主机?

10、jsp有哪些动作?作用分别是什么?

11、请谈谈JSP有哪些内置对象?作用分别是什么?

12、说一下表达式语言(EL)的隐式对象及其作用

13、JSP中的静态包含和动态包含有什么区别?

14、过滤器有哪些作用和用法?

15、请谈谈你对Javaweb开发中的***的理解?

16、说说web.xml文件中可以配置哪些内容?

❤2、web编程进阶

1、forward与redirect区别,说一下你知道的状态码,redirect的状态码是多少?

2、servlet生命周期,是否单例,为什么是单例。

3、说出Servlet的生命周期,并说出Servlet和CGI的区别。

4、Servlet执行时一般实现哪几个方法?

5、阐述一下阐述Servlet和CGI的区别?

6、说说Servlet接口中有哪些方法?

7、Servlet 3中的异步处理指的是什么?

8、如何在基于Java的Web项目中实现文件上传和下载?

9、服务器收到用户提交的表单数据,到底是调用Servlet的doGet()还是doPost()方法?

10、Servlet中如何获取用户提交的查询参数或表单数据?

11、Servlet中如何获取用户配置的初始化参数以及服务器上下文参数?

12、讲一下redis的主从复制怎么做的?

13、redis为什么读写速率快性能好?

14、redis为什么是单线程?

15、缓存的优点?

16、aof,rdb,优点,区别?

17、redis的List能用做什么场景?

18、说说MVC的各个部分都有那些技术来实现?如何实现?

19、什么是DAO模式?

20、请问Java Web开发的Model 1和Model 2分别指的是什么?

21、你的项目中使用过哪些JSTL标签?

22、使用标签库有什么好处?如何自定义JSP标签?(JSP标签)

❤3、web编程原理

1、get和post区别?

2、请谈谈转发和重定向的区别?

3、说说你对get和post请求,并且说说它们之间的区别?

4、cookie 和session 的区别?

5、forward 和redirect的区别

6、BS与CS的联系与区别。

7、如何设置请求的编码以及响应内容的类型?

8、什么是Web Service(Web服务)?

9、谈谈Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法分别是做什么的?有什么区别?

10、大型网站在架构上应当考虑哪些问题?

11、请对J2EE中常用的名词进行解释(或简单描述)

四、JDBC(MySQL)编程

❤1、SQL基础

1、写SQL:找出每个城市的最新一条记录。

2、一个学生表,一个课程成绩表,怎么找出学生课程的最高分数

3、有一组合索引(A,B,C),会出现哪几种查询方式?tag:sql语句

❤2、JDBC基础

1、数据库水平切分,垂直切分

2、数据库索引介绍一下。介绍一下什么时候用Innodb什么时候用MyISAM。

==MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。==

==Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。==

3、数据库两种引擎

==Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。==

==MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。==

4、索引了解嘛,底层怎么实现的,什么时候会失效

==b+树,不符合最左前缀匹配原则,where中有or,!=,is null==

5、问了数据库的隔离级别

==读未提交,读已提交,可重复提交,串行化,级别由低到高==

==MySQL默认读已提交==

6、数据库乐观锁和悲观锁

==悲观锁:当一条数据被修改时,都以为别人会修改,所以必须加上锁,再来进行修改,叫做悲观并发控制==

==实现:1、MySQL的行锁,读锁,写锁都是悲观锁 2、Java中的Synchronized关键字==

==乐观锁:每次拿数据时都不会认为别人会修改,不用加上锁,但是在数据更新的时候会先判断数据是否冲突,冲突即返回错误信息给用户,让用户决定如何去做;==

==实现:1、CAS,juc Atomic包下的原子变量 2、版本号控制==

7、数据库的三范式?

8、讲一下数据库ACID的特性?

==原子性,一致性,隔离性,持久性==

9、mysql主从复制?

==对主服务器的数据库进行操作时,同时对从服务器数据库进行相同的操作,然后进行,读写分离,加快处理速度==

10、leftjoin和rightjoin的区别?

==leftjoin,左边所有,右边符合条件的交集数据==

==rightjoin,右边所有,左边符合条件的交集数据==

11、数据库优化方法

==1、索引,2、SQL语句优化,3、创建表时,创建合适的字段类型==

12、谈一下你对继承映射的理解。

13、说出数据连接池的工作机制是什么?

==数据库初始化时创建一定数量的数据库连接放在连接池中,这些数量是由数据库最小连接数量来决定的,无论是否使用,都一直保存这么多数量;当连接满了之后,请求的连接将进入到等待队列;==

14、事务的ACID是指什么?

15、JDBC中如何进行事务处理?

==由Connection提供事务处理,可以调用setAutoCommit(false)设置手动事务处理;事务完成后使用commit来提交事务;当事务出错时,可以使用rollback()回滚到之前的状态;jdbc3.0之后还可以savepoint来,可以让事务回到保存点;==

❤3、JDBC进阶

1、JDBC的反射,反射都是什么?

==jdbc加载驱动时,需要用到反射,动态的加载驱动;==

2、Jdo是什么?

3、Statement和PreparedStatement有什么区别?哪个性能更好?

==PreparedStatement相对于Statement;采取预编译的方式,可以带参数,尽可能的避免SQL注入攻击和字符串拼接的麻烦;数据库还能对预编译语句进行缓存,下一次执行相同结构的语句时能更快;==

4、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?

==大数据时,使用结果集的setfitchsize来设置大小;大量数据插入时,使用批量插入的方法;==

五、XML

❤1、XML基础

1、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

❤2、Web Service

1、WEB SERVICE名词解释,JSWDL开发包的介绍,JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

2、请你谈谈对SOAP、WSDL、UDDI的了解?

3、谈谈Java规范中和Web Service相关的规范有哪些?

六、计算机网络

七层模型:自上而下:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

五层的模型:物理层,数据链路层,网络层,传输层,应用层

TCP/IP四层模型:数据链路层,网络层,传输层,应用层

SYN表示建立连接,

FIN表示关闭连接,

ACK表示响应,

PSH表示有 DATA数据传输,

RST表示连接重置。

三次握手

(1)首先客户端向服务器端发送一段标记位为SYN,序号为Seq=X的TCP报文,其中:

(2)服务器端接收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段标志位为SYN和ACK=x+1,序号为Seq=y的TCP报文

(3)客户端接收到来自服务器端的确认收到数据的TCP报文之后,明确了从客户端到服务器的数据传输是正常的,并返回最后一段Ack=y+1,Seq=x+1的TCP报文。

服务器收到来自客户端的“确认收到服务器数据”的TCP报文之后,明确了从服务器到客户端的数据传输是正常的。结束SYN-SENT阶段,进入ESTABLISHED阶段。

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成。

四次挥手:

  1. 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
  2. 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
  3. 由B 端再提出反方向的关闭请求,将FIN置1。
  4. 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。

TCP:面向连接的,可靠的字节流服务;传输之前,先要确定TCP连接,确认后才能开始传输,并且可以超时重新发送,检验重复数据检验数据,流量控制,保证一端向另一端进行安全传输;

UDP:简单的面向数据报的运输层协议;不提供可靠性;不能保证数据是否到达了目的地,由于没有连接确认机制,和超时重发,所以传输速度很快;

简要:

不同:报头不同,协议不同,特点不同;

UDP 8个字节报头;TCP 20字节报头

❤1、网络概述

1、TCP协议在哪一层?IP协议在那一层?HTTP在哪一层?

运输层;网络层;应用层;

❤2、运输层

1、讲一下TCP的连接和释放连接。

2、TCP有哪些应用场景

3、tcp为什么可靠

==[1] 确认和重传机制==

==建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础==
==传输过程中,如果Checksum校验失败、丢包或延时,发送端重传==
==[2] 数据排序==

==TCP有专门的序列号SN字段,可提供数据re-order==
==[3] 流量控制==

==窗口和计时器的使用。TCP窗口中会指明双方能够发送接收的最大数据量==
==[4] 拥塞控制==

==TCP的拥塞控制由4个核心算法组成。==

==“慢启动”(Slow Start)==

==“拥塞避免”(Congestion avoidance)==

==“快速重传 ”(Fast Retransmit)==

==“快速恢复”(Fast Recovery)==

4、tcp为什么要建立连接

5、阐述TCP的4次挥手

6、讲一下浏览器从接收到一个URL到最后展示出页面,经历了哪些过程。tag

==1、在浏览器地址栏中输入URL==

==2、DNS域名解析,获得域名相对应的IP地址。==

==3、浏览器向服务器发起TCP连接,与浏览器建立TCP三次握手==

==4、浏览器向服务器发送HTTP请求,请求数据包==

==5、服务器处理收到的请求==

==6、返回相应结果至浏览器==

==7、关闭TCP连接==

==8、浏览器解析渲染页面==

7、http和https的区别

8、http的请求有哪些,应答码502和504有什么区别

9、http1.1和1.0的区别

10、说说ssl四次握手的过程

11、304状态码有什么含义?

❤3、网络层

1、arp协议,arp攻击

2、icmp协议

3、讲一下路由器和交换机的区别?

❤4、应用层

1、DNS寻址过程

2、负载均衡反向***模式优点及缺点

七、操作系统

❤1、操作系统概论

1、CentOS 和 Linux的关系?

2、64位和32位的区别?

❤2、进程的描述与控制

进程通信

==1、管道====
==管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制;==
==2、信号==
==比较复杂的通信方式,用于通知接收进程有某种事件发生;==
==3、报文消息队列==
==消息的链接表,进入队列,取出队列中的消息;==
==4、共享内存==
==多个进程间共享一块内存空间;==
==5、信号量==
==进程间或者同一进程不同线程间的同步功能;==
==6、套接口==
一般的进程间通信机制,可用于不同机器之间的进程间的通信==

1、怎么杀死进程?

2、线程,进程区别

3、系统线程数量上限是多少?

4、进程和线程的区别是什么?

5、解释一下LINUX下线程,GDI类。

❤3、输入输出系统

1、socket编程,BIO,NIO,epoll?

❤4、存储器管理

1、什么是页式存储?

2、操作系统里的内存碎片你怎么理解,有什么解决办法?

❤5、处理机调度与死锁

1、什么情况下会发生死锁,解决策略有哪些?

2、系统CPU比较高是什么原因?

3、系统如何提高并发性?

八、算法与数据结构

❤1、哈希

1、hashset存的数是有序的吗?

2、Object作为HashMap的key的话,对Object有什么要求吗?

3、一致性哈希算法

4、什么是hashmap?

5、Java中的HashMap的工作原理是什么?

6、hashCode()和equals()方法的重要性体现在什么地方?

❤2、树

1、说一下B+树和B-树?

2、怎么求一个二叉树的深度?手撕代码?

3、算法题二叉树层序遍历,进一步提问:要求每层打印出一个换行符

4、二叉树任意两个节点之间路径的最大长度

5、如何实现二叉树的深度?

6、如何打印二叉树每层的节点?

7、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

❤3、遍历

1、编程题:写一个函数,找到一个文件夹下所有文件,包括子文件夹

2、二叉树 Z 字型遍历

❤4、链表

1、反转单链表

2、随机链表的复制

3、链表-奇数位升序偶数位降序-让链表变成升序

4、bucket如果用链表存储,它的缺点是什么?

5、如何判断链表检测环

❤5、数组

1、寻找一数组中前K个最大的数

2、求一个数组中连续子向量的最大和

3、找出数组中和为S的一对组合,找出一组就行

4、一个数组,除一个元素外其它都是两两相等,求那个元素?

5、算法题:将一个二维数组顺时针旋转90度,说一下思路。

❤6、排序

1、排序算法知道哪些,时间复杂度是多少,解释一下快排?

2、如何得到一个数据流中的中位数?

3、堆排序的原理是什么?

4、归并排序的原理是什么?

5、排序都有哪几种方法?请列举出来。

6、如何用java写一个冒泡排序

❤7、堆与栈

1、堆与栈的不同是什么?

2、heap和stack有什么区别。

3、解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。

❤8、队列

1、什么是Java优先级队列(Priority Queue)?

❤9、高级算法

1、题目:

Design and implement a data structure for Least Frequently Used (LFU) ***. It should support the following operations: get and put.

get(key) - Get the value (will always be positive) of the key if the key exists in the ***, otherwise return -1.

put(key, value) - Set or insert the value if the key is not already present. When the *** reaches its capacity, it should invalidate the least frequently used item before inserting a new item. For the purpose of this problem, when there is a tie (i.e., two or more keys that have the same frequency), the least recently used key would be evicted.

Could you do both operations in O(1) time complexity?

2、id全局唯一且自增,如何实现?

3、如何设计算法压缩一段URL?

4、为什么要设计后缀表达式,有什么好处?

5、LRU算法的实现原理?

九、设计模式

工厂模式

工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

单例模式

单例模式是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

**意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。

应用实例:

  • 1、一个班级只有一个班主任。
  • 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。
  • 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

适配器模式

适配器模式是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

**意图:**将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

代理模式

在代理模式中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

**意图:**为其他对象提供一种代理以控制对这个对象的访问。

应用实例: 1、Windows 里面的快捷方式。 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 3、买火车票不一定在火车站买,也可以去代售点。 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。 5、spring aop。

策略模式

在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

**意图:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

应用实例: 1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3、JAVA AWT 中的 LayoutManager。

MVC 模式

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。

  • Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
  • View(视图) - 视图代表模型包含的数据的可视化。
  • Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。

❤1、结构型模式

1、java中有哪些***模式?

2、如何实现动态***

3、IO流熟悉吗,用的什么设计模式?

❤2、创建型模式

1、介绍一下单例模式?懒汉式的单例模式如何实现单例?

❤3、行为型模式

1、介绍一下策略模式?

2、设计模式了解哪些,手写一下观察者模式?

❤4、模式汇总

1、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法

2、j2ee常用的设计模式?说明工厂模式。

3、开发中都用到了那些设计模式?用在什么场合?

4、简述一下你了解的Java设计模式

十、场景题

❤1、场景题汇总

1、情景题:如果一个外卖配送单子要发布,现在有200个骑手都想要接这一单,如何保证只有一个骑手接到单子?
2、场景题:美团首页每天会从10000个商家里面推荐50个商家置顶,每个商家有一个权值,你如何来推荐?第二天怎么更新推荐的商家?
可以借鉴下stackoverflow,视频网站等等的推荐算法
3、场景题:微信抢红包问题
悲观锁,乐观锁,存储过程放在mysql数据库中。
4、场景题:1000个任务,分给10个人做,你怎么分配,先在纸上写个最简单的版本,然后优化。
全局队列,把1000任务放在一个队列里面,然后每个人都是取,完成任务。
分为10个队列,每个人分别到自己对应的队列中去取务。
5、场景题:保证发送消息的有序性,消息处理的有序性。
6、如何把一个文件快速下发到100w个服务器
7、给每个组分配不同的IP段,怎么设计一种结构使的快速得知IP是哪个组的?
8、10亿个数,找出最大的10个。
建议一个大小为10的小根堆。
9、有几台机器存储着几亿淘宝搜索日志,你只有一台2g的电脑,怎么选出搜索热度最高的十个搜索关键词?
10、分布式集群中如何保证线程安全?
11、给个淘宝场景,怎么设计一消息队列?
12、10万个数,输出从小到大?
先划分成多个小文件,送进内存排序,然后再采用多路归并排序
13、有十万个单词,找出重复次数最高十个?

十一、UML

❤1、UML

1、请你谈一下UML中有哪些常用的图?

0

评论区