抱歉,您的瀏覽器無法訪問本站
本頁面需要瀏覽器支持(啟用)JavaScript
了解詳情 >

JDK和JRE有什么区别?

  • JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。

  • JDK:Java Development Kit(java开发工具包)。即java语言编写的程序所需的开发工具包。JDK包含了JRE,同时还包括java源码的编译器javac、监控工具jconsole、分析工具jvisualvm等。

==和equals的区别是什么

  1. ==是操作符,equals是Object超类的一个方法
  2. ==对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

两个对象的hashCode()相同,则equals()也一定为 true,对吗?

答:不对,可能是哈希冲突

  • 两个对象equals相等,则它们的hashcode必须相等,反之则不一定。
  • 两个对象==相等,则其hashcode一定相等,反之不一定成立。

final在Java中有什么作用?

  1. 修饰类,表示该类不能被继承
  2. 修饰方法,表示父类的final方法不能被子类覆盖(PS:类的private方法会隐式地被指定为final方法)
  3. 修饰变量, final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

Java 中的 Math. round(-1. 5) 等于多少?

它返回的是一个最接近参数的long值,如果出现向上向下距离一样的数值例如-1.5,则取最大的结果。因此-1.5两个边界为-1和-2,-1最大因此答案为它。

String 属于基础的数据类型吗?

答:不属于喔,它是final修饰的Java类。随便来复习一下Java的基本数据类型

byte:8位,最大存储数据量是255,存放的数据范围是-128127之间。
short:16位,最大数据存储量是65536,数据范围是-32768
32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-451.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324
1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。

Java中操作字符串都有哪些类?它们之间有什么区别?

  • String 不可变,线程不安全
  • StringBuilder 可变,线程不安全,速度快
  • StringBuffer 可变,线程安全,速度略慢

String str=”i”与 String str=new String(“i”)一样吗?

答:字符串一样,但不是同一个对象。第一个通过常量池拿取,如果不存在则创建然后存放里常量池。第二个无论怎么样都会创建一个新的对象。

如何将字符串反转?

  1. 使用StringBuilder或者StringBuffer的reverse方法。
  2. 使用String.charAt(),然后遍历拼接字符串。

String类的常用方法都有那些?

方法 作用
length() 获得字符串长度
charAt(int index) 返回字符串指定下标的字符
subString(int beginIndex) 返回从beignIndex开始到结束的新字符串
subString(int beginIndex,int endIndex) 返回从beignIndex到endIndex-1的新字符串
compareTo(String anotherString) 对字符串内容按照字典顺序进行比较,若当前对象必anotherString对象大则返回正整数、小于返回负整数、等于返回0
indexOf(index ch/String str) 返回字符串中字符或者子字符串,在左边首次出现的下标,如果不存在则返回-1
contains(String str) 判断参数str是否包含于字符串中,如果存在则返回true,否则返回false

抽象类必须要有抽象方法吗?

答:不是,抽象类可以没有抽象方法。
ps:如果一个类有抽象方法,则该类一定是抽象类~

普通类和抽象类有哪些区别?

  1. 普通类不能有抽象方法,可以被实例化
  2. 抽象类可以有抽象方法,不可以被实例化

抽象类能使用 final 修饰吗?

答:不能,final修饰的类不能被继承,不可以有子类,而抽象类就是要被继承。两个修饰符的意图完全冲突拉~

接口和抽象类有什么区别?

  1. 抽象类可以有方法实现,接口不能有。
  2. 理念不同,抽象类表示is-a关系,接口表示like-a
  3. 抽象类可以用普通成员变量,接口只能有静态常量

Java 中 IO 流分为几种?

  1. 从流的方向来说,分为输入流和输出流
  2. 从流的操作单元来说,分为字符流和字节流
  3. 从流的角色来说,分为节点流和处理流

BIO、NIO、AIO 有什么区别?

  • BIO:同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成
  • NIO:同步非阻塞的I/O模式
  • AIO:异步非阻塞的IO模式

Files常用方法有哪些?

Files.exists():检测文件路径是否存在。

Files.createFile():创建文件。

Files.createDirectory():创建文件夹。

Files.delete():删除一个文件或目录。

Files.copy():复制文件。

Files.move():移动文件。

Files.size():查看文件个数。

Files.read():读取文件。

Files.write():写入文件。

什么是内部类?内部类的作用

首先内部类是一个定义在另一个类里面或者一个方法里面,然后内部类分为4种,分别是成员内部类、匿名内部类、静态内部类、局部内部类

  1. 成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。 当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问的是成员内部类的成员。

  2. 匿名内部类就是没有名字的内部类
    ps:如果某个局部类你只需要用一次,那么你就可以使用匿名内部类

  1. 静态内部类指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法
  1. 局部内部类 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。

访问修饰符 public,private,protected,以及不写(默认)时的区别

首先,访问修饰符的作用是负责控制对类、方法、变量、构造方法的访问。在java中有4种访问修饰符。

  • public:对任何类都可见 使用对象:类、方法、变量
  • protected:对同包,子类可见 使用对象:变量、方法
  • default:对同包可见 使用对象:使用对象:类、方法、变量
  • private:只对本类可见 使用对象:变量、方法

upload successful

进程跟线程

进程:

进程是操作系统调用的最小单位,是系统进行资源分配和调度的独立单位。

线程:

因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,是CPU调度的最小单位。线程可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。

线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程则占有堆、栈。线程,Java默认有两个线程 main 跟GC。Java是没有权限开线程的,无法操作硬件,都是调用的 nativestart0 方法 由 C++ 实现

面向过程语言和面向对象语言的区别

  • 面向过程面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
  • 面向对象面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,面向对象性能比面向过程低

并行跟并发

  • 并发:concurrency : 多线程操作同一个资源,单核CPU极速的切换运行多个任务,逻辑上同时进行
  • 并行:parallelism :多个CPU同时使用,CPU多核 真正的同时执行,物理上同时进行

堵塞和等待的区别

堵塞:

当一个线程试图获取对象锁(非JUC库中的锁,即synchronized),而该锁被其他线程持有,则该线程进入阻塞状态。它的特点是使用简单,由JVM调度器来决定唤醒自己,而不需要由另一个线程来显式唤醒自己,不响应中断。

等待:

当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。它的特点是需要等待另一个线程显式地唤醒自己,实现灵活,语义更丰富,可响应中断。例如调用:Object.wait()Thread.join()以及等待 LockCondition

说说hashCode和equals方法的理解

如果两个对象equals方法相等,则它们的hashCode一定相同;

如果两个对象的hashCode相同,它们的equals()方法则不一定相等。

那请问hashCode有什么作用呢?为什么要这么规范

hashCode的作用实际上是为了提高在散列结构存储中查找的效率,自然只有每个对象的hashCode尽可能的不同才能保证散列存储性能的提高,这也是为什么Object默认提供hash码都是不同的原因。

说说重载的定义

重载的定义是:在同一个类中,一个方法与已经存在的方法名称上相同,并且参数类型、个数、顺序至少有一个不同。这句话里边并没有包含着返回值,如果只是返回值不同,其它都相同根本不算是重载。

(byte)说说下面的结果是什么

1
2
3
byte b1 = 1,b2 = 2,b3;
b3 = b1+b2;
b3 = 1+2;

其中b3 = b1+b2会出现编译错误,提示需要强转,这是因为JVM中没有byte类型相加的指令,会被升级为int类型,因此需要强转。

什么是装箱和拆箱?

装箱:自动将基本数据类型转换为包装器类型。

拆箱:自动将包装器类型转换为基本数据类型。

+=和+的区别

在Java中+=的意义有两部分:第一部分是+,第二部分是改变结果的类型,将计算结果类型转换为+=符号左边的类型。

例如:short s = 1;s+=1 等于 s=(short)(s+1)

字节和字符的区别

字节是存储容量的基本单位,字符是数子,字母,汉子以及其他语言的各种符号。1字节=8个二进制单位:一个一个字符由一个字节或多个字节的二进制单位组成。

基本类型和引用类型的区别

基本类型保存原始值,引用类型保存的是引用值(引用值就是指对象在堆中所处的位置/地址)

String中的“+”是如何实现的?

底层通过StringBuilder的append方法实现

Java中反射是什么

反射机制是指在运行状态中,对于任意一个类,能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用任意一个方法和属性。这种动态获取类/对象的信息的功能被称作Java语言的反射机制。

获取Class对象的方法:

  1. object.getClass()
  2. Object.class
  3. Class.forName

Class.forName和classloader.loadClass的区别

Class.forName()在类加载的时候会调用静态代码块。

ceil()和floor()和round()

ceil()向上转取整,取最大值

floor()向下取整,取最小值

round()四舍五入,当小数点为5时,取最大值

面向对象的特征有哪些方面?

  • 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。
  • 继承:继承是从已有类得到继承信息创建新类的过程。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
  • 封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
  • 多态:多态性是指允许不同子类型的对象对同一消息作出不同的响应。

switch所支持的类型

在 Java 5 以前, switch(expr) 中, expr 只能是 byteshortcharint;从 Java 5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型;从 Java 7 开始, expr 还可以是字符串 String ,但是长整型 long 在目前所有的版本中都是不可以的。

Comparable和Comparator区别是什么?

Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。而Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

wait方法和sleep方法区别是什么?

wait方法是Object的方法,他只能在同步代码块里使用,同时它会释放他所持有的锁,同时他只能被notify/notifyAll方法们唤醒。

sleep方法是Thread的方法,他不会释放锁,同时他会抛出InterruptedException异常。

堵塞和等待的区别

阻塞:当一个线程试图获取一个内部的对象锁(非java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态。
等待:当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态。例如调用:Object.wait()、Thread.join()以及等待Lock或Condition。

重载和重写的区别

重载:发生在同一个类中方法名相同,参数类型不同,个数不同,顺序不同。方法返回值和返回类型可以不同。

重写:发生在子类对允许访问父类的方法的实现过程进行覆盖的行为,方法的重写要遵循两同两小一大

  • “两同”即方法名相同、形参列表相同;
  • “两小”指的是子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
  • “一大”指的是子类方法的访问权限应比父类方法的访问权限更大或相等。

深拷贝和浅拷贝

  1. 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
  2. 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。

JAVA异常结构

  • Exception:属于程序本身可以处理的异常,可以通过catch来捕获。Exception又可以分为两部分,一个受检异常(Checked Exception)必须处理,一个不受检异常(Unchecked Exception)可以不处理。
  • Error :Error属于程序无法处理的错误 ,我们没办法通过 catch 来进行捕获 。例如,Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。

Java中new()和clone()的区别

  1. clone不调用构造函数,new调用构造函数;
  2. clone通过深拷贝或浅拷贝复制原对象属性值,new在执行构造函数和对象初始化的时候对属性赋值。

Error 和 Exception 区别是什么?

  • Error类型的错误通常被虚拟机相关的错误,例如系统崩溃,内存不足,堆栈溢出等,编译器一般是不会对这类的错误进行检查、JAVA应用程序也不应该对这些错误进行捕获、一旦这类错误发生的话,应用程序会被终止,仅仅靠应用程序本身无法恢复。
  • Exception类型的错误是可以在应用程序种进行捕获并处理的,通常遇到这种错误,应该对其进行处理,使得应用程序能够正常运行。

运行时异常和一般异常(受检异常)的区别是什么?

  • 运行时异常包括RuntimeException类和它的子类,表示JVM在运行期可能出现的异常,Java编译器不会检查运行时异常。
  • 受检异常是Exception中除了RuntimeException及其子类之外的异常。Java编译器回检查受检异常。
  • RuntimeException异常和受检异常的区别在于:是否强制要求调用者必须处理此异常,如果强制要求就为受检异常,否则为RuntimeException异常。

throw和throws的区别是什么?

  • throw抛出异常,throws声明抛出的异常

Java合法的标识符

Java 中标识符是为方法、变量或其他用户定义项所定义的名称。标识符可以有一个或多个字符。

  • 标识符由数字(09)和字母(AZ 和 a~z)、美元符号($)、下划线(_)以及 Unicode 字符集中符号大于 0xC0 的所有符号组合构成(各符号之间没有空格)。
  • 标识符的第一个符号为字母、下划线和美元符号,后面可以是任何字母、数字、美元符号或下划线。
  • 标识符命名时,切记不能以数字开头,也不能使用任何 Java 关键字作为标识符,而且不能赋予标识符任何标准的方法名。

Java中的泛型是什么?使用泛型的好处是什么?

泛型是参数化类型,它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合,避免在运行时出现ClassCastException

List<? extends T>和List <? super T>之间有什么区别 ?

  • List<? exntends T>可以接受任何继承自T的类的List
  • List<? super T>可以接受任何T的父类的List

Java内部类有哪些

  • 成员内部类
  • 方法内部类
  • 匿名内部类
  • 静态内部类

Java内部类的好处

  1. 内部类提供了更好的封装,除了外围类,其他类都不能访问。
  2. 内部类可以用多个实例、每个实例都有自己的状态信息、并且与其他外围对象相互独立。

Java中final在匿名内部类中不同版本的区别

JDK1.8之前在匿名内部类中使用外部局部变量时,需要加上final修饰,且不能修改局部变量。

JDK1.8开始在匿名内部类使用外部局部变量时,可以不加上final修饰,但也不能修改布局变量。

volatile解决了什么问题?

  • 禁止编译器优化而重排序指令。
  • 对 volatile 修饰的变量值,保证线程读取到的值是最新的,而不是寄存器中缓存的值。

说说 synchronized 关键字和 volatile 关键字的区别

volatile 仅能实现变量的修改可见性,不能保证原子性;而 synchronized 则可以保证变量的修改可见性和原子性。