关于java:前阿里架构师精心整理出的2021Java知识点合集目前已有上百万人收藏

2次阅读

共计 6025 个字符,预计需要花费 16 分钟才能阅读完成。

本文章转自:乐字节

文章次要解说:2021Java 知识点

获取 2021 更多更全 Java 知识点能够关注公众号《乐字节》发送:999

1、一个 ”.java” 源文件中是否能够包含多个类(不是外部类)?有什么限度?

能够有多个类,但只能有一个 public 的类,并且 public 的类名必须与文件名相一致。

2、short s1= 1; s1= s1+1; 有没有错?

s1+ 1 运算时会主动晋升类型,后果是 int,赋值给 s1 时,将报告须要强转类型的谬误。

3、short s1= 1; s1 += 1; 有没有错?

+= 是 java 规定的运算符,编译器会对它进行非凡解决,因而能够正确编译。

4、应用 final 关键字润饰一个变量时,援用的内容肯定不能变?

应用 final 润饰变量时,是援用变量(也就是地址)不能变,援用变量所指向的对象中的内容还是能够扭转的

5、是否能够从 static 办法内对非 static 办法调用?为什么?

    不能够。因为非 static 办法是与对象关联的,必须创立一个对象,才能够在该对象上进行办法调用(对象. 办法)。而 static 办法调用时不须要创建对象,能够间接调用。如果从一个 static 办法中收回对非 static 办法的调用,那个非 static 办法是关联到哪个对象上的呢?这个逻辑无奈成立。

6、Overload 和 Override 的区别?

重载 Overload 示意同一个类中能够有多个名称雷同的办法,但这些办法的参数列表各不相同(即参数个数或类型不同)。

重写 Override 示意子类中的办法能够与父类中的办法的名称和参数完全相同,子类对象调用这个办法时,将调用子类中的定义方法,这就把父类中的办法笼罩了,这也是面向对象编程的多态性的一种体现。

7、Overloaded 的办法是否能够扭转返回值的类型?

如果几个重载 Overloaded 的办法的参数列表不一样,它们的返回者类型当然也能够不一样。

如果两个办法的参数列表齐全一样,不论返回值是否雷同,都不容许。因为无奈确定编程者倒底是想调用哪个办法了,因为他们被调用时看起来完全相同。

8、接口是否可继承接口? 抽象类是否可实现 (implements) 接口? 抽象类是否可继承具体类(concreteclass)? 抽象类中是否能够有动态的 main 办法?

    接口能够继承接口。抽象类能够实现 (implements) 接口,抽象类能够继承具体类。抽象类中能够有动态的 main 办法。记住抽象类与一般类的惟一区别就是不能创立实例对象和容许有 abstract 办法。

9、Java 中实现多态的机制是什么?

    靠的是父类(或接口定义)的援用变量能够指向子类(或具体实现类)的实例对象。

而程序调用的办法在运行期才动静绑定,就是援用变量所指向的具体实例对象的办法,而不是援用变量的类型中定义的办法。

10、abstractclass 和 interface 有什么区别?

抽象类能够有构造方法,接口中不能有构造方法。

抽象类中能够有一般成员变量,接口中没有一般成员变量

抽象类中能够蕴含非形象的一般办法,接口中的所有办法必须都是形象的,不能有非形象的一般办法。

抽象类中的形象办法类型能够是 public,protected,接口中的形象办法只能是 public 类型的,并且默认为 public abstract。

11、String s = “Hello”;s = s + “world!”; 执行后,原始的 String 对象中的内容变了没有?

    没有。因为 String 被设计成不可变类,所以它的所有对象都是不可变对象。只是 s 不再指向旧的对象了。

12、上面这条语句一共创立了多少个对象:String s=”a”+”b”+”c”+”d”;

javac 编译能够对字符串常量间接相加的表达式进行优化间接得出答案,不必要等到运行期再去进行加法运算解决

这行代码被编译器在编译时优化后,相当于间接定义了一个”abcd”的字符串,所以,下面的代码应该只创立了一个 String 对象。

13、final, finally, finalize 的区别。

    final 用于申明属性,办法和类,别离示意属性不可变,办法不可笼罩,类不可继承。finally 是异样解决语句构造的一部分,示意总是执行。finalize 是 Object 类的一个办法,在垃圾收集器执行的时候会调用被回收对象的此办法.

14、error 和 exception 有什么区别?

    error 示意复原不是不可能但很艰难的状况下的一种重大问题。比如说内存溢出。不可能指望程序能解决这样的状况。exception 示意程序还可能克服和复原的问题

15、Java 中堆和栈区别?栈罕用于保留办法帧和局部变量,而对象总是在堆上调配。

栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

    栈:在函数中定义的一些根本类型的变量和对象的援用变量都是在函数的栈内存中调配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会主动开释掉为该变量调配的内存空间,该内存空间能够立刻被另作它用。堆:堆内存用来寄存由 new 创立的对象和数组,在堆中调配的内存,由 Java 虚拟机的主动垃圾回收器来治理。

16、能将 int 强制转换为 byte 类型的变量吗?(引申到所有大类型转小类型)理论中,咱们能够做强制转换,不会报错。

然而存在大类型转小类型的通病:int 是 32 位的,而 byte 是 8 位的,如果强制转化,int 类型的高 24 位将会被抛弃,所以尽量不要这样做。

17、hashCode 有什么用?与 a.equals(b) 有什么关系?hashCode 办法对应对象的 hash 值。它罕用于基于 hash 的汇合类,如 Hashtable、HashMap、LinkedHashMap 等等。根 据 Java 标准,两个应用 equal() 办法来判断相等的对象,必须具备雷同的 hash code。

18、垃圾回收的长处和原理。

    垃圾回收能够无效的避免内存泄露,无效的应用能够应用的内存。垃圾回收器通常是作为一个独自的低级别的线程运行,不可预知的状况下对内存堆中曾经死亡的或者长时间没有应用的对象进行革除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

原理:能够给对象增加一个被援用的计数器,就能够判断是否曾经是无援用对象。然而难以解决循环援用问题。

如果不下小心间接把 Obj1-reference 和 Obj2-reference 置 null。则在 Java 堆当中的两块内存仍然放弃着相互援用无奈回收。

可达性分析法:通过一系列的‘GC Roots’的对象作为起始点,从这些节点登程所走过的门路称为援用链。当一个对象到 GC Roots 没有任何援用链相连的时候阐明对象不可用。

19、java 中会存在内存透露吗

内存透露:指一个不再被程序应用的对象或变量始终被占据在内存中。java 中有垃圾回收机制,它能够保障当对象不再被援用的时候,对象将主动被垃圾回收器从内存中革除掉。

    因为 Java 应用有向图的形式进行垃圾回收治理,能够打消援用循环的问题,例如有两个对象,互相援用,只有它们和根过程不可达,那么 GC 也是能够回收它们的。

java 中的内存泄露的状况:长生命周期的对象持有短生命周期对象的援用就很可能产生内存泄露.

只管短生命周期对象曾经不再须要,然而因为长生命周期对象持有它的援用而导致不能被回收,这就是 java 中内存泄露的产生场景。艰深地说,就是程序员可能创立了一个对象,当前始终不再应用这个对象,这个对象却始终被援用,即这个对象无用然而却无奈被垃圾回收器回收的,这就是 java 中可能呈现内存泄露的状况,例如,缓存零碎,咱们加载了一个对象放在缓存中(例如放在一个全局 map 对象中),而后始终不再应用它,这个对象始终被缓存援用,但却不再被应用。

21、线程和过程有什么区别?

过程是操作系统资源分配的根本单位,而线程是任务调度和执行的根本单位

线程是过程的子集,一个过程能够有很多线程,每条线程并行执行不同的工作。

不同的过程应用不同的内存空间,而所有的线程共享一片雷同的内存空间。

22、如何在 Java 中实现线程?

继承 Thread 类 class Handler extends Thread{public void run(){// 办法重写} public static void main(String[] args){Thread thread = new Handler();// 创立线程对象 thread.start();// 启动线程} } 实现 Runnable 接口 class Handler implements Runnable{public void run(){// 办法实现} public static void main(String[] args){Handler handler = new Handler(); Thread thread = new Thread(handler);// 创立线程对象 thread.start();// 启动线程} } 23、Java 关键字 volatile 与 synchronized 作用与区别?

1,volatile     它所润饰的变量不保留拷贝,间接拜访主内存中的。在 Java 内存模型中,有 main memory,每个线程也有本人的 memory (例如寄存器)。

为了性能,一个线程会在本人的 memory 中放弃要拜访的变量的正本。这样就会呈现同一个变 量在某个霎时,在一个线程的 memory 中的值可能与另外一个线程 memory 中的值,或者 main memory 中的值不统一的状况。

一个变量申明为 volatile,就意味着这个变量是随时会被其余线程批改的,因而不能将它 cache 在线程 memory 中。2,synchronized

当它用来润饰一个办法或者一个代码块的时候,可能保障在同一时刻最多只有一个线程执行该段代码。

一、当两个并发线程拜访同一个对象 object 中的这个 synchronized(this)同步代码块时,一个工夫内只能有一个线程失去执行。

二、当一个线程拜访 object 的一个 synchronized(this)同步代码块时,另一个线程依然能够拜访该 object 中的非 synchronized(this)同步代码块。

三、尤其要害的是,当一个线程拜访 object 的一个 synchronized(this)同步代码块时,其余线程对 object 中所有 synchronized(this)同步代码块的拜访将被阻塞。

24、线程生命周期?

新建一个线程时,它的状态是 New。当咱们调用线程的 start()办法时,状态被扭转为 Runnable。线程调度器会为 Runnable 线程池中的线程调配 CPU 工夫并且将它们的状态扭转为 Running。其余的线程状态还有 Waiting,Blocked 和 Dead。

25、死锁?

指多个过程在运行过程中因抢夺资源而造成的一种僵局,当处于这种状态时,若无外力作用,它们都将无奈再向前推动。

起因可归结为两点:竞争资源、过程间推动程序非法 产生死锁的必要条件:

互斥条件:在一段时间内某资源仅为一过程所占用。申请和放弃条件:对已取得的资源放弃不放。不剥夺条件:已取得的资源只能由本人开释。环路期待条件:存在一个过程 – 资源的环形链。

26、什么是线程池?为什么要应用它?

创立线程要花费低廉的资源和工夫,如果工作来了才创立线程那么响应工夫会变长,而且一个过程能创立的线程数无限。

线程池实现了线程反复利用,节约了工夫和资源。

// Java 线程池的残缺构造函数 public ThreadPoolExecutor(int corePoolSize, // 线程池长期维持的线程数,即便线程处于 Idle 状态,也不会回收。int maximumPoolSize, // 线程数的下限 long keepAliveTime, TimeUnit unit, // 超过 corePoolSize 的线程的 idle 时长,// 超过这个工夫,多余的线程会被回收。BlockingQueue workQueue, // 工作的排队队列 ThreadFactory threadFactory, // 新线程的产生形式 RejectedExecutionHandler handler) // 回绝策略 27、反射?

JAVA 反射机制是在运行状态中,对于任意一个实体类,都可能晓得这个类的所有属性和办法;对于任意一个对象,都可能调用它的任意办法和属性;这种动静获取信息以及动静调用对象办法的性能称为 java 语言的反射机制。

28、JDK、JRE、JVM 有什么区别和分割?

JVM:Java 虚拟机。可能将 class 文件中的字节码指令进行辨认并调用操作系统向上的 API 实现动作。所以说,jvm 是 Java 可能跨平台的外围。

JRE:Java 运行时环境。蕴含两个局部,jvm 和 Java 的一些根本类库。

JDK:Java 开发工具包。jdk 是整个 Java 开发的外围,它集成了 jre 和一些好用的小工具。

这三者的关系是:一层层的嵌套关系。JDK>JRE>JVM。

29、深拷贝浅拷贝

  数据类型分为两种根底类型和援用类型:

根底类型:像 Number、String、Boolean 等这种为根本类型 援用类型:Object 和 Array

浅拷贝只是复制了对象的援用地址,两个对象指向同一个内存地址,批改其中任意的值,另一个值会随之变动

深拷贝是将对象及值复制过去,两个对象批改其中任意的值另一个值不会扭转。

30、JVM 内存分为哪几局部? 各个局部的作用是什么?

JVM 内存区域分为五个局部,别离是堆,办法区,虚拟机栈,本地办法栈,程序计数器。

1)堆。

堆是 Java 对象的存储区域,任何用 new 字段调配的 Java 对象实例和数组。2)办法区。

它用于存储已被虚拟机加载的类信息,常量,动态变量,即时编译器编译后的代码等数据,办法区,从 JDK1.8 永恒代被移除。3)虚拟机栈。

虚拟机栈中执行每个办法的时候,都会创立一个栈帧用于存储局部变量表,操作数栈,动静链接,办法进口等信息。4)本地办法栈。

与虚拟机栈施展的作用类似,相比于虚拟机栈为 Java 办法服务,本地办法栈为虚拟机应用的 Native 办法服务,执行每个本地办法的时候,都会创立一个栈帧用于存储局部变量表,操作数栈,动静链接,办法进口等信息。5)程序计数器。

批示 Java 虚拟机下一条须要执行的字节码指令。

总:其中办法区和堆被 JVM 中多个线程共享,比方类的动态常量就被寄存在办法区,供类对象之间共享,虚拟机栈,本地办法栈,pc 寄存器是每个线程独立领有的,不会与其余线程共享。

31、为什么会呈现 4.0-3.6=0.40000001 这种景象?

2 进制的小数无奈准确的表白 10 进制小数,在计算 10 进制小数的过程中要先转换为 2 进制进行计算,这个过程中呈现误差。

32、“==”比拟的是什么?

“==”两边是对象,比拟地址。

“==”两边是根本类型,比拟数值。

感激大家的认同与反对,小编会继续转发《乐字节》优质文章

正文完
 0