前言:作为2021届毕业生,受疫情影响,工作机会竞争压力非常大. 对于开学之后马上要开始的秋季校招,我们必须认真扎实的复习.
经过我亲身体验,只在网络上阅读面经效果不太理想. 俗话说:好记性不如烂笔头,那我就索性自己整理下,也算是对知识的进一步理解. 作为一名Java学习者,我的知识储备远远不足,因此如在博文中有错误或理解不当之处,请大家批评指正.

注:题目均来源于牛客网Java面经,答案是经过网上查阅整理出来一些比较清楚明白的博客内容加之自己的理解,由于阅读过的博客数量较大,无法逐一上传转载地址,在此感到十分抱歉,由衷感谢所有认真书写博客的笔友,谢谢你们做出的努力让我有了参考之鉴.

一、Java SE

1.Java和PHP的区别
(1)编程范式
Java是纯面向对象的语言;PHP既可使用面向对象的方式编程,也可面向过程的方式
(2)语言类型
Java是强类型语言,变量在使用之前必须声明类型;PHP是弱类型语言,变量不必声明类型
(3)部署方式
JAVAEE:Linux系统+Tomcat服务器+Mysql数据库+Java语言;PHP:Linux系统+Apache服务器+Mysql数据库+PHP语言
(4)常量
Java中的常量需要自己定义;PHP中常用的有两种常量:define、const
(5)方法重载
Java支持通过方法重载实现多态;PHP不支持,且可能永远都不支持

2.Java中如何支持正则表达式操作
Java中的String()类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split(),此外Java中还可以使用Pattern类表示正则表达式对象

3.简单描述一下正则表达式及其用途
参考链接:https://blog.csdn.net/qq_30034925/article/details/70216525?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

4.比较Java和JavaScript
(1)语言特点:JavaScript是动态的(定义的数组长度可以变化,一个数组内可以是不同数据类型的元素)弱类型语言,使用前不需要声明变的数据类型;Java是强制类型语言,变量的类型必须提前定义
(2)JavaScript的程序代码由客户端浏览器解释执行;Java程序必须先编译,然后在客户端的JVM环境下执行
(3)JavaScript是基于对象的一种脚本语言;Java是一种完全面向对象的编程语言
(4)JavaScript共有5大数据类型:number,String,boolean,null,undefined;Java有8大基本数据类型
(5)JavaScript主要用于嵌入文本于HTML页面,读写HTML元素,控制cookies;Java应用于PC端、手机端、互联网等

5.Java中如何跳出当前多重嵌套循环
Java中保留的关键字goto,但实际没有什么作用. break只能跳出当前的一个循环语句.
若要跳出多个循环体可有两种办法:
(1)可在循环体开头设置一个标志位,即一个标记,然后使用带此标号的break语句跳出多重循环
(2)设置一个boolean值的标记,在for循环中进行判断是否继续循环

6.&和&&的区别
(1)两者都可用作逻辑与,当运算符两边的表达式均为true时,结果为true
(2)&&具有短路功能,即若第一个表达式为false,不再判断右边的表达式,结果为false
(3)&还可作位运算符,当操作符两边的表达式不是boolean类型时,表示按位与操作

7.int和Integer区别
(1)Integer是基本数据类型int的包装类
(2)Integer变量必须经过实例化后方可使用,但int变量不需要
(3)Integer实际是对象的引用,当new一个Integer变量时,实际上是生成一个指针指向此对象;而int 直接存储数据值
(4)Integer默认值为null;int为0

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

9.String和StringBuilder,StringBuffer的区别
String:底层是一个final类型的字符数组,因此String的值是不可变的. 字符串常量. 每次对String类型进行操作时等同于生成了一个新的String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要使用String,会对系统性能产生影响
StringBuilder:底层时可变的字符数组,字符串变量(线程安全). 每次结果是对StringBuider对象本身进行操作,并非生成新的对象
StringBuffer:底层时可变的字符数组,线程安全

10.String是最基本的数据类型吗
Java中的基本数据类型只有8个:byte、short、int、double、float、long、boolean、char,除了基本数据类型和枚举类型,剩下的都是引用类型

11.讲讲大O符号(big-O notaion)并给出不同数据结构的例子

12.数组(Array)和列表(ArrayList)区别?什么时候使用Array非ArrayList
(1)Array:声明数组时需要初始化并确定长度,且其容量固定无法动态改变,只能存储同一类型的数据;
ArrayList:需要先声明再添加数据,长度是根据内容的多少而动态改变,可以存放不同类型的数据,若存储基本数据类型需要使用基本数据类型的包装类
(2)ArrayList底层使用数组实现,当使用无参构造方法生成ArrayList对象时,会在底层生成一个长度为10的Object类型的数组

在能确定长度并且数据类型一致的时候使用数组,其他情况使用ArrayList

13.值传递和引用传递
值传递:针对基本数据类型,传递的是该变量的一个副本,改变副本不影响原变量
引用传递:针对对象型变量,传递的是该对象地址的一个副本,并非元对象本身
一般认为,Java内的基本类型数据传递均为值传递,实例对象的传递是引用传递

14.Java支持的数据类型有哪些?什么是自动拆装箱?
Java中包括8个基本数据类型,与之对应的有8个包装类型

基本数据类型 包装类型
byte Byte
short Short
int Integer
double Double
float Float
long Long
boolean Boolean
char Character

装箱:将基本数据类型转化为包装类的过程
拆箱:将包装类转化为基本数据的过程

15.为什么会出现4.0-3.6=0.40000001这种现象?

16.讲讲一个十进制的书在内存中如何存储

17.Lamda表达式的优缺点

18.Java8的新特性,简单介绍一下

19.符号“==”比较的是什么
“==”是直接比较的两个对象的堆内存地址. 若相等,则说明这两个引用实际是指向同一个对象地址的

20.若Object不重写hashCode(),hashCode()如何计算出来的

21.为什么需要同时重写equals和hashCode
object的equals默认是比较内存地址,hashcode默认是内存地址的哈希值,如果equals重写了,他为true时两个对象并不一定内存地址一样,这个时候,如果不重写hashcode,那么他会默认用object的hashcode方法,所以他们的hashcode值是不一样的。就导致两个对象equals相等但是hashcode不相等,这个对象应用在hashmap作为key时他们是先判断hashcode是否相等再比较equals,不相等就为不同的key,所以这样的对象不能应用在hashmap和set里作为key

22.介绍一下Map的分类和常见的情况

23.Java中的final关键字

  • 修饰变量:表示变量只能赋值一次且赋值以后值不可被修改(常量)
  • 修饰方法:表示方法不可被重写
  • 修饰类:表示类不可被继承

24.讲讲Synchronized和lock,若使用关键字synchronized修饰一个静态方法,锁住了什么,若修饰成员方法,锁住了什么
它的修饰对象有几种:
修饰一个类,其作用的范围是synchronized后面括号括起来的部分, 作用的对象是这个类的所有对象。
修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法, 作用的对象是调用这个方法的对象;
修改一个静态的方法,其作用的范围是整个静态方法, 作用的对象是这个类的所有对象;
修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码, 作用的对象是调用这个代码块的对象;

25.介绍一下volatile
volatile是Java提供的一种轻量级的同步机制,Java语言包含两种内在的同步机制:同步块和volatile变量,相较于synchronized,volatile更轻量级

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

27.请解释hashCode()和equals()方法的联系

  • 若重写了equals(Object obj)方法,则有必要重写hashCode()方法
  • 若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数
  • 若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数
  • 若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true
  • 若两个对象hashCode()返回不同int数,则equals(Object obj)一定返回false
  • 同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题

总结:
(1)hashCode是为了提高在散列结构中共存储中查找元素的效率,在线程表中没有作用
(2)equals和hashCode需要同时覆盖

28.解释下什么是构造函数,什么是构造函数重载,什么是复制构造函数

  • 构造函数:方法名与类名相同,没有返回值的函数. 当新对象被创建时,构造函数就会被调用,每个类都有构造函数. 若程序中没有提供构造函数,则Java编译器默认为该类创建一个无参构造函数

  • 构造函数重载:与方法重载相似,可以为一个类创建多个构造函数,每个构造函数有其唯一个参数列表

  • 复制构造函数:Java中不支持方法的复制,C++支持

29.说明Java中的方法覆盖和方法重载是什么意思,重载的方法能否根据返回类型进行区分
方法重写和方法重载均是Java中多态的体现,重写为运行时多态,重载为编译时多态
方法重载:出现在同一个类中,方法名相同,参数列表中参数顺序、个数、类型均不同. 与方法的返回值类型无关
方法重写:出现在两个具有继承关系的类中,要求子类中重写的父类方法具有与父类方法相同的方法名、参数列表以及返回值类型,且要比父类方法更好访问,抛出更少的异常

重载的方法不可根据返回值类型进行区分,因为调用时不可指定类型信息,编译器并不知道要调用哪个函数

30.说明Query接口中的List方法和iterate方法有什么区别
1、返回的类型不同,list()返回List,iterate()返回Iterator

2、获取方式不同,list会一次性将数据库中的信息全部查询出,iterate会先把所有数据的id查询出来,然后真正要遍历某个对象的时候先到缓存中查找,如果找不到,以id为条件再发送一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1

3、iterate会查询2级缓存,list只会查询一级缓存

4、list中返回的List中每个对象都是原本的对象,iterate中返回的对象是***对象。(debug可以发现)

31.谈一下面向对象的“六原则一法则”
(1)单一职责原则:一个类只能做一件事情
(2)开闭原则:软件实体应该对扩展开放,修改关闭
(3)依赖倒转原则:面向接口编程
(4)李氏替换原则:任何时候都可以用子类型替换父类型
(5)接口隔离原则:接口要小而专,绝不能大而全
(6)合成聚合复用原则:优先使用聚合或合成关系复用代码
(7)迪米特法则:一个对象应当对其他对象由尽可能少的了解(低耦合)

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

33.两个对象值相同,但却有不同的hashcode,该说法是否正确
不对,如果两个对象x和y满足x.equals(y)==true,则它们的哈希码应该相同
Java对于equals和hashCode方法是这样规定的:
(1)如果两个对象相同,则它们的hashCode值一定要相同
(2)如果两个对象的hashCode相同,它们不一定相同

34.内部类可以引用它包含类的成员吗,若可以,有没有什么限制
一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员和方法

35.请说明Java语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗
Java通过面向对象的方法进行异常处理,将各种不同的异常进行分类,并提供了良好的接口. 异常处理通过5个关键字来处理:throws,throw,try,catch,finally

  • throws:用于方法名之后,表示抛出一个或多个异常类
  • throw:用于手动抛出一个异常对象
  • try:表示程序正常的业务执行代码,若在执行try块中的代码出现了异常,JVM会生成一个异常对象,该异常对象会在后面的catch块中被捕获
  • catch:表示一个异常捕获块,用于处理try块中产生的异常对象
  • finally:表示异常处理过程中总会执行的代码块
    对于一个完整的异常处理流程,try块不可缺少,后面可跟一个或多个catch块,最后还可有finally块

try块中可以抛出异常

36.说明Java的接口和C++的虚类的相同和不同处

37.当一个对象被当作参数传递给一个方法后,此方法可改变这个对象的属性,并返回变化后的结果,则这里是值传递还是引用传递
值传递. Java语言的方法调用只支持参数的值传递. 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用. 对象的属性可以在被调用过程中被改变,但是对对象引用的改变是不会影响到调用者的.

38.static nested class和inner class的不同
static nested class:静态嵌套类,其实例化对象不能也无法绑定外围类的实例化对象
inner class:内部类,其实例化对象需要绑定一个外围类的实例化对象. 可以访问其所绑定的外部类的所有成员属性和方法,包括私有成员属性和方法

39.abstract class和interface的区别

  • 关键字:抽象类需要继承,使用extends;接口需要实现,使用implements
  • 实例化:均不可被实例化
  • 方法:抽象类可以有私有化的、非抽象的方法以及静态方法;接口中的方法均为public abstract类型
  • 数据成员:抽象类中可以有普通成员变量;接口中的数据成员均为public static final类型
  • 构造方法:抽象类中可以有;接口中没有
  • 子类数量:一个类只能继承一个抽象类;一个类可以实现多个接口

40.说明一下final,finally,finalize的区别

  • final:修饰的变量必须在声明时初始化,且不可再修改;修饰的方法不可被重写;修饰的类不可被继承
  • finally:异常处理时用来执行任何清除操作,无论是否有异常被抛出或捕获,finally块中的代码均会被执行
  • finalize:Java中,在垃圾回收器将对象从内存中回收之前需要做清理工作,在确定该对象没有被引用时调用finalize()方法. 定义于Object类中,因此所有的类都有该方法

41.面向对象的特征有哪些方面
(1)抽象:将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象.
(2)封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口 .面向对象的本质就是把现实世界描绘成一系列完全自治、封闭的对象
(3)继承:从已有类得到继承信息创建新类的过程,提供继承信息的类称为父类(超类、基类),得到继承信息的类称为子类(派生类)
(4)多态:允许不同子类型的对象对同一消息作出不同的响应,分为编译时多态性(方法重载)和运行时多态性(方法重写)

42.说明Comparable和Comparator接口的作用以及它们的区别

43.Java是否支持多继承
Java中不支持多继承,但支持多重继承(一个类可以实现多个接口).
一个类只能有一个父类,但一个父类可以有多个子类

44.如何通过反射创建对象
(1)通过类对象调用newInstance()方法,例如:String.class.newInstance();
(2)通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器对象并调用其newInstance()方法创建对象,例如:String.class.getConstructor(String.class).newInstance("Hello");

45.是否可以在static环境中访问非static变量
不可以

46.解释一下extends和super泛型限定符

47.什么是泛型
泛型:一种参数化类型的机制,可以使得代码适用于各种类型,编写更加通用的代码,如:集合框架
泛型可以省略,若省略,默认泛型是Object类型
泛型的好处:(1)省略了强转的代码(2)可以把运行时的问题提前到编译时期(Java中的泛型只在编译阶段有效)

泛型有三种使用方式:泛型类、泛型接口、泛型方法
泛型类:泛型用于类的定义中,通过泛型可以完成对一组类的操作对外开放相同的接口. 如各种容器类,List、Set、Map
注意:泛型的类型参数只能是类类型,不可是简单类型;不能对确切的泛型类型使用 instanceof 操作

泛型接口:常用在各种类的生产器中
泛型方法:在调用方法的时候指明泛型的具体类型

48.静态变量存储在什么位置
存储在全局/静态存储区中

扩展:常见的存储区域:
(1)栈:由编译器在需要的时候分配,通常存储局部变量和函数参数
(2)堆:通过new分配的内存块,程序结束后,操作系统会自动回收
(3)自由存储区:由malloc等分配的内存块,使用free释放内存
(4)全局/静态存储区:存储全局变量和静态变量
(5)常量存储区:存储常量,不允许修改

49.解释一下类加载机制,双亲委派模型,好处是什么
代码经过编译后会生成JVM能够识别的二进制字节流文件(*.class),Java虚拟机将描述类的数据从class文件按加载到内存中,对加载的数据进行验证、解析、初始化、最终得到虚拟机认可后转化为直接可以使用的Java类型的过程称为类加载机制

  • 类加载器的双亲委派加载机制:当一个类收到了类加载请求,它首先不会尝试去加载这个类,而是将这个请求委派给父类去完成,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终到达顶层的启动类加载器. 若父类加载器反馈无法完成这个请求加载时(在父类加载器的加载路径没有找到需要加载的Class),子类加载器才会尝试自己去加载

  • 双亲委派模型的源码实现:
    主要体现在ClassLoader的loadClass()方法中,思路如下:先检查该类是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父类加载器为空则默认使用启动类加载器作为父类加载器. 若父类加载器加载失败,抛出ClassNotFoundException异常,然后调用自己的findClass()方法进行加载

  • 双亲委派模型的优点:
    Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层次关系可以避免类的重复加载,当父类加载器已经加载了该类时,就不需要子类加载器再加载一次. 其次还有安全因素,Java核心API中定义类型不会被随意替换. 假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已经被加载过,并不会重新加载网络传递过来的java.lang.Integer,而直接返回已经加载过的Integer.class,这样可以防止核心API库被随意篡改

50.StringBuilder和StringBuffer的区别,以及底层实现
两者底层均是可变的字符数组
StringBuilder:非线程安全,执行速度快
StringBuffer:源码中有修饰符synchronized,故线程安全,但是执行速度较慢

51.String能否被继承
不能

52.static关键字是什么意思,Java中是否可以覆盖一个private或者是static的方法
static表示静态的,可以用来修饰成员变量和成员方法.

  • static修饰的方法/变量可以直接通过类名访问,并非必须创建对象再对类中的静态方法/变量进行访问
  • static修饰的变量/代码块/方法在该类被加载时只加载并运行一次

Java中不可覆盖一个private的方法或一个static的方法

53.列举Object类的方法并简要说明

  • clone():创建并返回对象的一个副本
  • equals():判断两个对象是否相等
  • hashCode():返回对象的哈希码值
  • notify():唤醒在对象监视器上等待的单个线程
  • notifyAll():唤醒在此对象监视器上等待的所有线程
  • toString():返回对象的字符串表示
  • wait():在其他线程调用此对象的notify()或notifyAll()方法前,导致当前线程等待

54.说明类和对象的区别
类:具有相同属性和行为的一组对象的集合
对象:用来描述客观事物的一个实体

类与对象的关系:类的实例化结果是对象,类是对一类对象的抽象

55.解释String为什么不可变
从源码分析,String底层是一个final类型的字符数组,使用关键字final修饰的变量在初始化后均不可被修改,因此每次对String的操作都会生成新的String对象,造成内存浪费

56.Java有哪些特性,举一个和多态有关的例子

57.wait方法的底层原理
wait()方法会造成Java中的线程阻塞,执行wait()方法时,会释放CPU的执行权,即释放同步锁,使得其他线程可以使用同步控制块或同步方法

58.说明List,Map,Set三个接口存取元素时,各有什么特点
存放元素:

  • List:以特定的索引或顺序存放元素,可以有重复的元素
  • Map:保存的是键值对之间的映射,键无序不可重复,值可以重复
  • Set:存放的元素无序,不可含有重复元素

获取元素:

  • List:通过for循环,foreach循环,Iterator迭代器迭代
  • Map:需要先转换为Set,然后进行Iterator迭代器迭代,或者转换为Entry对象进行迭代
  • Set:通过foreach,Iterator迭代器迭代

59.阐述ArrayList,Vector,LinkedList的存储性能和特性

60.List,Set,Map是否继承自Collection接口
List,Set继承自Collection接口,Map没有继承Collection接口
Map提供key到value的映射,一个Map中不能包含相同的key,每个key只能映射一个value

61.讲讲所知道的常用集合类以及主要方法

62.说明Collection和Collections的区别
java.util.Collection:一个集合框架的父接口,提供了对集合对象进行基本操作的通用接口方法
java.util.Collections:一个包装类,包含各种有关集合操作的静态多态方法(用于实现对各种集合的搜索、排序、线程安全化等操作),该类不可实例化

63.简要说明ArrayList,Vector,LinkedList的存储性能和特性是什么
关系:三者均是List接口的实现类

ArrayList:采用数组存储数据,将数据存放在连续的位置;查询速度较快,但插入删除效率较低,非线程安全,扩容时默认增长为原来容量的一般
Vector:采用数组存储数据,使用了修饰符synchronized,线程安全;性能上较ArrayList差,扩容时默认增长为原来容量的一倍
LinkedList:采用双向循环链表存储数据;插入删除速度快,查询效率较低

64.HashMap和Hashtable的区别

  • 父类:HashMap继承自AbstractMap;Hashtable继承自Dictionary
  • 安全性:HashMap非线程安全;Hashtable线程安全
  • 对Null key和Null value的支持:HashMap两者均支持;Hashtable两者均不支持
  • 初始容量大小:HashMap默认的初始化大小为16,之后每次扩充,容量变为原来的2倍;Hashtable默认的初始化大小为11,之后每次扩充,容量变为原来的2n+1倍

65.快速失败和安全失败的区别
快速失败(fail-fast)和安全失败(fail-safe)均属于常见的容错机制

  • 快速失败:尽可能的发现系统中的错误,使系统能够按照事先设定好的错误的流程执行
    以Java集合的快速失败为例:当多个线程对同一个集合的内容进行操作时,就可能产生fail-fast事件. 如:当某一个线程A通过iterator遍历某集合时,若该集合的内容被其他线程改变了,则线程A访问集合时,就会抛出ConcurrentModificationException异常(发现错误执行设定好的错误的流程),产生fail-fast事件

  • 安全失败:即使在出现故障的情况下也不会造成伤害或者尽量减少伤害
    如:红绿灯的“冲突监测模块”,当监测到错误或冲突的信号时会将十字路口的红绿灯变为闪烁错误模式,并非全部显示为绿灯

66.Iterator和ListIterator的区别

67.简单说明一下什么是迭代器
迭代器是一种设计模式,可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么,只要拿到这个对象,使用迭代器就可以进行遍历

68.解释下为什么集合类没有实现Cloneable和Serializable接口
克隆:将一个对象里面的属性值复制给另一个对象,并非对象引用的复制
序列化:可以将对象数据和字节流互相转换,也可将对象数据用于网络传输

根据两者的语义和含义都是与具体的实现相关的,因此应该由集合类的具体实现类来决定是否进行克隆或序列化

69.说明Java集合类框架的基本接口有哪些
总共由两大接口:Collection和Map,一个是元素集合,一个是键值对集合

  • List接口和Set接口继承了Collection接口,List为有序可重复集合,Set为无序不可重复集合;
  • ArrayList和LinkedList实现了List接口,ArrayList底层采用数组存储,LinkedList底层采用双向循环链表存储;
  • HashSet(哈希表、散列表)实现了Set接口;
  • HashMap和Hashtable实现了Map接口,HashMap非线程安全,Hashtable是线程安全的

70.说明一下ConcurrentHashMap的原理

71.解释一下TreeMap

  • 一个有序的key-value集合,通过红黑树实现
  • 继承于AbstractMap,因此是一个Map,即一个key-value集合
  • 实现了Cloneable接口,即可以被克隆
  • 实现了Serializable接口,即可以被序列化
  • 不能有null-key,但可以有多个null-value
  • 非线程安全
  • 该iterator()方法返回的迭代器时快速失败的
  • 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的Comparator进行排序,具体取决于使用的构造方法

72.说明ArrayList是否会越界
73.说明concurrenthashmap的优势,1.7和1.8的区别以及锁加在了什么地方
74.说明一下TreeMap的底层实现
75.解释HashMap的容量为什么时2的n次幂
76.简单介绍一下ArrayList和LinedList的区别,并说明如果一直在list的尾部添加元素,使用哪种方式效率高
77.若HashMap的key是一个自定义的类,如何处理

78.解释一下HashMap具体如何实现
HashMap是基于哈希表的Map接口的实现,该映射允许使用null-key和null-value,非线程安全

79.map和concurrentHashMap的区别

80.如何保证线程安全
线程安全并非是一个“非黑即白”的单项选择题,按照安全程度可分为5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立

保证线程安全以是否需要同步手段分类,分为同步方案和无需同步方案
同步方案:
(1)互斥同步
同步是指在多线程并发访问共享数据时,保证共享数据在同一时候只被一个线程使用

81.简要说明一下线程的基本状态以及状态之间的关系
Java线程具有5种基本状态:
新建状态:当线程对象被创建后,即进入了新建状态
就绪状态:当调用线程对象的start()方法,线程即进入就绪状态. 处于就绪状态的线程,只能说明该线程已经做好了准备,随时等待CPU调度执行,并不是执行了start()方法后线程立即执行
运行状态:当CPU开始调度处于就绪状态的线程时,此时线程才得以真正的执行,即进入运行状态

注:就绪状态是进入到运行状态的唯一入口,即线程要想进入运行状态执行,首先必须处于就绪状态

阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用进入运行状态
死亡状态:线程执行完了或者因为异常退出了run()方法,该线程结束了生命周期

5个状态之间的相互转换关系

82.解释一下什么是线程池
“池化技术产生的原因”:面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者更多资源,所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数.
线程池:事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销

83.举例说明同步和异步
同步:如果系统中存在临界资源(资源数量少于竞争资源的线程数量的资源). 例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就必须进行同步存取(数据库操作中的排他锁)

异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,应该使用异步编程,很多情况下采用异步途径效率更高

同步是指阻塞式操作,异步是非阻塞式操作

84.介绍一下线程同步和线程调用的相关方法

85.若当一个线程进入一个对象的synchronized方法A之后,其他线程是否可进入此对象的synchronized方法B
不能
synchronized方法的锁对象是当前的类对象,当一个线程进入方法A时,在没有释放锁之前,方法B没有没有执行

86.简述一下线程的sleep()方法和yield()方法有什么区别
(1)sleep()方法给其他线程运行机会时不会考虑线程的优先级,因此会给优先级低的线程以运行机会;yield()方法只会给相同优先级或更高优先级的线程运行机会
(2)线程执行sleep()方法转入阻塞状态,而执行yield()方法转入就绪状态
(3)sleep()方法比yield()方法具有更好的可移植性
(4)sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常

87.Java中有几种方法可以实现一个线程?使用什么关键字修饰同步方法?stop()和suspend()方法为什么不推荐使用
88.说明多线程和同步有几种实现方法,且这些实现方法具体内容都是什么
89.线程同步的方法
wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象锁
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法需要处理InterruptedException异常
notify():唤醒一个处于等待状态的线程. 在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM决定唤醒哪一个线程,与优先级无关
notifyAll():唤醒所有处于等待状态的线程,该方法并不是将锁对象个所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态

90.启动一个线程使用run()还是start()
启动一个线程时调用start()方法,使线程所代表的虚拟处理机处于可运行状态,意味着可以由JVM调度并执行,但这并不代表线程会立即执行
run()方法是线程启动后要进行回调的方法

91.使用内部类实现线程设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1

92.说明一下线程中的同步和异步有什么异同,举例说明在什么情况下会使用同步和异步
同步:当多个线程对相同的数据进行操作时,使用同步
异步:当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,使用异步

93.说明一下在监视器(Monitor)内部,是如何做到线程同步的?在程序又应该做哪种级别的同步呢?
在JVM中,每一个对象都有一把锁,一旦被synchronized修饰,则这部分就会被监视器监视,用来确保一次只有一个线程执行该部分的代码

94.请分析一下同步方法和同步代码块的区别是什么?
同步方法:由synchronized修饰的方法,锁对象即是当前类对象
同步代码块:由synchronized修饰的代码块,锁对象默认为当前类对象,但是也可以存放其他类的对象

95.请详细描述一下线程从创建到死亡的几种状态都有哪些?
Java线程具有5种基本状态:
新建状态:当线程对象被创建后,即进入了新建状态
就绪状态:当调用线程对象的start()方法,线程即进入就绪状态. 处于就绪状态的线程,只能说明该线程已经做好了准备,随时等待CPU调度执行,并不是执行了start()方法后线程立即执行
运行状态:当CPU开始调度处于就绪状态的线程时,此时线程才得以真正的执行,即进入运行状态

注:就绪状态是进入到运行状态的唯一入口,即线程要想进入运行状态执行,首先必须处于就绪状态

阻塞状态:处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用进入运行状态
死亡状态:线程执行完了或者因为异常退出了run()方法,该线程结束了生命周期

96.创建线程有几种不同的方式?你喜欢哪一种?为什么?
(1)继承Thread类创建线程,重写run()方法
(2)实现Runnable接口创建线程,重写run()方法
(3)使用Callable和Future创建线程
(4)使用线程池,例如:Executor

四种创建线程方法对比:

  • 实现Runnable和实现Callable接口的方式基本相同,后者执行call()方法有返回值,线程执行体run()方法无返回值
  • 通过接口方式创建线程,线程类还可以继承其他类
  • 前三种的线程如果创建关闭频繁会消耗系统资源影响性能,使用线程池可以提高效率

97.请解释一下Java多线程回调是什么意思?

98.请列举一下启动线程有哪几种方式,之后再说明一下线程池的种类都有哪些?
线程启动:
(1)继承Thread类,重写run()方法,然后实例化调用start()方法
(2)实现Runnable接口。实现run()方法,使用Thread包装该类,实例化然后调用start()方法
(3)使用线程池,通过execute将任务添加进去

线程池的种类:
(1)newCachedThreadPool()
(2)newFixedThreadPool()
(3)newSingleThreadExecutor()
(4)newScheduledThreadPool()
(5)newSingleThreadScheduledExecutor()

99.请简要说明一下JAVA中CyclicBarrier和CountDownLatch的区别分别是什么?
相同之处:

  • 两个都是java.util.concurrent包下的多线程工具类
  • 两个类都有让多个线程等待同步然后再开始下一步动作的意思

不同之处:

  • 两者进行下一步动作的动作实施者是不一样的,对于前者,下一步动作实施者是“其他线程”(执行任务的其他线程),具有往复多次实施动作的特点;后者是main函数(主线程),具有不可重复性

100.请说明一下线程池有什么优势?
(1)重用线程池的线程,避免因为线程的创建和销毁锁带来的性能开销
(2)有效控制线程池的最大并发数,避免大量的线程之间因抢占系统资源而阻塞
(3)能够对线程进行简单的管理,并提供一些特定的操作,如:提供定时、定期、单线程、并发数控制等功能

101.请回答一下Java中有几种线程池?并且详细描述一下线程池的实现过程
(1)newCachedThreadPool:可缓存线程池,核心线程数为0
(2)newFixedThreadPool:定长线程池,工作队列是无界队列
(3)newScheduledThreadPool:定长线程池
(4)newSingleThreadExecutor:单线程化的线程池

实现过程:
(1)线程池存在哪些状态

  • Running:可以接受新任务,也可处理阻塞队列里面的任务
  • Shutdown:不可接受新任务,但是可以处理阻塞队列里面的任务
  • Stop:不可以接受新任务,不处理阻塞队列里面的任务,同时还可中断正在处理的任务
  • Tidying:属于过渡阶段,这个阶段表示所有的任务已经执行结束了,当前线程中是不存在有效线程的,并且将要调用terminated方法
  • Terminated:终止状态

102.请说明一下Java中都有哪些方式可以启动一个线程?
(1)继承Thread类,重写run()方法,然后实例化调用start()方法
(2)实现Runnable接口。实现run()方法,使用Thread包装该类,实例化然后调用start()方法
(3)使用线程池,通过execute将任务添加进去

103.请列举一下创建线程的方法,并简要说明一下在这些方法中哪个方法更好,原因是什么?
答案参考题96.

104.请简短说明一下你对AQS的理解
AQS:AbstractQuenedSyncnronizer ,抽象的队列式同步器,是除了Java自带的synchronized关键字之外的锁机制
核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,则需要一套线程阻塞等待以及被唤醒时锁分配的机制

AQS是将每一条请求共享资源的线程封装成要给CLH锁队列的一个结点来实现锁的分配

105. 请简述一下线程池的运行流程,使用参数以及方法策略等

106. 线程,进程,然后线程创建有很大开销,怎么优化?
可以使用线程池,线程池维护了多个线程,当需要使用线程时,可以直接从线程池中获取,使用完不关闭放回池中. 线程池可以降低资源的消耗,提高相应的速度,还可方便线程的管理

107. 请介绍一下什么是生产者消费者模式?
生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,因此生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列. 消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个阻塞队列就是用来给生产者和消费者解耦的

108. 请简述一下实现多线程同步的方法?
(1)使用synchronized同步方法
(2)使用同步代码块
(3)使用volatile修饰变量
(4)使用阻塞队列实现同步
(5)使用原子变量AutomicInteger

109. 如何在线程安全的情况下实现一个计数器?
使用AtomicInteger类来作为变量,可以保证数据的原子性,并且加锁

110. 多线程中的i++线程安全吗?请简述一下原因?

111. 请你简述一下synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处?
Lock是Java5以后引入的新的API
两者的相同之处:
Lock能实现synchronized所实现的所有功能

两者的不同之处:
Lock有比synchronized更精确的线程语义和更好的性能,而且不强制性的要求一定要获得锁;synchronized会自动释放锁,但Lock需要程序员手动释放,并且最好在finally块中进行

112. JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
使用多线程时,一种非常简单的避免死锁的方式是:指定锁的顺序,并强制线程按照指定的顺序获取锁,因为所有的线程都是以同样的加锁和释放锁,就不会出现死锁了

预防死锁需要预先破坏产生死锁的4个条件:
(1)破坏请求和保持条件
(2)破坏不可抢占条件
(3)破坏循环等待条件

113. 请问什么是死锁(deadlock)?
当两个线程或多个线程在等待彼此释放所需的资源(锁定)并陷入无限等待即是死锁,仅在多任务或多线程的情况下发生

114. 请说明一下锁和同步的区别

115. 请说明一下synchronized的可重入怎么实现

116. 请讲一下非公平锁和公平锁在reetrantlock里的实现过程是怎样的

117. 请问JDK和JRE的区别是什么
JDK:Java Development Kit,Java开发的核心。包括了Java运行环境、Java工具和Java基础类库,主要面向开发人员
JRE:Java Runtime Environment,面向Java程序的使用者
JDK=JRE+JAVA的开发工具

118. Java中的LongAdder和AtomicLong有什么区别?

119. 请说明一下JAVA中反射的实现过程和作用分别是什么?
Java反射的实现过程:
Java文件经过编译后生成.class字节码文件,之后类加载器负责根据一个类的全限定类名来读取此类的二进制字节流到JVM内部,并存储在运行时内存区的方法区,并将其转换为一个与目标类型对应的java.lang.Class对象实例

Java反射的作用:
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,并能够改变它的属性,即:反射就是把Java类中的各种成分映射成一个个的Java对象,并且可以进行操作

120. 请简单描述一下JVM加载class文件的原理是什么?
Java中所有的类,必须被装载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的,类装载器所做的工作实质是将类文件从硬盘读取到内存中

121. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
Java虚拟机是执行字节码文件(.class)的虚拟机进程
Java源程序(.java)被编译器编译成字节码文件(.class),Java虚拟机将字节码文件解释为机器码

不同的平台(CPU和操作系统)装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码. 正是因为有JVM的存在,Java才被称为“平台无关的编程语言”

122. jvm最大内存限制多少
32位windows的机器上,堆最大可以达到1.4G到1.6G
32位solaris的机器上,堆最大可以达到2G
64位操作系统上,32位的JVM,堆大小可以达到4G

123. jvm是如何实现线程的

124. 请问什么是JVM内存模型?
Java内存空间分为5部分:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器:
方法区:主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小可以动态扩展
堆:存放的是数组、类的实例对象、字符串常量池
Java虚拟机栈:描述Java方法运行过程的内存模型。Java虚拟机栈会为每一个即将执行的方法创建一个叫做“栈帧”的区域,该区域用来存储该方法运行时需要的一些信息,包括:局部变量表、方法返回地址等
本地方法栈:结构上和Java虚拟机栈一样,但本地方法栈时运行本地方法的内存模型
程序计数器:一个比较小的内存空间,用来记录当前线程正在执行的那一条字节码指令的地址. 如果当前线程正在执行的是本地方法,则程序计数器为空

方法区和堆都是线程共享的,在JVM启动时创建,在JVM停止时销毁,但Java虚拟机栈、本地方法栈、程序计数器都是线程私有的,随着线程的创建而创建,随线程的结束而死亡

125. 请列举一下,在JAVA虚拟机中,哪些对象可作为ROOT对象?
(1)虚拟机栈中引用的对象
(2)方法区的静态变量和常量引用的对象
(3)本地方法栈中JNI(一般说的native方法)引用的对象

126. GC中如何判断对象是否需要被回收?
对象是否会被回收的两个经典算法:引用计数法、可达性分析算法

  • 引用计数法:给对象添加一个引用计数器,每当有引用对它进行引用时,计数器值加1. 当引用失效时,也就是不再执行此对象时,计数器值减1. 若一个对象的计数器值为0,则表示该对象不存在对其的引用,是一个失效的垃圾对象,就会被GC进行回收.

注:在JVM中并没有采用,因为它不能解决对象之间循环引用的问题

  • 可达性分析算法:通过判断对象的引用链是否可达来决定对象是否可以被回收. 该算法是从离散数学中的图论引入的,程序将所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链. 当一个对象到GC Roots没有任何引用链相连(从GC Roots到这个对象不可达时),则证明此对象时不可用的,会被GC回收

127. 请说明一下JAVA虚拟机的作用是什么?
将Java源文件转化为字节码文件(.class),提供硬件的交互平台,将字节码文件解释为指令并执行

128. 请说明一下eden区和survial区的含义以及工作原理?

129. 请简单描述一下JVM分区都有哪些?
(1)程序计数器:较小的内存空间,当前线程执行的字节码的行号指示器
(2)Java虚拟机栈:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程;栈里面存放着各种基本数据类型和对象的引用
(3)本地方法栈:保存的是native方法的信息,当一个JVM创建的线程调用native方法后,JVM不再为其在虚拟机栈中创建栈帧,JVM只是简单的动态链接并直接调用native方法
(4)Java堆:涉及到内存的分配与回收
(5)方法区:也叫永久区,用于存储已经被虚拟机加载的类信息,常量,静态变量等数据

130. 请简单描述一下类的加载过程

131. 请简单说明一下JVM的回收算法以及它的回收器是什么?还有CMS采用哪种回收算法?使用CMS怎样解决内存碎片的问题呢?

132. 请简单描述一下垃圾回收器的基本原理是什么?还有垃圾回收器可以马上回收内存吗?并且有什么办法可以主动通知虚拟机进行垃圾回收呢?

133. 请问,在java中会存在内存泄漏吗?请简单描述一下
答案参考题138.

134. 请说明一下垃圾回收的优点以及原理
优点:(1)不需要考虑内存管理
(2)可以有效的防止内存泄漏,有效的利用可使用的内存
(3)Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”

原理:垃圾回收器是作为一个单独的低级别的线程运行,在不可知的情况下对内存堆中已经死亡的或者长期没有使用的对象进行回收,但是不能实时的对某一对象或者所有对象进行垃圾回收

垃圾回收机制:分代复制垃圾回收、标记垃圾回收、增量垃圾回收

135. 请问GC是什么? 为什么要有GC?
GC是垃圾回收的意思,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的
垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存

136. 请简述一下GC算法

137. 什么原因会导致minor gc运行频繁?同样的,什么原因又会导致minor gc运行很慢?请简要说明一下
minor gc运行频繁:
(1)产生了很多生命周期比较短的对象
(2)新生代空间设置的比较小

minor gc运行慢:
(1)新生代空间设置较大
(2)对象引用链较长,进行可达性分析时间较长
(3)新生代survivor区设置的比较小,清理后剩余的对象不能装进去需要移动到老年代,造成移动开销
(4)内存分配担保失败,由minor gc转化为full gc
(5)采用的垃圾收集器效率较低,如新生代使用serial收集器

138. 请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况?
Java中的存在泄露广义的说就是:不在会被使用的对象的内存不能被回收

理论上,Java因为有垃圾回收机制(GC)不会存在内存泄漏问题,然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因而会导致内存泄漏的产生

如果长生命周期的对象持有段生命周期的引用,就很有可能会出现内存泄漏

139. 请问运行时异常与受检异常有什么区别?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计的没有问题通常就不会发生

受检异常与程序与程序的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发
Java编译器要求必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出违背捕获的运行时异常

140. 请问什么是java序列化?以及如何实现java序列化?
序列化:将Java对象转换成字节流的过程
序列化的实现:类实现Serializable接口,这个接口没有需要去实现的方法,只是用来标记该类对象可以被序列化

  • 某个类可以被序列化,则其子类也可以被序列化
  • 声明为static和transient的成员变量,不可被序列化
  • 反序列化读取序列化对象的顺序要保持一致

141. 请问java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
字节流和字符流,字节流继承于InputStram、OutputStram,字符流继承于Reader、Writer

142. 请说明一下Java中的异常处理机制的原理以及如何应用

143. 请问你平时最常见到的runtime exception是什么?

  • NullPointerException
  • ClassCastException
  • ClassNotFoundException
  • ArithmeticException
  • OutOfMemoryError
  • NumberFormatException

144. 请问error和exception有什么区别?

  • error表示系统级的错误和程序不必处理的异常,是恢复起来不是不可能但是很困难的情况下的一种严重问题. 比如:内存溢出,不可能指望程序能处理这样的情况

  • exception:表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题,即表示如果程序运行正常,则不会发生异常

145. 请问运行时的异常与一般情况下出现的异常有什么相同点和不同点?
运行时异常:

  • 属于RuntimeException类及其子类异常,这些异常均是不检查异常,如NullPointerException
  • 程序中可以选择捕获处理、也可以不处理,一般由程序逻辑错误引起
  • 出现运行时异常时,若没有进行捕获,系统会将异常一直往上抛,如果是多线程由Thread.run()抛出,单线程由main()抛出,即出现运行时异常后进行处理,要么是线程中止,要么是主程序终止

非运行时异常:

  • 属于RuntimeException以外的异常,类型上都属于Exception类及其子类
  • 对于这种异常,Java编译器强制要求我们必须对出现的异常进行catch并处理,否则程序不能编译通过

146. 请问如何打印日志?

JAVA面经(SE)相关推荐

  1. java对象流保存表格,序列化表格 (Java 2 Platform SE 5.0)

    此字段有两种可能的解释: startMode == DOW_IN_MONTH startDay 指示夏令时是在 startMonth 月份中的哪个日期开始的,该日期可以是从 1 到 28.30 或 3 ...

  2. JAVA打开方式不对怎么搞_.jar文件打开方式没有Java(TM) Platform SE binary怎么办?

    5.7mysql安装教程,https://blog.csdn.net/weixin_44051608/article/details/85163823 .jar文件打开方式没有Java(TM) Pla ...

  3. java.awt.api_Java SE 11(18.9)中的API更新

    java.awt.api Java SE 11也被命名为18.9(基于使用发布年份和月份的新命名方案),预计将在9月的最后一周发布GA. 频繁发布新JDK版本的新方法是允许语言创建者引入新功能,并向开 ...

  4. java java se_Java 8 SE可选,严格的方法

    java java se 大约两周前,Stephen Colebourne提出了使用Optional的实用方法 . 如果您阅读了它,您可能会从我以前的建议中猜到我不同意. 总览 我必须以免责声明开头, ...

  5. java inner static_Java SE Static Inner

    Java SE Static Inner /*内部类使用示例*/ package demo; class Outer{ int outer_i=100; static int outer_j=200; ...

  6. Java(TM) platform SE binary 占用cpu过高

    今天在学java的多线程,照着书上敲了一个简单的售票程序,如下: public class MultiThread {public static void main(String args[]){Se ...

  7. 那年学过的Java笔记一SE基础

    JavaSE知识点梳理 [外链图片转存失败(img-EbT2nyO4-1564412078255)(https://i.imgur.com/eZoqsaL.jpg)] JavaSE基础 [外链图片转存 ...

  8. java kit 9_Java SE Development Kit 9

    Java SE Development Kit 9简介 Java SE Development Kit 9简介一:Java SE Development Kit(jdk)作为现在最常用的编程开发言语, ...

  9. java ee 与se区别_Java SE和Java EE之间的主要区别是什么?

    本问题已经有最佳答案,请猛点这里访问. Java SE和Java EE之间的主要区别是什么? daniweb.com/forums/thread97463.html Java SE与Java EE J ...

  10. Java(TM) Platform SE binary 未响应

    兄弟们灵异事件啊 javaw.exe Java™ Platform SE binary 未响应 myeclipse.ini 没有报错. 打开myeclipse老是未响应. 突然准备去安装myeclip ...

最新文章

  1. C语言获取当前工作路径
  2. 设计模式之---Factory
  3. 气门组的结构组成有哪些_你知道电线电缆是由哪些结构材料组成的吗?
  4. 牛客网暑期ACM多校训练营(第一场)J Different Integers
  5. 基于 CentOS Mysql 安装与主从同步配置详解
  6. linux 命令 which whereis whatis locate find
  7. python字典与顺序有关吗_python – 为什么在字典和集合中的顺序是任意的?
  8. python line.strip().split()_.strip().split()
  9. 九度OJ 1547 动态规划
  10. 无限式查找-----2013年2月28日
  11. ad20中怎么多选操作改层_AD20中19个常用系统快捷键小节
  12. linux下查看某个文件或目录占用磁盘空间的大小
  13. JAVAFX 第三方库 布局 小工具 美化 测试 UI 框架 推荐
  14. android 1024 github,1024 怎么能少了这款高颜值、敲实用的 GitHub 第三方客户端呢?...
  15. javassist使用指南
  16. Java多线程编程模式实战指南一:Active Object模式
  17. div水平(横向)/垂直排列
  18. Discuz!风格模版初级不完全修改教程
  19. 神经网络中矩阵求导术的应用
  20. 谷歌黑搜索怎么收_谷歌搜索持久的反黑种族主义

热门文章

  1. Google---机器学习速成课程(二)-SGD
  2. 微信小程序判断不同提交按钮执行不同内容
  3. 顺丰科技有限公司一面
  4. 电商产品2| ERP框架+登录页 低保真原型
  5. matlab trisys,Matlab实现——严格对角占优三对角方程组求解(高斯赛尔德Gauss-Seidel迭代、超松弛) | 学步园...
  6. Java实现符合交通部标JT808和JT1078协议服务器的思路
  7. 网格化服务器管理信息平台,网格化服务管理平台
  8. 最新苍穹DDOS压力测试页端PHP网站源码
  9. 自己写一个Web服务器(1)
  10. 微软sql服务器安装失败,安装SQL2012出现问题