基础

Java语言有哪些特点

简单易学;
面向对象(封装,继承,多态);
平台无关性( Java 虚拟机实现平台无关性);
可靠性;
安全性;
支持多线程;
支持网络编程并且很方便;
编译与解释并存;复制代码

关于JVM JDK和JRE

JVM
是运行 Java 字节码的虚拟机,JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。复制代码
什么是字节码?采用字节码的好处是什么?
扩展名为 .class 的文件
它不面向任何特定的处理器,只面向虚拟机。一次编译,随处可以运行复制代码
JDK和JRE
 JDK:它能够创建和编译程序。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。
 JRE: 运行已编译 Java 程序,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。复制代码
Oracle JDK 和 OpenJDK的对比
OpenJDK 是完全开源的而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
Oracle JDK 比 OpenJDK 更稳定,提供了更好的性能。复制代码

Java和C++区别?

都是面向对象的语言,都支持封装、继承和多态
Java 不提供指针来直接访问内存,程序内存更加安全
Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承
Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存复制代码

什么是Java程序的主类 应用程序和小程序的主类有何不同?

在 Java 应用程序中:包含 main() 方法的类
Java 小程序中:主类是一个继承自系统类 JApplet 或 Applet 的子类,必须是 public 类复制代码

import java 和 javax有什么区别?

 javax 包将成为标准 API 的一部分。没有区别复制代码

八种基本数据类型和占用的大小

原始类型:byte(1),short(2),int(4),long(8),float(4),double(8),boolean,char(2)复制代码
包装类型
Boolean,Character,Byte,Short,Integer,Long,Float,Double复制代码
装箱拆箱
JAVA5.0新特性支持自动装箱:Integer itg = 5;
自动拆箱:int i = itg;
正常写:装箱:Integer itg = new Integer(5);或:Integer itg=Integer.valueOf(5);//int到Integer
拆箱:int i = itg.intValue(); //Integer到int复制代码

深拷贝和浅拷贝

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

后端学习基础知识_后端学习

&(按位与)和&&(短路与)的区别

&:无论左边表达式执行结果如何,都会执行右边
&&:左边不符合时,右边不执行复制代码

String

可以修改吗
不可改变类型,每次值发生改变,都会创建一个新的对象复制代码
StringBuilder和StringBuffer的区别
StringBuffer 线程安全 StringBuilder 执行效率高复制代码
常用的方法有哪些
indexOf():返回指定字符得索引
charAt():返回指定索引处得字符
repalce():字符串替换
trim():去除字符串两端的空白
split():分割字符串 返回分割后的字符串数组
getBytes():返回字符串的 byte 类型数组
length():返回字符串的长度
toLowerCase():字符串转小写
toUpperCase():字符串转大写
substring():截取字符串
equals():字符串比较复制代码
final修饰 StringBuffer 后还可以 append 吗
可以,final 修饰的是一个引用变量,那么这个引用始终指向这个对象,但这个对象内部的属性是可以改变的复制代码
String 字符串修改实现的原理
当 String 修改字符串的时候会创建一个 StringBuilder 对象,调用 append 方法,最后通过 toString 方法返回复制代码

Object类的常见方法

getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。
hashCode()//native方法,用于返回对象的哈希码,主要使用在哈希表中,比如JDK中的HashMap。
equals()//用于比较2个对象的内存地址是否相等,String类对该方法进行了重写用户比较字符串的值是否相等。
clone()
toString()
notify()
notifyAll()
wait()
finalize()//实例被垃圾回收器回收的时候触发的操作复制代码

什么是值传递和引用传递

值传递:传递的是变量的一个副本,改变副本不影响原变量

引用传递:传递的是对象地址的一个副本,对引用对象操作影响原变量复制代码

== 比较的是什么

是对象的的话就比较引用
基本数据类型的话,则比较值是否相等复制代码

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

如果两个对象相等,则 hashCode 一定也是相同的;反之不成立复制代码

解释下什么是面向对象?面向对象和面向过程的区别?

面向对象中每个对象包含公开部分和隐藏部分。 结构清晰,程序便于模块化,结构化,抽象化,更加符合人类的思维方式。
面向过程侧重整个问题的解决步骤,着眼局部或者具体。复制代码

面向对象的三大特性?分别解释下?

封装:把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口。
继承:从已有类得到继承信息创建新类的过程。
多态:分为编译时多态(方法重载)和运行时多态(方法重写)。
要实现多态需要做两件事:一是子类继承父类并重写父类中的方法,二是用父类型引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。复制代码

Java 类初始化采用什么顺序呢?

初始化父类中的静态成员变量和静态代码块

初始化子类中的静态成员变量和静态代码块

初始化父类中的普通成员变量和代码块,再执行父类的构造方法

初始化子类中的普通成员变量和代码块,再执行父子类的构造方法复制代码

什么是构造函数?

新对象被创建的时候会调用构造函数,每个类都有构造函数复制代码
什么是构造函数重载?
可以为一个类创建多个构造函数,但是要保证每个构造函数都有唯一的参数列表。复制代码
构造器能否被重写?
不能复制代码

重载和重写的区别?

重载,编译时多态,在一个类里面,方法名字相同,而参数不同。

重写,也叫覆盖,运行时多态,重写发生在子类与父类之间
两同:方法名,参数列表相同
两小:返回值类型和声明异常类型,子类小于等于父类
一大:访问权限,子类大于等于父类复制代码

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

Comparable:它是一个排序接口,只包含一个函数 compareTo()
一个类实现了 Comparable 接口,就意味着该类本身支持排序,它可以直接通过 Arrays.sort() 或 Collections.sort() 进行排序

Comparator:
它是一个比较器接口,包括两个函数:compare() 和 equals()
一个类实现了Comparator接口,那么它就是一个比较器,其它的类,可以根据该比较器去排序
综上所述:Comparable 是内部比较器,而 Comparator 是外部比较器。复制代码

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

相同点:都不能被实例化
不同点:接口只有定义,不能有方法的实现,java 1.8中可以用default或static定义方法体,而抽象类可以有定义与实现
一个类可以实现多个接口,但一个类只能继承一个抽象类。
接口强调特定功能的实现,而抽象类强调所属关系
接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号复制代码

super 关键字的作用?

可以在子类构造方法中显式调用父类构造,但是必要处于第一行
super 关键字可以在子类中显式调用父类方法或变量
有时候可以使用这个关键字扩展从父类继承过来的方法复制代码

请说明类和对象的区别?

类是对某一类事物的描述,是抽象的;
对象是表示的一个具体的个体,是类的一个实例复制代码

finally 是不是一定会被执行到?

不一定
如:当程序进入 try 块之前就出现异常时,会直接结束,不会执行 finally 块中的代码;
当程序在 try 块中强制退出时也不会去执行 finally 块中的代码,比如在 try 块中执行 exit 方法复制代码

throw 和 throws 的区别?

throw:在方法体内部,表示抛出异常,由方法体内部的语句处理;throw 是具体向外抛出异常的动作,所以它抛出的是一个异常实例;
throws:在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理;表示出现异常的可能性,并不一定会发生这种异常。复制代码

常见的异常类有哪些?

ArithmeticExecption
NullPointerException
ClassCastException
ArrayIndexOutOfBoundsException
FileNotFoundException
NumberFormatException
SQLException
IOException
NoSuchMethodException
IndexOutOfBoundsExecption
IllegalArgumentException复制代码

Java 的泛型是如何工作的 ? 什么是类型擦除 ?

泛型使得数据的类型可以通过参数传递过来,它提供了一种扩展能力,更符合面向对象思想。
当具体的类型确定之后,泛型还提供了类型检测机制,不符合的类型不允许赋值,否则编译不通过。
所以类型擦除就是在进入 JVM 之前,与泛型相关的信息会被擦除掉,这些信息被擦除后,相应的类型就会被替换成泛型类型参数的上限,如果没有指定,则替换成 Object。复制代码
什么是泛型中的限定通配符和非限定通配符 ?
限定通配符包括两种:

表示类型的上界,格式为:<? extends T>,即类型必须为 T 类型或者 T 子类

表示类型的下界,格式为:<? super T>,即类型必须为 T 类型或者 T 的父类

非限定通配符:类型为 ,可以用任意类型替代。复制代码
List<? extends T> 和 List <? super T> 之间有什么区别 ?
List<? extends T>,即类型必须为 T 类型或者 T 子类

List <? super T>,即类型必须为 T 类型或者 T 的父类复制代码

Java 中的 IO 流的分类?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流 和 字符流。复制代码
字节流和字符流有什么区别?
字节流按 8 位传输,以字节为单位输入输出数据,字符流按 16 位传输,以字符为单位输入输出数据。

但是不管文件读写还是网络发送接收,信息的最小存储单元都是字节。复制代码

Arrays.asList()

将一个数组转换为一个List集合
底层其实还是一个数组:当使用add()、remove()、clear()会抛出异常。UnsupportedOperationException
Arrays.asList() 方法返回的并不是 java.util.ArrayList ,而是 java.util.Arrays 的一个内部类,这个内部类并没有实现集合的修改方法或者说并没有重写这些方法
推荐:List list = new ArrayList<>(Arrays.asList("a", "b", "c"))复制代码

不要在foreach循环里进行元素的remove/add操作

如果要进行remove操作,可以调用迭代器的 remove 方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove/add方法,迭代器都将抛出一个ConcurrentModificationException,这就是单线程状态下产生的 fail-fast 机制复制代码
fail-fast 机制
多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况复制代码

后端学习基础知识_后端学习_02

反射机制

四种方式获取 Class 对象
知道具体类的情况下可以使用:Class alunbarClass = TargetObject.class;
通过 Class.forName()传入类的路径获取:Class alunbarClass1 = Class.forName("cn.javaguide.TargetObject");
通过对象实例instance.getClass()获取:Employee e = new Employee();
Class alunbarClass2 = e.getClass();
通过类加载器xxxClassLoader.loadClass()传入类路径获取:class clazz = ClassLoader.LoadClass("cn.javaguide.TargetObject");复制代码
优缺点
优点: 运行期类型的判断,动态加载类,提高代码灵活度。
缺点: 1,性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的 java 代码要慢很多。2,安全问题,让我们可以动态操作改变类的属性同时也增加了类的安全隐患。复制代码

主题列表:juejin, github, smartblue, cyanosis, channing-cyan, fancy, hydrogen, condensed-night-purple, greenwillow, v-green, vue-pro, healer-readable, mk-cute, jzman, geek-black, awesome-green贡献主题:https://github.com/xitu/juejin-markdown-themes

theme: wan highlight: