idea上下移动的快捷键
alt + shift + ↑/↓
计算机有哪些语言
C语言、C++、C#、Java、PHP、Python、Go等等
JDK、JRE、JVM的区别
JDK:开发工具,包含JRE
JRE:Java运行环境,包含JVM
JVM:Java虚拟机
计算机存储容量的最基本单位
字节 byte
8个二进制位称为1个字节,此外还有KB、MB、GB、TB等,它们之间的换算关系是1Byte=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB,1TB=1024GB。
Java的运行原理
编写 源文件.java -> javac编译 -> 字节码文件.class -> java执行 -> 字节码文件
Java的注释有哪些
单行注释
多行注释
文档注释
// 这是单行注释
/*
* 这
* 是
* 多
* 行
* 注
* 释
*/
/**
*这是
*文档注释
*/
定义变量的格式
格式一:数据类型 变量名 = 初始值;
格式二:数据类型 变量名1 = 初始值,变量名2 = 初始值;
格式三:数据类型 变量名; 变量名 = 初始值;
定义变量有什么注意事项
- 在一对花括号内变量名不能重复
- 变量在使用之前,必须先初始化(赋值)
- 定义long类型变量时,需要在整数结尾加上L(大小写均可,建议大写)
- 定义float类型变量时,需要在小数后加上F(大小写均可,建议大写)
什么是标识符
标识符是用户编程时使用的名字,用于给类、方法、变量等命名
标识符的组成规则
由字母 数字 下划线"_" 美元符号"$" 组成
第一个字符不能是数字
不能使用Java关键字做标识符
标识符区分大小写
什么是关键字
java语言中已经定义好的有特殊意义的标识符,在编辑器中有高亮显示
什么是强制类型转换
由数据范围小的数据变量赋值给数据范围大的数据变量会进行自动类型转换
由数据范围大的数据变量赋值给数据范围小的数据变量需要手动强制类型转换
强制转换的格式
格式:目标数据类型 变量名 = (目标数据类型) (值或变量)
什么是三元运算符
格式:关系表达式 ? 表达式1 : 表达式2
关系表达式的结果为true时,调用表达式1,结果为false时,调用表达式2。
赋值号(+= -=等)的执行过程
先将变量做算数运算,然后把值赋值给变量,赋值运算包含了强制转换
关系运算符有哪些,它们的结果是什么?
==
!=
>
>=
<
<=
它们的结果都是boolean类型的,要么是true,要么是false
& | ^ !用法
逻辑与
&
,a&b,a和b都是true,结果为true,否则为false
逻辑或|
,a|b,a和b都是false,结果为false,否则为true
逻辑异或^
,a^b,a和b的结果不同为true,相同为false
逻辑非!
, !a,结果和a正好相反
else if和switch如何选择使用?
要根据判断条件的数量来决定,数量越多,就越倾向于switch而不是if else
break、continue、return的区别
break:跳出循环,继续执行下面代码
continue:跳过本次循环,继续下次循环
return:return用来结束方法,并不是用来跳出循环
循环有哪些,三者的区别
for循环,while循环,do…while循环
- for循环和while循环先判断条件是否成、然后决定是否执行循环体(先判断后执行)
- do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)至少执行一次
- for循环条件控制语句所控制的变量归属与循环,在循环结束后,就不能在被访问到了
- while循环条件控制的变量,对于while循环来说不归属于其语法结构,在while循环结束后,该变量还可以继续使用
- for循环一般用在确定一个范围的场景,while循环一般用在不确定范围的场景
for嵌套循环的执行过程是什么
外层执行一次,内层执行一圈
什么是数组
用来存储固定大小的同类型元素
如何获取数组中的元素呢
每个数组在存放元素的时候都会根据从0开始递增的排序,从0开始的序号称为索引,我们可以根据索引访问数组中的元素
数组的常见异常有哪些
空指针异常
索引越界异常
如何获取数组的长度
数组变量名.length
什么是二维数组
二维数组其实i就是这个二维数组中有多少个一维数组,每一个一维数组中有自己的元素,可以理解为,数组的数组
写方法要明确什么
返回值类型和参数列表
调用方法要明确什么、
返回值类型,形参
什么是方法重载
在同一个类中,方法名相同,参数列表不同(参数类型,参数数量,参数顺序)
private关键字有什么特点
private是权限修饰符,可以用来修饰成员变量和成员方法,被privat修饰后的成员变量和成员方法,只能在本类中访问
this表示什么意思
this表示所在类的当前对象的地址值
构造方法有什么作用
初始化对象的成员变量
类的组成
成员变量、构造方法、成员方法
如何创建对象
类名 对象名 = new 类名();
数组是引用类型吗,String是引用数据类型吗。boolean是引用类型?
数组是引用数据类型,String是引用数据类型,boolean是基本数据类型
构造方法可以重载吗
构造方法可以重载
方法重载Overload和方法重写Override的区别
在同一个类中,定义了多个方法名相同,参数列表不同,称为方法重载
重写要有继承关系,方法的名字要相同,参数的个数和类型一样,返回值也一样的方法
成员变量和局部变量的区别
位置:成员变量在类中方法外;局部变量在方法中或方法的参数列表中
生命周期:成员变量随着对象的创建而存在,随着对象的消失而消失;局部变量随着方法的加载而存在,随着方法的结束而消失
作用范围:成员变量在类中;局部变量在方法中
初始化值:成员变量有默认的初始化值;局部变量没有初始化值,用的时候要先进行初始化
内存:成员变量在堆内存中;局部变量在栈内存中
super和this的区别
super:前提有继承关系,代表父类的存储空间标识(可以理解为父类的引用)
this:代表当前对象的引用(谁调用就代表着谁)
什么情况下定义为抽象类
如果一个类中没有包含足够的信息来描绘一个具体的对象
抽象类有什么特点
抽象类和抽象方法必须用abstract关键字修饰。
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口。
抽象类的子类要么是抽象类,要么重写抽象类中的所有抽象方法。
abstract不能和static、final、private共存
什么情况下定义接口
如果一个类只是由抽象方法和全局变量组成,这时就可定义为接口。
接口有什么特点
构造方法:没有,因为接口主要是扩展功能的,而没有具体的存在
成员变量:只能是常量,默认修饰符public static final
成员方法:只能是抽象方法,默认修饰符:public abstract
接口可以多继承
类与类,接口与接口,类与接口之间的关系
类与类:继承关系,可以多层继承,不可以多继承
接口与接口:继承关系,可以多继承
类与接口:实现关系,可以多实现
匿名内部类有什么好处呢
不用在写一个实现类来实现接口,可以直接使用
final有什么特点
final代表最终,可以用来修饰类,方法,变量
被final修饰的类,不能被继承
被final修饰的方法,不能被重写
被final修饰的变量,不能被重新赋值,称为常量
如果方法的参数形参是引用类型、需要传递的是什么
引用类型的实例
如果方法返回也是引用类型,如何返回
返回的是引用类型的实例
静态与静态和非静态之间的访问
静态可以访问静态,不可以访问非静态
非静态可以访问静态也可以访问非静态
静态代码块如何执行的
随着类的加载而加载且只执行一次
构造代码块和静态代码块有什么区别
{}构造代码块:直接在类中定义且没有加static关键字的代码块称为。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
static{}静态代码块:在java中使用static关键字声明的代码块。静态代码块用于初始化类,为类的属性初始化。每个静态代码块随着类的加载而执行且只执行一次。静态代码块优先于构造代码块和main方法执行。
==和equals的区别
一个是运算符,一个是方法。 ==操作符专门用来比较变量的值是否相同,引用类型对象变量其实是一个引用,它们的值是指向对象所在的内存地址。 equals方法常用来比较对象的内容是否相同,equals()方法存在于Object类中
String类中的equals比较的是什么
String类重写了equals方法,比较的是内存中存放的数据的具体内容是不是相同的
String类中截取字符串内容的方法
subString()
或者split()
获取字符串某一个字符的索引
indexOf()
比较两个字符串内容是否相同
equals()
equalsIgnoreCase()
(忽略大小写)
判断字符串中以xx结尾
endsWith()
判断字符串是否为空
isEmpty()
把int类型转成字符串
valueOf()
把boolean类型转成字符串
valueOf()
把字符数组转成字符串
valueOf()
字符串转成字节数组
getBytes()
字符串转成字符数组
toCharArray()
字符串拼接的方法
concat()
去除字符串空格
trim()
所有类都继承Object类
对,因为Object是java语言中的根类
String类可以继承吗?为什么
不可以,因为String类被final修饰
如果我们查询一个类的API时,发现这个类没有构造方法,请问该类的方法都是什么方法?为什么都是静态方法
该类中的方法都是静态方法
因为该类没有构造方法,无法实例化,所以调用该类中的方法需要通过类名调用,只有静态方法可以通过类名调用
说说常见的异常有哪些
ArithmeticException //算术错误异常,如以零做除数
ArraylndexOutOfBoundException //数组索引越界
ClassCastException //类型转换异常
NullPointerException //空指针异常
ClassNotFoundException //没有找到类
NoSuchMethodException //请求的方法不存在
IndexOutOfBoundsException //某种类型的索引越界
数组中有没有length方法?String类中有没有length方法
数组中的length是属性
String类中的length是方法
什么是GC?Java手动清理GC吗?GC收集算法
GC是“垃圾回收”的缩写
Java通常不需要手动清理GC,Java的垃圾回收机制是自动的,只有在某些特殊情况下,可以通过调用System.gc()
方法来建议Java虚拟机执行回收
复制算法、标记清除算法、标记整理算法…
- 标记-清除算法(Mark and Sweep):这是最基本的垃圾回收算法。它分为两个阶段:标记阶段和清除阶段。在标记阶段,垃圾收集器会遍历所有从根对象(如堆栈、静态变量等)可达的对象,并在这些对象上打上标记。在清除阶段,垃圾收集器会遍历整个堆,清理未标记的对象,回收它们所占用的内存。
- 复制算法(Copying):这种算法将堆分为两个区域,一部分称为"from"区域,另一部分称为"to"区域。当垃圾收集器执行时,它会遍历"from"区域中的存活对象,并将它们复制到"to"区域。然后,"from"区域中没有被复制的对象可以直接被视为垃圾,并且该区域可以一次性清除,不需要标记和清除阶段。最后,"from"和"to"区域交换角色,下一次垃圾回收时,复制过程会在不同的区域执行。
- 标记-压缩算法(Mark and Compact):这是一种改进的标记-清除算法。与标记-清除算法不同,标记-压缩算法在标记阶段之后,会将存活对象向一端移动,然后清理掉边界外的内存。这样可以解决标记-清除算法中可能产生的内存碎片问题。
- 分代算法(Generational):这是目前主流的垃圾回收算法。根据对象的生命周期,将堆空间划分为几个代(Generation)。一般情况下,新创建的对象会被分配在新生代,经过多次垃圾回收后仍然存活的对象会被晋升到老年代。因为新生代中的对象生命周期较短,所以采用复制算法,而老年代中的对象生命周期较长,所以采用标记-清除或标记-压缩算法。
Arrays类有什么作用
它包含了各种用于操作数组的静态方法
StringBuilder和StringBuffer的区别
StringBuilder是非线程安全,效率高
StringBuffer是线程安全,效率低
如何自定义异常
自定义运行时异常可以将类继承RuntimeException
自定义编译时异常可以将类继承Exception类
集合和数组的区别
集合的长度可变;数组长度在创建时确定
集合只能包含对象类型,不能包含基本数据类型,而且存放的类型可以不一致;数组可以包含基本数据类型和对象类型,但存储的是同一类型的元素
如果try和catch中出现return那么finally中的代码是否会执行
除非try和catch中有关闭Java虚拟机的命令,不然finally都会执行,而且在return执行前执行
throw和throws的区别
throw是一个动作。抛出一个异常;throws是一个状态,方法可能有异常抛出
throw用在方法实现中;throws用在方法声明中
throw只能抛出一种异常,throws可以声明抛出多个异常
StringBuilder和StringBuffer和String的区别
String一旦创建,它的值就不能被改变。对String进行任何的修改都会生成一个新的String对象。
StringBuilder和StringBuffer是一个容器,它们拥有一系列方法修改字符串内容,他们会在原始对象上进行修改,而不是创建新的对象
成员变量和静态变量的区别
存储位置:成员变量存储在堆内存中;静态变量存储在静态区
生命周期:成员变量随着对象的创建而创建,随着对象的消失而消失;静态变量随着类的加载而创建,随着类的结束而消失
访问方式:成员变量必须通过类的对象访问;静态变量可以通过类名直接访问
String类中有哪些常用的方法
boolean equals(Object obj)
:比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str)
:比较字符串的内容是否相同,忽略大小写
boolean contains(String str)
:判断大字符串中是否包含小字符串
boolean startsWith(String str)
:判断字符串是否以某个指定的字符串开头
boolean endsWith(String str)
:判断字符串是否以某个指定的字符串结尾
boolean isEmpty()
:判断字符串是否为空。
int length()
:返回此字符串的长度
String concat(String str)
: 将指定的字符串连接到该字符串的末尾。
char charAt(int index)
: 返回指定索引处的char值。
int indexOf(int ch)
:返回指定子字符串第一次出现在该字符串内的索引。
String substring(int beginIndex)
:返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
String substring(int beginIndex,int endIndex)
:返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
int length()
:返回此字符串的长度
String concat(String str)
: 将指定的字符串连接到该字符串的末尾。
char charAt(int index)
: 返回指定索引处的char值。
int indexOf(int ch)
:返回指定子字符串第一次出现在该字符串内的索引。
String substring(int beginIndex)
:返回一个子字符串,从beginIndex开始截取字符串到字符串结尾。
String substring(int beginIndex,int endIndex)
:返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex。
String[] split(String regex)
:将此字符串按照给定的regex(规则)拆分为字符串数组。
String trim()
:去除该字符串的两端空格
Object类中常用的方法
public String toString()
:返回该对象的字符串表示。
public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
BigDecimal类解决了什么问题
BigDecimal实现了浮点型数据的高精度运算
BigInteger类解决了什么问题
在java中超过long型的整数已经不能被称为整数,它们被封装在BigInteger对象
int和Integer的区别
int是基本数据类型,默认值为0
Integer是引用数据类型,默认值为null
equals 和 hashCode 的关系
如果两个对象需要相等(equals),那么它们必须有着相同的哈希码(hashCode);
但如果两个对象有着相同的哈希码,它们却不一定相等。