Java面试题汇总2018

基本概念

(1)操作系统中 heap 和 stack 的区别

heap:堆,先进先出

stack:栈,先进后出 

 

(2)什么是基于注解的切面实现

@Transctional

 

(3)什么是 对象/关系 映射集成模块

orm 对象关系映射,如hibernate,mybatis

 

(4)什么是 Java 的反射机制

指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制.

 

(5)什么是 ACID

A        原子性

C       一致性

I         隔离性

D        持久性

 

 

(6)BS与CS的联系与区别

BS 浏览器与服务器的模式

CS 客户端与服务端的模式

 

(6)Cookie 和 Session的区别

cookie保存在浏览武器端的信息

session是保存在服务器端的信息,为了解决网络连接无状态的问题。

 

(6)fail-fast 与 fail-safe 机制有什么区别

https://blog.csdn.net/ch717828/article/details/46892051

什么是 fail-fast 机制?

fail-fast机制在遍历一个集合时,当集合结构被修改,会抛出Concurrent Modification Exception。

fail-fast会在以下两种情况下抛出ConcurrentModificationException

①单线程环境

集合被创建后,在遍历它的过程中修改了结构。

注意 remove()方法会让expectModcount和modcount 相等,所以是不会抛出这个异常。

②多线程环境

当一个线程在遍历这个集合,而另一个线程对这个集合的结构进行了修改。

----

fail-safe任何对集合结构的修改都会在一个复制的集合上进行修改,因此不会抛出ConcurrentModificationException

fail-safe机制有两个问题

①需要复制集合,产生大量的无效对象,开销大

②无法保证读取的数据是目前原始数据结构中的数据

总结:

fail-fast:包括:

 

 HashMap,Vector,ArrayList,HashSet

fail-safe包括:
CopyOnWriteArrayList,
ConcurrentHashMap
 

(7)线程sleep和wait的区别

①这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。


最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。


闪使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }


④、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

(8)equals()方法的特性

equals方法实现了等价关系,重载时要遵守的通用约定:

a.自反性(reflexive)  对于任何非null的引用值x, x.equals(x)必须返回true。

b.对称性(symmetric)  对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true

c.传递性(transitive)   对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true

d.一致性      对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者一致地返回false

e.对于任何非null的引用值x,x.equals(null)必须返回false

 

(9)get 和 post请求的区别

最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

(10)Interface 与 abstract 类的区别

​​​​

下面比较一下两者的语法区别:

a.抽象类可以有构造方法,接口中不能有构造方法。

b.抽象类中可以有普通成员变量,接口中没有普通成员变量

c.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。

d. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然

eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。

e. 抽象类中可以包含静态方法,接口中不能包含静态方法

f. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

g. 一个类可以实现多个接口,但只能继承一个抽象类。

 

(11)IOC的优点是什么

优点:实现组件之间的解耦,提高程序的灵活性和可维护性。

缺点:

1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。

2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。

3、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。

(12)IO 和 NIO的区别,NIO优点

IONIO
面向Stream面向Buffer
阻塞IO非阻塞IO
 Selectors

 

(13)BIO与NIO、AIO的区别

https://blog.csdn.net/skiof007/article/details/52873421?utm_source=blogxgwz4

BIO是一个连接一个线程。

NIO是一个请求一个线程。

AIO是一个有效请求一个线程。

Java对BIO、NIO、AIO的支持:

  • Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。

  • Java NIO : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。

  • Java AIO(NIO.2) : 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理,

BIO、NIO、AIO适用场景分析:

  • BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

  • NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

  • AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么久一直等着,知道传输完毕为止。
非阻塞概念:应用程序直接可以获取已经准备就绪好的数据,无需等待。(从操作系统缓冲区中直接读取已经缓冲完毕的数据,不用阻塞等待数据缓冲完毕,可以在这段时间中做其他事)

同步和异步的区别:

同步:应用程序会直接参与IO读写操作,并且应用程序会直接阻塞到某个方法上,知道数据准备就绪;或者采用轮询的策略实时检查数据的就绪状态,如果就绪则获取数据。
异步:所有的IO读写交给操作系统处理,于应用程序没有直接关系,程序不需要关心IO读写,当操作系统完成了IO读写时,会给应用程序发送通知,应用程序直接拿走数据即可。
 

(14)Java 8 / Java 7 为我们提供了什么新功能

​​​​​​

Java7 新特性

1.switch中可以使用字符串了

2.运用List<String> tempList = new ArrayList<>();即泛型实例化类型自动推断

3.语法上支持集合,而不一定是数组

final List<Integer> list = [1,2,3,4,5,6]

4.新增一些取环境信息的工具方法

1

2

3

4

File System.getJavaIoTempDir() // IO临时文件夹 

File System.getJavaHomeDir() // JRE的安装目录 

File System.getUserHomeDir() // 当前用户目录 

File System.getUserDir() // 启动java进程时所在的目录5 

Java8新特性

1.Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:

1

2

3

4

5

6

interface Formula { 

    double calculate(int a);   

     default double sqrt(int a) { 

        return Math.sqrt(a); 

    

}

 2.lambda表达式

3.函数式接口

 

 

​​​​​​​(15)什么是竞态条件? 举个例子说明。

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。导致竞态条件发生的代码区称作临界区。在临界区中使用适当的同步就可以避免竞态条件。 界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。​​​​​​​

 

​​​​​​​(16)JRE、JDK、JVM 及 JIT 之间有什么不同

​​​​​​​JRE java runtime environment 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。
JDK java development kit  代表 Java 开发工具包(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。 不仅包含了jre,还有compiler,debugger等等,相当于eclipse。
JVM  java virtue machine 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。
JIT  代表即时编译(Just In Time compilation),当代码执行的次数超过一定的阈值时,会将 Java 字节码转换为本地代码。
 

 

(17)MVC的各个部分都有那些技术来实现?如何实现?

  •  
  •  

(18)RPC 通信和 RMI 区别​​​​​​​

https://www.cnblogs.com/ygj0930/p/6542811.html

 RPC(Remote Procedure Call Protocol)远程过程调用协议,通过网络从远程计算机上请求调用某种服务。

 RMI:远程方法调用(Remote Method Invocation)。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。

RPC与RMI的区别

 1:方法调用方式不同:

 RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用

  RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。

  2:适用语言范围不同:

   RMI只用于Java;

   RPC是网络服务协议,与操作系统和语言无关。

  3:调用结果的返回形式不同:

    Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;

    RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。

--------

 

(19)什么是 Web Service(Web服务)

  •  
  •  

(20)JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

  •  
  •  

(21)WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。

  •  
  •  

(22)一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制

  •  
  •  

(23)​​​​​​​简单说说你了解的类加载器。是否实现过类加载器

https://blog.csdn.net/javazejian/article/details/73413292

加载:类加载过程的一个阶段:通过一个类的完全限定查找此类字节码文件,并利用字节码文件创建一个Class对象

验证:目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。

准备:为类变量(即static修饰的字段变量)分配内存并且设置该类变量的初始值即0(如static int i=5;这里只将i初始化为0,至于5的值将在初始化时赋值),这里不包含用final修饰的static,因为final在编译的时候就会分配了,注意这里不会为实例变量分配初始化,类变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。

解析:主要将常量池中的符号引用替换为直接引用的过程。符号引用就是一组符号来描述目标,可以是任何字面量,而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。有类或接口的解析,字段解析,类方法解析,接口方法解析(这里涉及到字节码变量的引用,如需更详细了解,可参考《深入Java虚拟机》)。

初始化:类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)。

这便是类加载的5个过程,而类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为一个与目标类对应的java.lang.Class对象实例,在虚拟机提供了3种类加载器,引导(Bootstrap)类加载器、扩展(Extension)类加载器、系统(System)类加载器(也称应用类加载器),下面分别介绍

----------

 

加载器

来自http://blog.csdn.net/cutesource/article/details/5904501


JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。
 

 

(24)​​​​​​​解释一下什么叫AOP(面向切面编程)

  •  
  •  

(25)​​​​​​​​​​​​​​请简述 Servlet 的生命周期及其相关的方法

​​​​​init方法

        在一个Servlet的生命周期中,init方法只会被执行一次,之后无论用户执行多少次请求,都不会在调用该方法。 
        关于init方法的执行时机,有两种方式可选,一般的是在服务器启动后第一个用户请求改Servlet是调用,你也可以设置该Servlet在服务器启动后自动执行。 
init方法负责简单的创建或者加载一些数据,这些数据将用于该Servlet的整个生命周期中。

service方法
        当一个客户请求改Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。 
        每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
        service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。

destroy方法
        该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。

doGet、doPost方法
        实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。
 

(26)请简述一下 Ajax 的原理及实现步骤

​​​​​​​    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。

第一步:创建XMLHttpRuquest对象; 
第二步:注册回调方法 
第三步:设置和服务器交互的相应参数 
第四步:设置向服务器端发送的数据,启动和服务器端的交互 
第五步:判断和服务器端的交互是否完成,还要判断服务器端是否返回正确的数据

 

(27)简单描述Struts的主要功能

  •  
  •  

(28)什么是 N 层架构

  •  
  •  

(29)什么是CORBA?用途是什么

​​​​​​​CORBA:Common Object Request Broker Architecture,通用对象请求代理体系。是由对象管理组(Object Management Group, OMG)制定的一种标准的面向对象分布式应用程序体系规范,旨在为异构分布式环境中,硬件和软件系统的互联而提出的一种解决方案。
 

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

  •  
  •  

(31)什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配

  •  
  •  

(32)​​​​​​​什么是懒加载(Lazy Loading)

  •  
  •  

(33)​​​​​​​​​​​​​​什么是尾递归,为什么需要尾递归

​​​​​​​尾调用是指一个函数里的最后一个动作是一个函数调用的情形:即这个调用的返回值直接被当前函数返回的情形。这种情形下该调用位置为尾位置。

 

(34)​​​​​​​​​​​​​​什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)

  •  

关键字

(35)​​​​​​​​​​​​​​finalize

  •  

什么是finalize()方法

  •  
  1.  

finalize()方法什么时候被调用

  1.  
  2.  

析构函数(finalization)的目的是什么

  1.  
  2.  

Java中final、finally和finalize的区别

final修饰符(关键字)。被final修饰的类,就意味着不能再派生出新的子类,不能作为父类而被子类继承。因此一个类不能既被abstract声明,又被final声明。将变量或方法声明为final,可以保证他们在使用的过程中不被修改。被声明为final的变量必须在声明时给出变量的初始值,而在以后的引用中只能读取。被final声明的方法也同样只能使用,即不能方法重写。
 

finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获,finally块都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生,都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,就可以放在finally块中。

finalize是方法名。java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者被执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的
--------------------- ​​​​​​​

final

  1.  
  •  

final关键字有哪些用法

  •  
  1.  

final 与 static 关键字可以用于哪里?它们的作用是什么

  1.  
  2.  

final, finally, finalize的区别

  1.  
  2.  

final、finalize 和 finally 的不同之处?

  1.  
  •  

能否在运行时向 static final 类型的赋值

  •  
  1.  

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变

  1.  
  2.  

一个类被声明为final类型,表示了什么意思

  1.  
  2.  

throws, throw, try, catch, finally分别代表什么意义

1)throw:抛出异常。

2)throws:在方法声明处使用,表示此方法不处理异常,而在调用此方法处处理异常。

Exception是必须处理的,而RuntimeException异常是可以不处理的。但是为了保证程序正常运行,最好处理。

如果自定义异常,直接继承异常即可。

 

Java 有几种修饰符?分别用来修饰什么
volatile

  •  

volatile 修饰符的有过什么实践

  •  
  •  

volatile 变量是什么?volatile 变量和 atomic 变量有什么不同

  •  
  •  

volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗

  •  
  •  

能创建 volatile 数组吗?

  •  

transient变量有什么特点
super什么时候使用
public static void 写成 static public void会怎样
说明一下public static void main(String args[])这段声明里每个关键字的作用
请说出作用域public, private, protected, 以及不写时的区别
sizeof 是Java 的关键字吗
static

  •  

static class 与 non static class的区别

  •  
  •  

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

  •  
  •  

静态类型有什么特点

  •  
  •  

(99)main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态

​​​​​​​static静态方法是存储在静态存储区内的,可以通过类.方法名直接进行调用,不需要进行实例化。
假设不使用static,那么main()方法在调用时必须先对其实例化,而main()做为程序的主入口显然不可能先对其实例化,所以使用static修饰,可以更方便的直接用类.main()对其调用。
--------------------- 
 

是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用

  •  
  •  

静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢

  •  
  •  

成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量

  •  

switch

  •  

switch 语句中的表达式可以是什么类型数据

  •  
  •  

switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上

  •  
  •  

while 循环和 do 循环有什么不同

  •  

操作符

  •  

&操作符和&&操作符有什么区别?

  •  
  •  

a = a + b 与 a += b 的区别?

  •  
  •  

逻辑操作符 (&,|,^)与条件操作符(&&,||)的区别

  •  
  •  

3*0.1 == 0.3 将会返回什么?true 还是 false?

  •  
  •  

float f=3.4; 是否正确?

  •  
  •  

short s1 = 1; s1 = s1 + 1;有什么错?

  •  

数据结构

基础类型(Primitives)

  •  

基础类型(Primitives)与封装类型(Wrappers)的区别在哪里

  •  
  •  

简述九种基本数据类型的大小,以及他们的封装类

 

 

基本类型大小(字节)默认值封装类
byte1(byte)0Byte
short2(short)0Short
int40Integer
long80LLong
float40.0fFloat
double80.0dDouble
boolean-falseBoolean
char2\u0000(null)Character
void--Void

 

 

 

 

 

 

 

 

 

 

 

int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到

  •  
  •  

float和double的默认值是多少

  •  
  •  

如何去小数四舍五入保留小数点后两位

  •  
  •  

char 型变量中能不能存贮一个中文汉字,为什么

char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,
 * 所以,char型变量中当然可以存储汉字啦。不过,如果某个特殊的汉字没有被包含在
 * unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字。补充
 * 说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。


 

  •  

类型转换

  •  

怎样将 bytes 转换为 long 类型

  •  
  •  

怎么将 byte 转换为 String

  •  
  •  

如何将数值型字符转换为数字

  •  
  •  

我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象

  •  
  •  

能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗

  •  
  •  

类型向下转换是什么

  •  

数组

  •  

如何权衡是使用无序的数组还是有序的数组

  •  
  •  

怎么判断数组是 null 还是为空

  •  
  •  

怎么打印数组? 怎样打印数组中的重复元素

  •  
  •  

(99)Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList

https://www.cnblogs.com/wangbin2188/p/6524200.html

1)精辟阐述:
可以将 ArrayList想象成一种“会自动扩增容量的Array”。

2)Array([]):最高效;但是其容量固定且无法动态改变;
     ArrayList:  容量可动态增长;但牺牲效率;

3)建议:
基于效率和类型检验,应尽可能使用Array无法确定数组大小时才使用ArrayList
不过当你试着解决更一般化的问题时,Array的功能就可能过于受限。

4)Java中一切皆对象,Array也是对象。不论你所使用得Array型别为何,

Array名称本身实际上是个reference,指向heap之内得某个实际对象。

这个对象可经由“Array初始化语法”被自动产生,也可以以new表达式手动产生。

5)Array可做为函数返回值,因为它本身是对象的reference;

6)对象数组与基本类型数组在运用上几乎一模一样,唯一差别在于,前者持有得是reference,后者直接持有基本型别之值;
例如:
string [] staff=new string[100];
int [] num=new int[10];

7)容器所持有的其实是一个个reference指向Object,进而才能存储任意型别。当然这不包括基本型别,因为基本型别并不继承自任何classes。

 

​​​​​​​---------

(99)数组和链表数据结构描述,各自的时间复杂度

  •  
  •  

数组有没有length()这个方法? String有没有length()这个方法

  •  

队列

  •  

队列和栈是什么,列出它们的区别

  •  
  •  

BlockingQueue是什么

  •  
  •  

(99)简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。

LinkedBlockingQueue 的API中,从队列中获取元素,有以下几个方法:

1、take():原文:Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.

翻译完:从队列中取出元素E,如果队列为空,则阻塞该线程直到队列不为空拿出元素E位置;

这样可能造成的情况是:在生产者消费中模式中,如果生产者已经生产完毕了,消费中消费完毕后,队列为空,此时用take()方法会阻塞,从而导致线程无法关闭,

表现在运行后,eclipse中的terminae一直为红色;

2、poll():原文:Retrieves and removes the head of this queue, or returns null if this queue is empty.

翻译为:取出并删除队列中的首元素,如果队列为空,则返回null,不进行阻塞。

相比于take()可以根据其他条件的判断,关闭线程,不会出现上述状态。

举个例子:生产消费中,生产者一直生产直到生产完毕后,通知消费者,我生产完了,消费者通过pool()方法一直取出元素E,直到某次,从队列取出来的=null,

且此时收到生产者说我生产完了,那么你就可以顺利关闭消费者线程了。

3、poll(long timeout, TimeUnit unit):Retrieves and removes the head of this queue, waiting up to the specified wait time if necessary for an element to become available.

翻译为:取出后删除头元素E,如果取不到则等到timeout时间在取,还是取不到就返回null;

比如得到10秒,timeout为10.TimeUnit.Second

4、peek():Retrieves, but does not remove, the head of this queue, or returns null if this queue is empty.

翻译:取出第一个元素但是不删除它,没有就返回null

ConcurrentLinkedQueue:队列中提供了上面的poll()、peek()方法,因此用ConcurrentLinkedQueue队列不会进行阻塞,

两者都是线程安全的。
--------------------- 
 

 

ArrayList、Vector、LinkedList的存储性能和特性
String
StringBuffer

  •  

ByteBuffer 与 StringBuffer有什么区别

  •  

HashMap

  •  

(99)HashMap的工作原理是什么

HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。

  •  

内部的数据结构是什么

  •  
  •  

HashMap 的 table的容量如何确定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题?

按HashMap源码里的那种重构方法,如果reHash过多,显然会影响性能。所以为了防止过多的reHash,我们需要自己配置HashMap的装载因子loadFactor和初始的table容量capacity的大小(可以在构造函数里配或者调用方法配)。 

  •  

HashMap 实现的数据结构是什么?如何实现

  •  
  •  

HashMap 和 HashTable、ConcurrentHashMap 的区别

  •  
  •  

HashMap的遍历方式及效率

  •  
  •  

(99)HashMap、LinkedMap、TreeMap的区别

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。
TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。

​​​​​​​

 

如何决定选用HashMap还是TreeMap

  •  
  •  

如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办

  •  
  •  

HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,比如存储方式、 hashcode、扩容、 默认容量等

  •  

HashSet

  •  

(99)HashSet和TreeSet有什么区别

1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。 

2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。 

3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。

  •  

(99)HashSet 内部是如何工作的

从上看下来,HashSet 的源码是挺简单的,内部都是用 HashMap 来实现的。利用了 HashMap 的 key 不能重复这个原理来实现 HashSet 。

  •  

(99)WeakHashMap 是怎么工作的?

WeakHashMap特点是,当除了自身有对key的引用外,此key没有其他引用,那么WeakHashMap会在下次对WeakHashMap进行增删改查操作时及时丢弃该键值对,节约内存使用,此特性使得WeakHashMap非常适合构建缓存系统。 
WeakHashMap是主要通过expungeStaleEntries函数的来实现移除其内部不用的entry从而达到的自动释放内存的目的。基本上只要对WeakHashMap的内容进行访问就会调用expungeStaleEntries函数,从而达到清除不再被外部引用的key对应的entry键值对。如果预先生成了WeakHashMap,而在GC以前又不曾访问该WeakHashMap,那么因为没有机会调用expungeStaleEntries函数,因此并不会回收不再被外部引用的key对应的entry。

  •  

Set

  •  

Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()? 它们有何区别?

  •  
  •  

TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?

  •  
  •  

TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。

  •  
  •  

EnumSet 是什么

  •  

Hash算法

  •  

Hashcode 的作用

  •  
  •  

简述一致性 Hash 算法

  •  
  •  

有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象

  •  
  •  

(99)为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里

首先equals与hashcode间的关系是这样的:

1、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)   

自我的理解:

由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的,一个很好的例子就是在集合中的使用;

我们都知道java中的List集合是有序的,因此是可以重复的,而set集合是无序的,因此是不能重复的,那么怎么能保证不能被放入重复的元素呢,但靠equals方法一样比较的话,如果原来集合中以后又10000个元素了,那么放入10001个元素,难道要将前面的所有元素都进行比较,看看是否有重复,欧码噶的,这个效率可想而知,因此hashcode就应遇而生了,java就采用了hash表,利用哈希算法(也叫散列算法),就是将对象数据根据该对象的特征使用特定的算法将其定义到一个地址上,那么在后面定义进来的数据只要看对应的hashcode地址上是否有值,那么就用equals比较,如果没有则直接插入,只要就大大减少了equals的使用次数,执行效率就大大提高了。

继续上面的话题,为什么必须要重写hashcode方法,其实简单的说就是为了保证同一个对象,保证在equals相同的情况下hashcode值必定相同,如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。

  •  
  •  

a.hashCode() 有什么用?与 a.equals(b) 有什么关系

  •  
  •  

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

  •  
  •  

Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为什么这么设计?Object类的概述

  •  
  •  

如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。

  •  
  •  

可以在 hashcode() 中使用随机数字吗?

  •  

LinkedHashMap

  •  

LinkedHashMap 和 PriorityQueue 的区别是什么

  •  

List

  •  

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

  •  
  •  

(99)List, Set, Map 是否继承自 Collection 接口

List,Set是,Map不是。

Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。

  •  
  •  

遍历一个 List 有哪些不同的方式

 

第一种:
for(Iterator<String> it = list.iterator(); it.hasNext(); ) {
....
}
这种方式在循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出现并发访问的错误.

第二种:
for(String data : list) {
.....
}
内部调用第一种, 换汤不换药, 因此比Iterator 慢,这种循环方式还有其他限制。

第三种:
for(int i=0; i<list.size(); i++) {
A a = list.get(i);
...
}

  •  

LinkedList

  •  
  1.  

(99)LinkedList 是单向链表还是双向链表

Linkedlist,双向链表,优点,增加删除,用时间很短,但是因为没有索引,对索引的操作,比较麻烦,只能循环遍历,但是每次循环的时候,都会先判断一下,这个索引位于链表的前部分还是后部分,每次都会遍历链表的一半 ,而不是全部遍历。 
双向链表,都有一个previous和next, 链表最开始的部分都有一个fiest和last 指向第一个元素,和最后一个元素。增加和删除的时候,只需要更改一个previous和next,就可以实现增加和删除,所以说,LinkedList对于数据的删除和增加相当的方便。
 

  1.  

LinkedList 与 ArrayList 有什么区别

  1.  
  2.  

描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?

  1.  
  2.  

插入数据时,ArrayList, LinkedList, Vector谁速度较快?

  1.  
  •  

ArrayList

  •  
  1.  

(99)ArrayList 和 HashMap 的默认大小是多数

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。

  1.  

ArrayList 和 LinkedList 的区别,什么时候用 ArrayList?

  1.  
  2.  

ArrayList 和 Set 的区别?

  1.  
  2.  

ArrayList, LinkedList, Vector的区别

  1.  
  2.  

ArrayList是如何实现的,ArrayList 和 LinkedList 的区别

  1.  
  2.  

(99)ArrayList如何实现扩容

ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间,当第一次插入元素时才分配10(默认)个对象空间。假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10 (如下图一);之后扩容会按照1.5倍增长。

  1.  

Array 和 ArrayList 有何区别?什么时候更适合用Array

  1.  
  2.  

说出ArraList,Vector, LinkedList的存储性能和特性

  1.  

Map

  •  

Map, Set, List, Queue, Stack

  •  
  •  

Map 接口提供了哪些不同的集合视图

  •  
  •  

为什么 Map 接口不继承 Collection 接口

  •  

Collections

  •  

介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些

  •  
  •  

Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现

  •  
  •  

集合类框架的最佳实践有哪些

  •  
  •  

为什么 Collection 不从 Cloneable 和 Serializable 接口继承

  •  
  •  

说出几点 Java 中使用 Collections 的最佳实践?

  •  
  •  

Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别

  •  

什么是 B+树,B-树,列出实际的使用场景。

接口

  •  

(99)Comparator 与 Comparable 接口是干什么的?列出它们的区别

https://www.cnblogs.com/szlbm/p/5504634.html

Comparable

Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现,compareTo方法也被称为自然比较方法。如果开发者add进入一个Collection的对象想要Collections的sort方法帮你自动进行排序的话,那么这个对象必须实现Comparable接口。compareTo方法的返回值是int,有三种情况:

1、比较者大于被比较者(也就是compareTo方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

Comparator

Comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现Comparator接口的方式:

1、一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较

2、一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式

Comparator接口里面有一个compare方法,方法有两个参数T o1和T o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和Comparable接口一样是int,有三种情况:

1、o1大于o2,返回正整数

2、o1等于o2,返回0

3、o1小于o3,返回负整数

 

 

对象

拷贝(clone)

  •  

如何实现对象克隆

  •  
  •  

深拷贝和浅拷贝区别

  •  
  •  

深拷贝和浅拷贝如何实现激活机制

  •  
  •  

(99)写clone()方法时,通常都有一行代码,是什么

重写clone()方法的时候 需要先克隆父类,所以 一般来说,通常都有的一行代码是 
super.clone() 
还有我们在使用clone的时候,会有浅克隆和深度克隆之分,一定要注意,浅克隆克隆出的对象,该对象里的引用类型的变量存储的还是原对象的值,如果有时候修改可能会修改到原对象引用的对象

 

  •  

比较

  •  

在比较对象时,”==” 运算符和 equals 运算有何区别

  •  
  •  

如果要重写一个对象的equals方法,还要考虑什么

  •  
  •  

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

  •  

构造器

  •  

构造器链是什么

  •  
  •  

创建对象时构造器的调用顺序

  •  

不可变对象

  •  

什么是不可变象(immutable object)

  •  
  •  

为什么 Java 中的 String 是不可变的(Immutable)

  •  
  •  

如何构建不可变的类结构?关键点在哪里

  •  
  •  

能创建一个包含可变对象的不可变对象吗

  •  

如何对一组对象进行排序

方法

  •  

构造器(constructor)是否可被重写(override)

  •  
  •  

方法可以同时即是 static 又是 synchronized 的吗

  •  
  •  

abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized

  •  
  •  

Java支持哪种参数传递类型

  •  
  •  

一个对象被当作参数传递到一个方法,是值传递还是引用传递

  •  
  •  

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

  •  
  •  

(99)我们能否重载main()方法

 

1.不用main方法如何定义一个类?

    不行,没有main方法我们不能运行Java类。

     在Java 7之前,你可以通过使用静态初始化运行Java类。但是,从Java 7开始就行不通了。


2.main()方法需要的参数不是字符串数组?

    不是的,main()方法的参数必须是字符串数组。

    但是,在引进变参时,你可以将字符串类型的变参作为参数传递给main()方法。变参一定得是数组。  


3.我们能不能改变main()方法的返回类型?

    不能,main()方法的返回类型只能是空。任何其它类型都是不能接受的。
 

4.main()方法为什么必须是静态的?

   main()方法一定是静态的。

   如果main()允许是非静态的,那么在调用main方法时,JVM就得实例化它的类。

   在实例化时,还得调用类的构造函数。如果这个类的构造函数有参数,那么届时就会出现歧义。


5.我们能不能声明main()方法为非静态?

    不能,main()方法必须声明为静态的,这样JVM才可以调用main()方法而无需实例化它的类。

    如果从main()方法去掉“static”这个声明,虽然编译依然可以成功,但在运行时会导致程序失败。 


6.我们能否重载main()方法?

    可以,我们可以重载main()方法。一个Java类可以有任意数量的main()方法。
 

7.我们能否声明main()方法为private或protected,或者不用访问修饰符?

     不能,main()方法必须public。

     你不能定义main()方法为private和protected,也不能不用访问修饰符。

      这是为了能让JVM访问main()方法。

      如果你不定义main()方法为public,虽然编译也会成功,但你会得到运行时错误,因为找不到main方法。


8.我们能否在Java中覆盖main方法?

   不能,你不能在Java中覆盖main方法。

   这是因为main方法是静态方法,而在Java中静态方法在编译时会结合在一起,所以你在Java中不能覆盖静态方法


9.我们能否在Java中终结main方法?

    你可以在Java中终结main方法。JVM对此没问题。   

10.我们能否在Java中同步main方法?

     是的,main方法可以在Java中同步,synchronized修饰符允许用于main方法的声明中,这样就可以在Java中同步main方法了。  

 

  •  

如果main方法被声明为private会怎样

  •  

GC

概念

  •  

GC是什么?为什么要有GC

  •  
  •  

什么时候会导致垃圾回收

  •  
  •  

GC是怎么样运行的

  •  
  •  

新老以及永久区是什么

  •  
  •  

GC 有几种方式?怎么配置

  •  
  •  

什么时候一个对象会被GC? 如何判断一个对象是否存活

  •  
  •  

System.gc() Runtime.gc()会做什么事情? 能保证 GC 执行吗

  •  
  •  

垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

  •  
  •  

Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生

  •  
  •  

垃圾回收算法的实现原理

  •  
  •  

如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?

  •  
  •  

垃圾回收的最佳做法是什么

  •  

GC收集器有哪些

  •  

垃圾回收器的基本原理是什么?

  •  
  •  

串行(serial)收集器和吞吐量(throughput)收集器的区别是什么

  •  
  •  

Serial 与 Parallel GC之间的不同之处

  •  
  •  

CMS 收集器 与 G1 收集器的特点与区别

  •  
  •  

CMS垃圾回收器的工作过程

  •  
  •  

JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代

  •  
  •  

吞吐量优先和响应优先的垃圾收集器选择

  •  

GC策略

  •  

举个实际的场景,选择一个GC策略

  •  
  •  

JVM的永久代中会发生垃圾回收吗

  •  

收集方法

  •  

标记清除、标记整理、复制算法的原理与特点?分别用在什么地方

  •  
  •  

如果让你优化收集方法,有什么思路

  •  

JVM

参数

  •  

说说你知道的几种主要的jvm 参数

  •  
  •  

-XX:+UseCompressedOops 有什么作用

  •  

类加载器(ClassLoader)

  •  

Java 类加载器都有哪些

  •  
  •  

JVM如何加载字节码文件

  •  

内存管理

  •  

JVM内存分哪几个区,每个区的作用是什么

  •  
  •  

一个对象从创建到销毁都是怎么在这些部分里存活和转移的

  •  
  •  

解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法

  •  
  •  

JVM中哪个参数是用来控制线程的栈堆栈小

  •  
  •  

简述内存分配与回收策略

  •  
  •  

简述重排序,内存屏障,happen-before,主内存,工作内存

  •  
  •  

Java中存在内存泄漏问题吗?请举例说明

  •  
  •  

(99)简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用

强引用
     强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

软引用(SoftReference)
     软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实现软引用。
弱引用(WeakReference)   

   弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。

 虚引用(PhantomReference)   

    虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用。

  •  
  •  

内存映射缓存区是什么

  •  

jstack,jstat,jmap,jconsole怎么用
32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数?
怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位
JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆
什么情况下会发生栈内存溢出

 


双亲委派模型是什么

双亲委派模型工作过程是:如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

 

多线程

基本概念

  •  

什么是线程

  •  
  •  

多线程的优点

  •  
  •  

多线程的几种实现方式

  •  
  1.  

用 Runnable 还是 Thread

  1.  
  •  

什么是线程安全

  •  
  1.  

Vector, SimpleDateFormat 是线程安全类吗

  1.  
  2.  

什么 Java 原型不是线程安全的

  1.  
  2.  

哪些集合类是线程安全的

---

 

 

(99)自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁、读写锁、偏向所、轻量级锁、重量级锁、锁膨胀、对象锁和类锁

https://blog.csdn.net/a314773862/article/details/54095819

1、自旋锁
自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行。若线程依然不能获得锁,才会被挂起。
使用自旋锁后,线程被挂起的几率相对减少,线程执行的连贯性相对加强。因此,对于那些锁竞争不是很激烈,锁占用时间很短的并发线程,具有一定的积极意义,但对于锁竞争激烈,单线程锁占用很长时间的并发程序,自旋锁在自旋等待后,往往毅然无法获得对应的锁,不仅仅白白浪费了CPU时间,最终还是免不了被挂起的操作 ,反而浪费了系统的资源。
在JDK1.6中,Java虚拟机提供-XX:+UseSpinning参数来开启自旋锁,使用-XX:PreBlockSpin参数来设置自旋锁等待的次数。
在JDK1.7开始,自旋锁的参数被取消,虚拟机不再支持由用户配置自旋锁,自旋锁总是会执行,自旋锁次数也由虚拟机自动调整。

可能引起的问题:
1.过多占据CPU时间:如果锁的当前持有者长时间不释放该锁,那么等待者将长时间的占据cpu时间片,导致CPU资源的浪费,因此可以设定一个时间,当锁持有者超过这个时间不释放锁时,等待者会放弃CPU时间片阻塞;
2.死锁问题:试想一下,有一个线程连续两次试图获得自旋锁(比如在递归程序中),第一次这个线程获得了该锁,当第二次试图加锁的时候,检测到锁已被占用(其实是被自己占用),那么这时,线程会一直等待自己释放该锁,而不能继续执行,这样就引起了死锁。因此递归程序使用自旋锁应该遵循以下原则:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。

2、阻塞锁
让线程进入阻塞状态进行等待,当获得相应的信号(唤醒,时间) 时,才可以进入线程的准备就绪状态,准备就绪状态的所有线程,通过竞争,进入运行状态。。
JAVA中,能够进入\退出、阻塞状态或包含阻塞锁的方法有 ,synchronized 关键字(其中的重量锁),ReentrantLock,Object.wait()\notify()

3、可重入锁
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁
 

 

  1.  
  •  

多线程中的忙循环是什么

  •  
  •  

如何创建一个线程

  •  
  •  

编写多线程程序有几种实现方式

  •  
  •  

什么是线程局部变量

  •  
  •  

线程和进程有什么区别?进程间如何通讯,线程间如何通讯

  •  
  •  

什么是多线程环境下的伪共享(false sharing)

  •  
  •  

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

  •  

Current

  •  

ConcurrentHashMap 和 Hashtable的区别

  •  
  •  

ArrayBlockingQueue, CountDownLatch的用法

  •  
  •  

ConcurrentHashMap的并发度是什么

  •  

(99)CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么

 

1.CyclicBarrier的某个线程运行到屏障点上之后,该线程立即停止运行,直到所有的线程都到达了这个屏障点,所有线程才依次按顺序被唤醒重新运行;CountDownLatch是某个线程运行到某个点上之后,只是给计数器数值减一,该线程扔继续运行;

2.CyclicBarrier唤醒等待线程虽然是唤醒全部,但等待线程是按顺序依次执行的;CountDownLatch是唤醒多个任务,抢占式执行;

3.CyclicBarrier可重用的,因为内部计数器可重置;CountDownLatch不可重用,计数器值为0该CountDownLatch就不可再用。


Semaphore的用法
Thread

  •  

启动一个线程是调用 run() 还是 start() 方法?start() 和 run() 方法有什么区别

  •  
  •  

调用start()方法时会执行run()方法,为什么不能直接调用run()方法

  •  
  •  

sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别

  •  
  •  

yield方法有什么作用?sleep() 方法和 yield() 方法有什么区别

① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常; 
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性.
--------------------- 
 

  •  

Java 中如何停止一个线程

  •  
  •  

stop() 和 suspend() 方法为何不推荐使用

  •  
  •  

如何在两个线程间共享数据

  •  
  •  

如何强制启动一个线程

  •  
  •  

如何让正在运行的线程暂停一段时间

  •  
  •  

什么是线程组,为什么在Java中不推荐使用

  •  
  •  

你是如何调用 wait(方法的)?使用 if 块还是循环?为什么

  •  

生命周期

  •  

有哪些不同的线程生命周期

  •  
  •  

线程状态,BLOCKED 和 WAITING 有什么区别

  •  
  •  

画一个线程的生命周期状态图

  •  

ThreadLocal 用途是什么,原理是什么,用的时候要注意什么
ThreadPool

  •  

线程池是什么?为什么要使用它

  •  
  •  

如何创建一个Java线程池

  •  
  •  

ThreadPool用法与优势

  •  
  •  

提交任务时,线程池队列已满时会发会生什么

  •  
  •  

newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,比如 coreSize, maxsize 等

  •  
  •  

线程池的实现策略

  •  
  •  

线程池的关闭方式有几种,各自的区别是什么

  •  
  •  

(99)线程池中submit() 和 execute()方法有什么区别?

1、接收的参数不一样

2、submit有返回值,而execute没有

用到返回值的例子,比如说我有很多个做validation的task,我希望所有的task执行完,然后每个task告诉我它的执行结果,是成功还是失败,如果是失败,原因是什么。
然后我就可以把所有失败的原因综合起来发给调用者。

个人觉得cancel execution这个用处不大,很少有需要去取消执行的。

而最大的用处应该是第二点。
3、submit方便Exception处理
意思就是如果你在你的task里会抛出checked或者unchecked exception,
而你又希望外面的调用者能够感知这些exception并做出及时的处理,那么就需要用到submit,通过捕获Future.get抛出的异常。

 

(99)Callable,Runnable比较及用法

Runnable和Callable的区别是,
(1)Callable规定的方法是call(),Runnable规定的方法是run().
(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
(3)call方法可以抛出异常,run方法不可以

(4)运行Callable任务可以拿到一个Future对象,Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如果线程没有执行完,Future.get()方法可能会阻塞当前线程的执行;如果线程出现异常,Future.get()会throws InterruptedException或者ExecutionException;如果线程已经取消,会跑出CancellationException。取消由cancel 方法来执行。isDone确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明Future<?> 形式类型、并返回 null 作为底层任务的结果。Future接口的定义如下:

Future模式
Future模式在请求发生时,会先产生一个Future凭证给发出请求的客户,它的作用就像是Proxy物件,同时,由一个新的执行线程持续进行目标物件的生成(Thread-Per-Message),真正的目标物件生成之后,将之设定至Future之中,而当客户端真正需要目标物件时,目标物件也已经准备好,可以让客户提取使用。
结合JDK的Future来看,就是你run线程后,你可以把线程的返回值赋给Future并返回一个Future对象。这时你可以立即拿到这个对象,然后进行下面的逻辑。但是如果你要get这个Future中的线程结果,就会被阻塞直到线程结束。
就相当于现在的期房,你把手续和钱都交上去了,就可以马上拿到合同,但只有合同没有房子。这个时候你已经是有房一族了,你可以先去买家电买装修(走下面的其他逻辑)。但是你要把家电和装修放进去,就必须等到房子完工(阻塞)。

-------

 

线程调度

  •  

Java中用到的线程调度算法是什么

  •  
  •  

什么是多线程中的上下文切换

  •  
  •  

你对线程优先级的理解是什么

  •  
  •  

什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)

  •  

线程同步

  •  

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

  •  
  •  

synchronized 的原理是什么

  •  
  •  

synchronized 和 ReentrantLock 有什么不同

  •  
  •  

什么场景下可以使用 volatile 替换 synchronized

  •  
  •  

有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行

  •  
  •  

同步块内的线程抛出异常会发生什么

  •  
  •  

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

  •  
  •  

使用 synchronized 修饰静态方法和非静态方法有什么区别

  •  
  •  

如何从给定集合那里创建一个 synchronized 的集合

  •  

  •  

Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优势

  •  
  •  

Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优势是什么

  •  
  •  

ReadWriteLock是什么?

  •  
  •  

锁机制有什么用

  •  
  •  

什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题

  •  
  •  

解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁

  •  
  •  

什么时候应该使用可重入锁

  •  
  •  

简述锁的等级方法锁、对象锁、类锁

  •  
  •  

Java中活锁和死锁有什么区别?

  •  
  •  

什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁

  •  
  •  

死锁与活锁的区别,死锁与饥饿的区别

  •  
  •  

怎么检测一个线程是否拥有锁

  •  
  •  

如何实现分布式锁

  •  
  •  

有哪些无锁数据结构,他们实现的原理是什么

  •  
  •  

读写锁可以用于什么应用场景

  •  

Executors类是什么? Executor和Executors的区别
什么是Java线程转储(Thread Dump),如何得到它
如何在Java中获取线程堆栈
说出 3 条在 Java 中使用线程的最佳实践
在线程中你怎么处理不可捕捉异常
实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的
请说出与线程同步以及线程调度相关的方法
程序中有3个 socket,需要多少个线程来处理
假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到
如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长
如何确保 main() 方法所在的线程是 Java 程序最后结束的线程
非常多个线程(可能是不同机器),相互之间需要等待协调才能完成某种工作,问怎么设计这种协调方案
你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它

异常

基本概念

  •  

Error 和 Exception有什么区别

  •  
  1.  

UnsupportedOperationException是什么

  1.  
  2.  

NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处

  1.  
  •  

什么是受检查的异常,什么是运行时异常

  •  
  •  

运行时异常与一般异常有何异同

  •  
  •  

简述一个你最常见到的runtime exception(运行时异常)

  •  

finally

  •  

finally关键词在异常处理中如何使用

  •  
  1.  

如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗

  1.  
  2.  

try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后

  1.  
  2.  

在什么情况下,finally语句不会执行

  1.  

throw 和 throws 有什么区别?
OOM你遇到过哪些情况?你是怎么搞定的?
SOF你遇到过哪些情况?
既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常
当自己创建异常类的时候应该注意什么
导致空指针异常的原因
异常处理 handle or declare 原则应该如何理解
怎么利用 JUnit 来测试一个方法的异常
catch块里别不写代码有什么问题
你曾经自定义实现过异常吗?怎么写的
什么是 异常链
在try块中可以抛出异常吗

JDBC

  •  

通过 JDBC 连接数据库有哪几种方式

  •  
  •  

阐述 JDBC 操作数据库的基本步骤

  •  
  •  

JDBC 中如何进行事务处理

  •  
  •  

什么是 JdbcTemplate

  •  
  •  

什么是 DAO 模块

  •  
  •  

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

  •  
  •  

列出 5 个应该遵循的 JDBC 最佳实践

  •  

IO

  •  

File

  •  
  1.  

File类型中定义了什么方法来创建一级目录

  1.  

File类型中定义了什么方法来判断一个文件是否存在

  •  

  •  
  1.  

为了提高读写性能,可以采用什么流

  1.  
  2.  

Java中有几种类型的流

  1.  
  2.  

JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类

  1.  
  2.  

对文本文件操作用什么I/O流

  1.  
  2.  

对各种基本数据类型和String类型的读写,采用什么流

  1.  
  2.  

能指定字符编码的 I/O 流类型是什么

  1.  
  •  

序列化

  •  
  1.  

什么是序列化?如何实现 Java 序列化及注意事项

  1.  
  2.  

Serializable 与 Externalizable 的区别

  1.  
  •  

Socket

  •  
  1.  

socket 选项 TCP NO DELAY 是指什么

  1.  
  2.  

Socket 工作在 TCP/IP 协议栈是哪一层

  1.  
  2.  

TCP、UDP 区别及 Java 实现方式

  1.  
  •  

说几点 IO 的最佳实践

  •  
  •  

直接缓冲区与非直接缓冲器有什么区别?

  •  
  •  

怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么

  •  
  •  

当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少

  •  
  •  

如何使用扫描器类(Scanner Class)令牌化

  •  

面向对象编程(OOP)

  •  

解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)

  •  
  •  

多态的实现原理

  •  
  •  

封装、继承和多态是什么

  •  
  •  

对象封装的原则是什么?

  •  
  •  

  •  
  1.  

获得一个类的类对象有哪些方式

  1.  
  2.  

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

  1.  
  2.  

说出几条 Java 中方法重载的最佳实践

  1.  
  •  

抽象类

  •  
  1.  

抽象类和接口的区别

  1.  
  2.  

抽象类中是否可以有静态的main方法

  1.  
  2.  

抽象类是否可实现(implements)接口

  1.  
  2.  

抽象类是否可继承具体类(concrete class)

  1.  
  •  

匿名类(Anonymous Inner Class)

  •  

匿名内部类是否可以继承其它类?是否可以实现接口

  •  

内部类

  •  
  1.  

内部类分为几种

  1.  
  2.  

内部类可以引用它的包含类(外部类)的成员吗

  1.  
  2.  

请说一下 Java 中为什么要引入内部类?还有匿名内部类

  1.  
  •  

继承

  •  
  1.  

继承(Inheritance)与聚合(Aggregation)的区别在哪里

  1.  
  2.  

继承和组合之间有什么不同

  1.  
  2.  

为什么类只能单继承,接口可以多继承

  1.  
  2.  

存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B

  1.  
  2.  

如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题

  1.  
  •  

接口

  •  
  1.  

接口是什么

  1.  
  2.  

接口是否可继承接口

  1.  
  2.  

为什么要使用接口而不是直接使用具体类?接口有什么优点

  1.  

泛型

  •  

泛型的存在是用来解决什么问题

  •  
  •  

泛型的常用特点

  •  
  •  

List能否转为List

  •  

工具类

  •  

日历

  •  
  1.  

Calendar Class的用途

  1.  
  2.  

如何在Java中获取日历类的实例

  1.  
  2.  

解释一些日历类中的重要方法

  1.  
  2.  

GregorianCalendar 类是什么

  1.  
  2.  

SimpleTimeZone 类是什么

  1.  
  2.  

Locale类是什么

  1.  
  2.  

如何格式化日期对象

  1.  
  2.  

如何添加小时(hour)到一个日期对象(Date Objects)

  1.  
  2.  

如何将字符串 YYYYMMDD 转换为日期

  1.  
  •  

Math

  •  

Math.round()什么作用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

  •  

XML

  •  
  1.  

XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不同?

  1.  
  2.  

Java解析XML的方式

  1.  
  2.  

用 jdom 解析 xml 文件时如何解决中文问题?如何解析

  1.  
  2.  

你在项目中用到了 XML 技术的哪些方面?如何实现

  1.  

动态代理

  •  

描述动态代理的几种实现方式,分别说出相应的优缺点

  •  

设计模式

  •  

什么是设计模式(Design Patterns)?你用过哪种设计模式?用在什么场合

  •  
  •  

你知道哪些商业级设计模式?

  •  
  •  

哪些设计模式可以增加系统的可扩展性

  •  
  •  

单例模式

  •  
  1.  

除了单例模式,你在生产环境中还用过什么设计模式?

  1.  
  2.  

写 Singleton 单例模式

  1.  
  2.  

单例模式的双检锁是什么

  1.  
  2.  

如何创建线程安全的 Singleton

  1.  
  2.  

什么是类的单例模式

  1.  
  2.  

写出三种单例模式实现

  1.  
  •  

适配器模式

  •  
  1.  

适配器模式是什么?什么时候使用

  1.  
  2.  

适配器模式和代理模式之前有什么不同

  1.  
  2.  

适配器模式和装饰器模式有什么区别

  1.  
  •  

什么时候使用享元模式

  •  
  •  

什么时候使用组合模式

  •  
  •  

什么时候使用访问者模式

  •  
  •  

什么是模板方法模式

  •  
  •  

请给出1个符合开闭原则的设计模式的例子

  •  

开放问题

  •  

用一句话概括 Web 编程的特点

  •  
  •  

Google是如何在一秒内把搜索结果返回给用户

  •  
  •  

哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入

  •  
  •  

树(二叉或其他)形成许多普通数据结构的基础。请描述一些这样的数据结构以及何时可以使用它们

  •  
  •  

某一项功能如何设计

  •  
  •  

线上系统突然变得异常缓慢,你如何查找问题

  •  
  •  

什么样的项目不适合用框架

  •  
  •  

新浪微博是如何实现把微博推给订阅者

  •  
  •  

简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么

  •  
  •  

请你谈谈SSH整合

  •  
  •  

高并发下,如何做到安全的修改同一行数据

  •  
  •  

12306网站的订票系统如何实现,如何保证不会票不被超卖

  •  
  •  

网站性能优化如何优化的

  •  
  •  

聊了下曾经参与设计的服务器架构

  •  
  •  

请思考一个方案,实现分布式环境下的 countDownLatch

  •  
  •  

请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存

  •  
  •  

在你的职业生涯中,算得上最困难的技术挑战是什么

  •  
  •  

如何写一篇设计文档,目录是什么

  •  
  •  

大写的O是什么?举几个例子

  •  
  •  

编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用

  •  
  •  

解释一下网络应用的模式及其特点

  •  
  •  

设计一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新

  •  
  •  

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

  •  
  •  

怎么获取一个文件中单词出现的最高频率

  •  
  •  

描述一下你最常用的编程风格

  •  
  •  

如果有机会重新设计你们的产品,你会怎么做

  •  
  •  

如何搭建一个高可用系统

  •  
  •  

如何启动时不需输入用户名与密码

  •  
  •  

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

  •  
  •  

如何实现一个秒杀系统,保证只有几位用户能买到某件商品。

  •  
  •  

如何实现负载均衡,有哪些算法可以实现

  •  
  •  

如何设计一个购物车?想想淘宝的购物车如何实现的

  •  
  •  

如何设计一套高并发支付方案,架构如何设计

  •  
  •  

如何设计建立和保持 100w 的长连接

  •  
  •  

如何避免浏览器缓存。

  •  
  •  

如何防止缓存雪崩

  •  
  •  

如果AB两个系统互相依赖,如何解除依

  •  
  •  

如果有人恶意创建非法连接,怎么解决

  •  
  •  

如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能

  •  
  •  

如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)

  •  
  •  

如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现

  •  
  •  

如果让你实现一个并发安全的链表,你会怎么做

  •  
  •  

应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各种方式的区别?你使用过的应用服务器优化技术有哪些

  •  
  •  

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

  •  
  •  

有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的

  •  
  •  

最近看什么书,印象最深刻的是什么

  •  
  •  

描述下常用的重构技巧

  •  
  •  

你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里

  •  
  •  

你有了解过存在哪些反模式(Anti-Patterns)吗

  •  
  •  

你用过的网站前端优化的技术有哪些

  •  
  •  

如何分析Thread dump

  •  
  •  

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

  •  
  •  

你是如何处理内存泄露或者栈溢出问题的

  •  
  •  

你们线上应用的 JVM 参数有哪些

  •  
  •  

怎么提升系统的QPS和吞吐量

  •  

知识面

  •  

解释什么是 MESI 协议(缓存一致性)

  •  
  •  

谈谈 reactor 模型

  •  
  •  

Java 9 带来了怎样的新功能

  •  
  •  

Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用

  •  
  •  

简单讲讲 Tomcat 结构,以及其类加载器流程

  •  
  •  

虚拟内存是什么

  •  
  •  

阐述下 SOLID 原则

  •  
  •  

请简要讲一下你对测试驱动开发(TDD)的认识

  •  
  •  

CDN实现原理

  •  
  •  

Maven 和 ANT 有什么区别

  •  
  •  

UML中有哪些常用的图

  •  
  •  

Linux

  •  
  1.  

Linux 下 IO 模型有几种,各自的含义是什么。

  1.  
  2.  

Linux 系统下你关注过哪些内核参数,说说你知道的

  1.  
  2.  

Linux 下用一行命令查看文件的最后五行

  1.  
  2.  

平时用到哪些 Linux 命令

  1.  
  2.  

用一行命令输出正在运行的 Java 进程

  1.  
  2.  

使用什么命令来确定是否有 Tomcat 实例运行在机器上

  1.  
  •  

什么是 N+1 难题

  •  
  •  

什么是 paxos 算法

  •  
  •  

什么是 restful,讲讲你理解的 restful

  •  
  •  

什么是 zab 协议

  •  
  •  

什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别

  •  
  •  

什么是领域驱动开发(Domain Driven Development)

  •  
  •  

介绍一下了解的 Java 领域的 Web Service 框架

  •  
  •  

Web Server、Web Container 与 Application Server 的区别是什么

  •  
  •  

微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里

  •  
  •  

描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session工作原理

  •  
  •  

你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些

  •  
  •  

简述下数据库正则化(Normalizations)

  •  
  •  

KISS,DRY,YAGNI 等原则是什么含义

  •  
  •  

分布式事务的原理,优缺点,如何使用分布式事务?

  •  
  •  

布式集群下如何做到唯一序列号

  •  
  •  

网络

  •  
  1.  

HTTPS 的加密方式是什么,讲讲整个加密解密流程

  1.  
  2.  

HTTPS和HTTP的区别

  1.  
  2.  

HTTP连接池实现原理

  1.  
  2.  

HTTP集群方案

  1.  
  2.  

Nginx、lighttpd、Apache三大主流 Web服务器的区别

  1.  
  •  

是否看过框架的一些代码

  •  
  •  

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

  •  
  •  

数值提升是什么

  •  
  •  

你能解释一下里氏替换原则吗

  •  
  •  

你是如何测试一个应用的?知道哪些测试框架

  •  
  •  

传输层常见编程协议有哪些?并说出各自的特点

  •  

编程题

计算加班费

加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时)

  •  

计算1000月薪,加班9小时的加班费

  •  
  •  

计算2500月薪,加班11小时的加班费

  •  
  •  

计算1000月薪,加班15小时的加班费

  •  

卖东西

一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。

  •  

模拟一个进货。红苹果跟青苹果各进200个。

  •  
  •  

模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。

  •  

提示:一个苹果是一个单独的实体。

日期提取

有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08

线程

  •  

8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。

  •  
  •  

用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出

  •  
  •  

wait-notify 写一段代码来解决生产者-消费者问题

  •  

数字

  •  

判断101-200之间有多少个素数,并输出所有素数

  •  
  •  

用最有效率的方法算出2乘以17等于多少

  •  
  •  

有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优

  •  
  •  

2 亿个随机生成的无序整数,找出中间大小的值

  •  
  •  

10 亿个数字里里面找最小的 10 个

  •  
  •  

1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1

  •  
  •  

一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数

  •  
  •  

一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素

  •  
  •  

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

  •  
  •  

求100-1000内质数的和

  •  
  •  

求1到100的和的平均数

  •  
  •  

求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和

  •  
  •  

算出1到40的质数,放进数组里

  •  
  1.  

显示放组里的数

  1.  
  2.  

找出第[5]个数

  1.  
  2.  

删除第[9]个数,再显示删除后的第[9]个

  1.  
  •  

有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。

  •  
  •  

有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数

  •  
  •  

计算指定数字的阶乘

  •  
  •  

开发 Fizz Buzz

  •  
  •  

给定一个包含 N 个整数的数组,找出丢失的整数

  •  
  •  

一个排好序的数组,找出两数之和为m的所有组合

  •  
  •  

将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

  •  
  •  

打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方

  •  
  •  

原地交换两个变量的值

  •  
  •  

找出4字节整数的中位数

  •  
  •  

找到整数的平方根

  •  
  •  

实现斐波那契

  •  

网络

  •  

用Java Socket编程,读服务器几个字符,再写入本地显示

  •  

反射

  •  

反射机制提供了什么功能?

  •  
  •  

反射是如何实现的

  •  
  •  

哪里用到反射机制

  •  
  •  

反射中 Class.forName 和 ClassLoader 区别

  •  
  •  

反射创建类实例的三种方式是什么

  •  
  •  

如何通过反射调用对象的方法

  •  
  •  

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

  •  
  •  

反射机制的优缺点

  •  

数据库

  •  

写一段 JDBC 连Oracle的程序,并实现数据查询

  •  

算法

  •  

50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少

  •  
  •  

实现一个电梯模拟器用

  •  
  •  

写一个冒泡排序

  •  
  •  

写一个折半查找

  •  
  •  

随机产生20个不能重复的字符并排序

  •  
  •  

写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组

  •  
  •  

写一段代码在遍历 ArrayList 时移除一个元素

  •  
  •  

古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少

  •  
  •  

约瑟芬环游戏

  •  

正则

  •  

请编写一段匹配IP地址的正则表达式

  •  
  •  

写出一个正则表达式来判断一个字符串是否是一个数字

  •  

字符串

  •  

写一个方法,入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

  •  
  •  

写一个程序找出所有字符串的组合,并检查它们是否是回文串

  •  
  •  

写一个字符串反转函数,输入abcde转换成edcba代码

  •  
  •  

小游戏,倒转句子中的单词

  •  
  •  

将GB2312编码的字符串转换为ISO-8859-1编码的字符串

  •  
  •  

请写一段代码来计算给定文本内字符“A”的个数。分别用迭代和递归两种方式

  •  
  •  

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”

  •  
  •  

给定 2 个包含单词列表(每行一个)的文件,编程列出交集

  •  
  •  

打印出一个字符串的所有排列

  •  
  •  

将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七)

  •  
  •  

在Web应用开发过程中经常遇到输出某种编码的字符,如从 GBK 到 ISO8859-1等,如何输出一个某种编码的字符串

  •  

日期

  •  

计算两个日期之间的差距

 

 

 


1. junit用法,before,beforeClass,after, afterClass的执行顺序

2. 分布式锁

3. nginx的请求转发算法,如何配置根据权重转发

4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)

5. 线程的状态

<p>1. junit用法,before,beforeClass,after, afterClass的执行顺序</p>

<p>2. 分布式锁</p>

<p>3. nginx的请求转发算法,如何配置根据权重转发</p>

<p>4. 用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)</p>

<p>5. 线程的状态</p>

<p>5. 线程的阻塞的方式</p>

<p>6. sleep和wait的区别</p>

<p>7. hashmap的底层实现</p>

<p>8. 一万个人抢100个红包,如何实现(不用队列),如何保证2个人不能抢到同一个红包,可用分布式锁</p>

<p>9. java内存模型,垃圾回收机制,不可达算法</p>

<p>10. 两个Integer的引用对象传给一个swap方法在方法内部交换引用,返回后,两个引用的值是否会发现变化</p>

<p>11. aop的底层实现,动态代理是如何动态,假如有100个对象,如何动态的为这100个对象代理</p>

<p>12. 是否用过maven install。 maven test。git(make install是安装本地jar包)</p>

<p>13. tomcat的各种配置,如何配置docBase</p>

<p>14. spring的bean配置的几种方式</p>

<p>15. web.xml的配置</p>

<p>16. spring的监听器。</p>

<p>17. zookeeper的实现机制,有缓存,如何存储注册服务的</p>

<p>18. IO会阻塞吗?readLine是不是阻塞的</p>

<p>19. 用过spring的线程池还是java的线程池?</p>

<p>20. 字符串的格式化方法 (20,21这两个问题问的太低级了)</p>

<p>21. 时间的格式化方法</p>

<p>22. 定时器用什么做的</p>

<p>23. 线程如何退出结束</p>

<p>24. java有哪些锁?乐观锁 悲观锁 synchronized 可重入锁 读写锁,用过reentrantlock吗?reentrantlock与synmchronized的区别</p>

<p>25. ThreadLocal的使用场景</p>

<p>26. java的内存模型,垃圾回收机制</p>

<p>27. 为什么线程执行要调用start而不是直接run(直接run,跟普通方法没什么区别,先调start,run才会作为一个线程方法运行)</p>

<p>28. qmq消息的实现机制(qmq是去哪儿网自己封装的消息队列)</p>

<p>29. 遍历hashmap的三种方式</p>

<p>30. jvm的一些命令</p>

<p>31. memcache和redis的区别</p>

<p>32. mysql的行级锁加在哪个位置</p>

<p>33. ConcurrentHashmap的锁是如何加的?是不是分段越多越好</p>

<p>34. myisam和innodb的区别(innodb是行级锁,myisam是表级锁)</p>

<p>35. mysql其他的性能优化方式</p>

<p>36. linux系统日志在哪里看</p>

<p>37. 如何查看网络进程</p>

<p>38. 统计一个整数的二进制表示中bit为1的个数</p>

<p>39. jvm内存模型,java内存模型</p>

<h1><strong>【阿里巴巴面试题目】</strong></h1>

<p>40. 如何把java内存的数据全部dump出来</p>

<p>41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收</p>

<p>42. hashmap如果只有一个写其他全读会出什么问题</p>

<p>43. git rebase</p>

<p>44. mongodb和hbase的区别</p>

<p>45. 如何解决并发问题</p>

<p>46. volatile的用途</p>

<p>47. java线程池(好像之前我的理解有问题)</p>

<p>48. mysql的binlog</p>

<p>49. 代理模式</p>

<p>50. mysql是如何实现事务的</p>

<p>51. 读写分离何时强制要读主库,读哪个从库是通过什么方式决定的,从库的同步mysql用的什么方式</p>

<p>52. mysql的存储引擎</p>

<p>53. mysql的默认隔离级别,其他隔离级别</p>

<p>54. 将一个链表反转(用三个指针,但是每次只发转一个)</p>

<p>55. spring Aop的实现原理,具体说说</p>

<p>56. 何时会内存泄漏,内存泄漏会抛哪些异常</p>

<p>57. 是否用过Autowire注解</p>

<p>58. spring的注入bean的方式</p>

<p>59. sql语句各种条件的执行顺序,如select, where, order by, group by</p>

<p>60. select xx from xx where xx and xx order by xx limit xx; 如何优化这个(看explain)</p>

<p>61. 四则元算写代码</p>

<p>62. 统计100G的ip文件中出现ip次数最多的100个ip</p>

<p>63. zookeeper的事物,结点,服务提供方挂了如何告知消费方</p>

<p>64. 5台服务器如何选出leader(选举算法)</p>

<p>65. 适配器和代理模式的区别</p>

<p>66. 读写锁</p>

<p>67. static加锁</p>

<p>68. 事务隔离级别</p>

<p>69. 门面模式,类图(外观模式)</p>

<p>70. mybatis如何映射表结构</p>

<p>71. 二叉树遍历</p>

<p>72. 主从复制</p>

<p>73. mysql引擎区别</p>

<p>74. 静态内部类加载到了哪个区?方法区</p>

<p>75. class文件编译后加载到了哪</p>

<p>76. web的http请求如何整体响应时间变长导致处理的请求数变少,该如何处理?用队列,当处理不了那么多http请求时将请求放到队列</p>

<p>中慢慢处理,web如何实现队列</p>

<p>77. 线程安全的单例模式</p>

<p>78. 快速排序性能考虑</p>

<p>79. volatile关键字用法</p>

<p>80. 求表的size,或做数据统计可用什么存储引擎</p>

<p>81. 读多写少可用什么引擎</p>

<p>82. 假如要统计多个表应该用什么引擎</p>

<p>83. concurrenhashmap求size是如何加锁的,如果刚求完一段后这段发生了变化该如何处理</p>

<p>84. 1000个苹果放10个篮子,怎么放,能让我拿到所有可能的个数</p>

<p>85. 可重入的读写锁,可重入是如何实现的?</p>

<p>86. 是否用过NIO</p>

<p>87. java的concurrent包用过没</p>

<p>88. sting s=new string("abc")分别在堆栈上新建了哪些对象</p>

<p>89. java虚拟机的区域分配,各区分别存什么</p>

<p>90. 分布式事务(JTA)</p>

<p>91. threadlocal使用时注意的问题(ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享)</p>

<p>92. java有哪些容器(集合,tomcat也是一种容器)</p>

<p>93. 二分查找算法</p>

<p>94. myisam的优点,和innodb的区别</p>

<p>95. redis能存哪些类型</p>

<p>96. http协议格式,get和post的区别</p>

<p>97. 可重入锁中对应的wait和notify</p>

<p>98. redis能把内存空间交换进磁盘中吗(这个应该是可以的,但是那个面试官非跟我说不可以)</p>

<p>99. java线程池中基于缓存和基于定长的两种线程池,当请求太多时分别是如何处理的?定长的事用的队列,如果队列也满了呢?交换进磁盘?基于缓存的线程池解决方法呢?</p>

<p>100. synchronized加在方法上用的什么锁</p>

<p>101. 可重入锁中的lock和trylock的区别</p>

<p>102. innodb对一行数据的读会枷锁吗?不枷锁,读实际读的是副本</p>

<p>103. redis做缓存是分布式存的?不同的服务器上存的数据是否重复?guava cache呢?是否重复?不同的机器存的数据不同</p>

<p>104. 用awk统计一个ip文件中top10</p>

<p>105. 对表做统计时可直接看schema info信息,即查看表的系统信息</p>

<p>106. mysql目前用的版本</p>

<p>107. 公司经验丰富的人给了什么帮助?(一般boss面会问这些)</p>

<p>108. 自己相对于一样的应届生有什么优势</p>

<p>109. 自己的好的总结习惯给自己今后的工作带了什么帮助,举例为证</p>

<p>110. 原子类,线程安全的对象,异常的处理方式</p>

<p>111. 4亿个int数,如何找出重复的数(用hash方法,建一个2的32次方个bit的hash数组,每取一个int数,可hash下2的32次方找到它在hash数组中的位置,然后将bit置1表示已存在)</p>

<p>112. 4亿个url,找出其中重复的(考虑内存不够,通过hash算法,将url分配到1000个文件中,不同的文件间肯定就不会重复了,再分别找出重复的)</p>

<p>有1万个数组,每个数组有1000个整数,每个数组都是降序的,从中找出最大的N个数,N&lt;1000</p>

<p>113. LinkedHashmap的底层实现</p>

<p>114. 类序列化时类的版本号的用途,如果没有指定一个版本号,系统是怎么处理的?如果加了字段会怎么样?</p>

<p>115. Override和Overload的区别,分别用在什么场景</p>

<p>116. java的反射是如何实现的</p>

<h1><strong>【阿里巴巴面试题目含答案】</strong></h1>

<p>1,mysql的三大引擎是啥?</p>

<p>mysql常用的引擎有InnoDB,MyISAM,Memory,默认是InnoDB</p>

<p>InnoDB:磁盘表,支持事务,支持行级锁,B+Tree索引</p>

<p>ps:优点: 具有良好的ACID特性。适用于高并发,更新操作比较多的表。需要使用事务的表。对自动灾难恢复有要求的表。</p>

<p>缺点:读写效率相对MYISAM比较差。占用的磁盘空间比较大。</p>

<p>mysql的4大特性+4种隔离级别:</p>

<p>MyISAM:磁盘表,不支持事务,支持表级锁,B+Tree索引</p>

<p>ps: 优点:占用空间小,处理速度快(相对InnoDB来说)</p>

<p>缺点:不支持事务的完整性和并发性</p>

<p>MEMORY(Heap):内存表,不支持事务,表级锁,Hash索引,不支持Blob,Text大类型</p>

<p>ps: 优点:速度要求快的,临时数据</p>

<p>缺点:丢失以后,对项目整体没有或者负面影响不大的时候。</p>

<p>2,redis的hash算法用的是啥?</p>

<p>redis应该是使用一致性hash算法---MurmurHash3 算法,具有低碰撞率优点,google改进的版本cityhash也是redis中用到的哈希算法。</p>

<p>现有的主流的大数据系统都是用的 MurmurHash本身或者改进</p>

<p>3,nosql为啥比sql快?</p>

<p>Nosql是非关系型数据库,因为不需要满足关系数据库数据一致性等复杂特性所以速度快;</p>

<p>sql是关系型数据库,功能强大,但是效率上有瓶颈</p>

<p>4,什么是索引为啥nosql没索引?nosql有索引滴</p>

<p>索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。</p>

<p>聚簇索引:有主键时,根据主键创建聚簇索引;没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引;如果以上两个都不满足那innodb自己创建一个虚拟的聚集索引</p>

<p>非聚簇索引:非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引</p>

<p>5,B+树和B树区别?</p>

<p>B树的非叶子节点存储实际记录的指针,而B+树的叶子节点存储实际记录的指针</p>

<p>B+树的叶子节点通过指针连起来了, 适合扫描区间和顺序查找。</p>

<h1><strong>BATJ面试题目</strong></h1>

<p><strong>给大家推荐一个程序员学习交流一群:<a href="https://jq.qq.com/?_wv=1027&amp;k=5C2WvNh" rel="nofollow">878249276 </a>,群里有分享的视频,面试指导,架构资料,还有思维导图<br />
群公告有视频,都是干货的,你可以下载来看。主要分享分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师视频。</strong></p>

<p><strong>以下列举22个视频资料。</strong></p>

<p><strong>1,应该怎么封装简历才有BATJ面试机会?</strong></p>

<p><strong>2,HashMap底层执行原理,</strong></p>

<p><strong>3,hashtable和ConcurrentHashMap如何实现线程安全?</strong></p>

<p><strong>4,jvm的内存布局,垃圾回收机制</strong></p>

<p><strong>5,类加载机制里的,双亲委派模型</strong></p>

<p><strong>6,阐述事务的隔离级别和传播属性</strong></p>

<p><strong>7,高并发下,如何做到安全的修改同一行数据?</strong></p>

<p><strong>8,A服务调用B服务多接口,响应时间最短方案;</strong></p>

<p><strong>9,A系统给B系统转100块钱,如何实现?</strong></p>

<p><strong>10,动态代理的几种实现方式及优缺点</strong></p>

<p><strong>11,多线程下读概率远远大于写概率,如何解决并发问题?</strong></p>

<p><strong>12,按线程池内部机制,当提交新任务时,有哪些异常要考虑?</strong></p>

<p><strong>13,@Transaction注解一般写在什么位置?如何控制其回滚?</strong></p>

<p><strong>14,说说Spring的IOC容器初始化流程?</strong></p>

<p><strong>15,说说springboot启动机制</strong></p>

<p><strong>16,Redis高性能的原因大概可以讲一些?</strong></p>

<p><strong>17,你是怎么控制缓存的更新?(被动方式/主动方式/增量/全量)?</strong></p>

<p><strong>18,浅析Http和https的三次握手有什么区别。</strong></p>

<p><strong>19,谈谈Session/cookie机制,如何实现会话跟踪?</strong></p>

<p><strong>20,什么是一致性hash?</strong></p>

<p><strong>21,MQ有可能发生重复消费,如何避免,如何做到幂等?</strong></p>
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值