JavaSE重点知识
1. 题目: & 和 && 的区别(*)?
& 按位与运算符,&& 逻辑与运算符;两者都可以进行逻辑与运算;
& 不具备短路功能;&具备短路功能,一旦表达式出现了false,则之后的表达式都不再运行;
2. 题目:++/--在前和在后的区别(*)?
++ 递增运算,在原有值的基础上+1
-- 递减运算,在原有值的基础上-1
如果++/--是一行单独的运算,那么在前和在后没有区别;
如果++/--参与运算或调用,那么在前是先递增/递减运算再调用值,在后是先调用值再递增/递减运算。
3. 题目:以下代码: short a = 20; a = a + 10;以及 short a = 20; a += 20; 有什么区别?
答:前者会出现编译错误,导致程序无法运行,主要是因为a是short类型, 10是int类型,相加之后,类型变成int类型, 再赋值给a的时候需要强制类型转换.后者不会报错,+ =自带类型转换功能.
4. 题目:Java中8种基本数据类型分别是什么?
答:byte, short, int, long, float, double, char, boolean
5. 题目:switch...case语句中switch支持哪些数据类型?
答:byte, short, int, char, String, 枚举
6. 题目:break和continue的区别?
使用场合不同
break可用于switch结构和循环结构中
continue只能用于循环结构中
作用不同
break语句终止某个循环,程序跳转到循环块外的下一条语句。
continue跳出本次循环,进入下一次循环
7. 题目:while 和 do while的区别?
两者都是用来实现循环结构的.
while是先判断后执行; do while是先执行一次后判断;
如果初始条件成立,那么while和do while的执行结果一致;
如果初始条件不成立,那么while什么都不执行,do while至少执行一次;
8. 题目:如何生成一个取值范围在[min,max]之间的随机数?
答:Random r = new Random(); int num = r.nextInt(max - min + 1) + min;
9. 题目:数组的长度如何获取?数组下标的取值范围是什么?
答: 数组长度是数组名.length; 数组下标的取值范围是0到数组名.length-1
10. 题目:什么是不定参数方法?不定参数的形参本质上是什么?实参怎么传递给形参?不定参数方法有什么注意事项?
答:不定参数方法指的是方法的参数是动态的,不固定的。
不定参数的形参本质上是数组。
在方法调用时,实参会依次拷贝到形参数组中,通过数组下标可以获取传入的参数。
注意事项:一个方法最多只能有一个不定参数,在方法定义时,不定参数应该作为方法的最后一个参数。
11. 题目:定义一维数组的语法格式是什么?分别写出动态初始化和静态初始化示例.
答: 数据类型[] 数组名 = new 数据类型[元素个数]; 例如:int[] arr = new int[3]; 数据类型[] 数组名 = new 数据类型[]{值1,值2,...,值n}; 例如: int[] arr = new int[]{1,2,3};
12. 题目:把1----36分别放入数组中、计算数组对角元素之和(提示:需要定义一个6X6的数组)
public class Main {public static void main(String[] args) {// 初始化6x6数组int[][] array = new int[6][6];// 填充数组int value = 1;for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {array[i][j] = value++;}}// 计算主对角线元素之和int mainDiagonalSum = 0;for (int i = 0; i < array.length; i++) {mainDiagonalSum += array[i][i];}// 计算副对角线元素之和int secondaryDiagonalSum = 0;for (int i = 0; i < array.length; i++) {secondaryDiagonalSum += array[i][array.length - 1 - i];}// 输出结果System.out.println("主对角线元素之和: " + mainDiagonalSum);System.out.println("副对角线元素之和: " + secondaryDiagonalSum);}
}
13. 题目:Java中循环结构一共几种?语法格式分别是什么?
答:共3种. for(表达式1; 表达式2; 表达式3){循环体} while(条件表达式){循环体} do{循环体}while(条件表达式);
14. 题目:求1~100之间不能被3整除的数之和?
public class Main {public static void main(String[] args) {int sum = 0;for (int i = 1; i <= 100; i++) {if (i % 3 != 0) { // 检查i是否不能被3整除sum += i; // 如果不能被3整除,则加到sum中}}System.out.println("1~100之间不能被3整除的数之和为: " + sum);}
}
15. 题目:什么是形参,什么是实参?形参和实参什么关系?
答:在方法定义时,参数列表中的参数称为形参,也叫形式参数。在方法调用时,传入方法中的参数称为实参,也叫实际参数。在方法调用时实参会拷贝给形参,实参到形参是单向的值拷贝过程。
16.题目:如果方法有返回值,应该通过哪个关键字返回数据,数据的类型有什么要求没有?如果方法没有返回值,能使用这个关键字吗?
答:方法有返回值,使用return关键字返回数据。return返回的数据类型,必须和方法定义中的返回值类型一致。如果方法没有返回值,也可以使用return关键字,return的作用结束方法执行。
17.题目:构造方法有什么特点?
答:构造方法的方法名必须和类名相同。 构造方法没有返回值,连void都不能写。 构造方法的作用是给属性赋初始值。 构造方法在创建对象的时候调用,不能单独使用构造方法。 构造方法可以重载。 如果没有提供构造方法,系统会提供一个无参的构造方法。 如果提供了任何一个构造方法,系统将不会提供无参构造方法。
18.题目:setter方法有没有参数?如果有,参数类型是什么?有没有返回值?如果有,返回值类型是什么?getter方法有没有参数?如果有,参数类型是什么?有没有返回值?如果有,返回值类型是什么?
答:setter有参数,参数的类型和要赋值的属性的类型相同;setter没有返回值,即返回值类型是void。getter方法没有参数,getter方法有返回值,返回值类型是要返回的属性的类型。
19.题目:成员变量(属性)和局部变量什么区别?
答:书写位置不同:属性是定义在类内,方法外;局部变量是定义在方法内。
内存区域不同:属性存储在堆区;局部变量存储在栈区。
默认值不同:属性有默认值,例如int默认值是0,引用类型默认null;局部变量没有默认值,局部变量必须先赋值才能使用。
生命周期不同:属性随着对象的创建而产生,当对象不再使用时,会被垃圾回收机制回收堆区内存,此时属性才会被销毁;局部变量在方法调用时(执行到方法定义那行)才产生,随着方法的(或者代码块的结束)结束而销毁。
作用域不同:属性可以在类中的任何非静态方法中使用,也可以在对象new出来之后,通过对象访问(private的不行);局部变量只能在它所属的代码块内使用。
20.题目:写出定义类的语法格式?写出创建对象的语法格式?
答:public class 类名{ 属性; 方法; } 类名 对象 = new 类名();
21.题目:什么是类?什么是对象?
答:类是对具有相同特征和行为的事物的抽象。对象是类的实例,是类的具体体现。
22题目:抽象类有什么特点?
答:抽象类不能创建对象。 抽象类中可以定义抽象方法。 普通类实现抽象类的话,抽象类都可以拥有。
23.题目:static关键字的作用是什么?
答:static可以修饰属性,被static修饰的属性会成为类属性,被所有对象共享,可以通过对象访问静态属性,也可以通过类名访问静态属性,通常使用类名访问静态属性。 static可以修饰方法,被static修饰的方法会成为类方法,被所有对象共享,可以通过对象调用静态方法,也可以通过类名调用静态方法,通常使用类名调用静态方法。 static可以修饰代码块,被static修饰的代码块会随着类的加载而执行。
24.题目:final关键字的作用是什么?
答:final修饰类,类不能被继承。 final修饰方法,方法不能被子类重写 final修饰变量,变量只能赋值一次,赋值之后,值不能修改。
25.题目:抽象类和接口的区别是什么?
答: 1.接口中所有的方法都是public abstract的,而抽象类不一定。
2.类可以实现很多个接口,但是只能继承一个抽象类。
3.接口中声明的属性默认是public static final的,抽象类不一定。
4.接口的关键字是interface,抽象类的关键字是abstract class。
26.题目:什么是接口,它的特点是什么?
接口用于定义一组规范(或标准或行为),只提供方法的声明,不提供方法的实现。
接口可以包含属性,属性默认是public static final
接口中的方法,默认是public abstract
一个类实现接口使用implements关键字,需要实现接口中声明的全部方法。
接口也可以继承其他接口,使用extends关键字。
27.题目:说一说你对JVM、JRE、JDK的理解
答:JVM是java虚拟机,通过JVM可以实现跨平台开发;JRE是java运行时环境,它包含JVM以及java核心类库,只要有JRE就能运行java项目;JDK是java开发工具包,包含JRE和各种开发相关的工具,安装了JDK不但能运行java项目还能开发java项目。
28.题目:super与this有什么区别?
答:this用于访问本类体的属性:super用于访问父类继承过来的属性(尤其是父子类同名的属性)。 this用于访问本类的方法:super用于访问父类继承过来的方法(尤其是父子类同名的方法)。 this用于调用本类的构造方法:super用于调用父类的构造方法。 this是对象,是调用当前方法的对象;super只是一个关键字。
29.题目:继承使用什么关键字?子类能从父类继承哪些内容?
答:继承使用extends关键字。 子类能从父类继承除了构造方法之外的所有属性和方法。
30.题目:重载(Overload) 和 重写(Override) 的区别?
答: 重载(Overload): 发生在同一个类之中
方法名相同,参数类型不同或参数的个数不同
重写(Override): 发生在子类和父类之间
当父类的方法不满足子类的需求时,可以重写父类的方法
31.题目:switch语句中可以使用的表达式的数据类型有哪些?
答:整数byte,short,int,long;字符char;字符串String,枚举
32.题目:内部类分为哪几种?
答: 内部类(2分) 静态内部类(2分) 匿名内部类(2分) 局部内部类
33。题目:有一个接口Driving, 包含一个抽象方法 void drive(); 通过匿名内部类创建Driving接口的实现类对象。
Driving d = new Driving(){ public void drive(){ System.out.println("开车"); } };
34.题目:有一个接口Driving, 包含一个抽象方法 void drive(); 通过lambda表达式创建Driving接口的实现类对象。
Driving d = () -> System.out.println("开车");
35.题目:String、StringBuffer、StringBuilder的区别?
它们的相同点是都用来封装字符串,都实现了CharSequence接口。
可变性:String类的对象是使用final修饰的字符串数组,不可变;但是StringBuffer、StringBuilder底层也是使用字符数组,但是没有使用final修饰,可变;
是否线程安全:String和StringBuffer是线程安全的,效率低;StringBuilder是线程不安全的,效率高;
执行效率:String > StringBuffer > String
初始化方式:String可以通过字符串字面量和构造器来创建实例;但是StringBuffer、StringBuilder只能通过构造器来创建实例;
字符串修改方式:String字符串修改方法会首先创建一个新的StringBuilder,其次调用StringBuilder的append()方法,最后调用StringBuilder的toString()方法把结果返回;StringBuffer和StringBuilder直接在原对象上进行操作;
是否实现equals和hashCode方法:String实现了equals()方法和hashCode()方法;而StringBuffer没有实现equals()方法和hashCode()方法。
36.题目:try...catch...finally的作用?
try块中放可能出现异常的代码。 catch块用于捕获并处理一个特定的异常,catch块可以有多个; finally块无论是否发生异常,异常是否匹配被处理,都会执行,主要做一些清理工作,比如释放资源;
37.题目:列举Java常见运行时异常
NullPointerException: 空指针异常
IllegalStateException: 非法状态异常 IndexOutOfBoundsException: 越界异常,列表越界异常
ArrayIndexOutOfBoundsException: 数组下标越界异常
StringIndexOutOfBoundsException:字符串下标越界异常
ArithmeticException: 算术逻辑异常
ClassCastException: 类型强制转换异常
IllegalArgumentException: 非法参数异常
NumberFormatException: 数字格式异常,整数和浮点数类型和字符串类型不匹配异常
NegativeArraySizeException: 数组长度为负数
38.题目:throw和throws有什么区别?
答:throw 用在方法内部主动抛出异常,如: throw new Exception("出错了"); throws 写在方法声明的后面,用来对外声明本方法可能会抛出的异常。
39.题目:Java中的异常可以分为哪两类?他们有什么区别?
答:可以分为RuntimeException为为首的非检查异常,和以RuntimeExceptio为代表的非检查异常。 检查异常在编译时要求开发者必须处理该异常;而非检查异常编译器不会提示错误,开发者可以选择处理,也可以不处理,但运行期间如果出现错误,还是会抛出异常。
40.题目:如何将String转换为char?
答:String是一系列字符,所以我们无法转换成单一的char但是可以调用toCharArray()方法将字符串转换成字符数组。
41.题目:如何让一个字符串变成小写或大写形式?
答:toUpperCase和toLowerCase方法
42.题目:创建String对象的不同方式有哪些?
答:两种方式
一种是通过new关键字创建。使用这种方式时,JVM创建字符串对象但不存储在字符串池中,我们可以调用intern()方法将该字符串对象存储在字符串池中,如果该字符串池已经有了相同值的字符串,则返回引用。
另一种是使用双引号来直接创建。使用这种方式时,JVM去字符串找有没有相同值得字符串,如果有,则返回找到的字符串引用。否则创建一个新的字符串对象,并存储在字符串池中。
42.题目:String中的equals和java中的==号有什么区别?
答:==判断的是字符串对象的内存地址是否一样,equals判断的是字符串的内容是否一样。
43.题目:final、finally、finalize
答:final可以用来修饰方法、属性和类。修饰方法时代表该方法不能被重写;修饰属性时代表该属性时常量;修饰类时代表该类不能被继承。
finally用在异常处理语句块中,代表无论最终走try里的逻辑还是catch里的逻辑,最终都会走finally中的代码。
finalize是Object类中定义的一个方法,当对象要被垃圾回收器回收之前,会回调该方法(不保证一定回调)
44.题目:编写一个正则表达式,匹配一个6-14位的QQ号码,只写匹配规则即可
[1-9][0-9]{5,13} 或者 [1-9][0-9]{5}[0-9]{1,8}
45.题目:编写一个正则表达式,匹配一个18位的身份证号,第一位不能是0,最后一位可以是X或者数字。值需要写出规则即可
[1-9][0-9]{16}[0-9X] 或者 [1-9][0-9]{16}[0-9X]
46.题目:SimpleDateFormat类的主要作用是什么?
实现String和Date的相互转换。
47.题目:包的本质是什么?如果访问非同包的类,应该怎么访问?
答:包的本质是文件夹。 如果想要访问非同包的类,可以通过import导入要使用的类,也可以书写类的完整限定名,即包名.类名
48. 题目:ArrayList和LinkedList都实现了List接口,他们有什么不同点
答:ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
1. ArrayList是基于数组的数据结构,它的底层是数组。它可以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起。在这种情况下,查找某个元素的时间复杂度是O(n)。
2. 相对于ArrayList,LinkedList的插入、添加、删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
3. LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
49. 题目:数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
答:下面列出了Array和ArrayList的不同点:
1. Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
2. Array大小是固定的,ArrayList的大小是动态变化的。
3. ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
使用场景:
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
50. 题目:Iterator和ListIterator的区别是什么?
答:1. Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2. Iterator对集合只能单向向前遍历,ListIterator既可以向前也可以后向。
3. ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。
51. 题目:如何对List集合进行去重?
答:1. 借助于set集合
2. 利用list集合的contains方法进行循环遍历
52. 题目:请描述List和Map、Set的区别?
答:List 集合中的对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get()方法来获取集合中的元素;
Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
Set 集合中的对象是按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 TreeSet 类,可以按照默认顺序,也可以通过实现Java.util.Comparator接口来自定义排序方式。
53. 题目:HashMap和Hashtable有什么区别?
答:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。
但是,他们有以下不同点:
1. HashMap允许键和值是null,而Hashtable不允许键或者值是null。
2. Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
3. HashMap提供了可供迭代器迭代的集合,因此,HashMap是快速迭代的。Hashtable提供了对键的列举(Enumeration)。
4. 一般认为Hashtable是一个遗留的类。
54. 题目:线程类中常用的方法有哪些?请至少列举5个
答:join() 让当前线程等待调用该方法的线程结束yield() 让调用该方法的线程让出CPU资源setPriority() 设置线程的优先级,1-10setName(String name) 设定 获取线程名称sleep() 让线程休眠currentThread() 返回调用当前代码的线程对应的线程对象isAlive() 返回此线程是否处于活动状态run() 线程要执行的逻辑start() 启动线程
55. 题目:线程的状态周期有哪些?
答:创建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、死亡(DEAD)
56. 题目:Thread 类中的start() 和 run() 方法有什么区别?
答:
调用start()方法用来启动新创建的线程,而且start()内部调用了run()方法。
调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动。
57. 题目:Java创建线程的方式?
答:
1. 继承Thread类, 重写run方法
2. 实现Runnable接口, 实现run方法
3. 线程池
58. 题目:多线程中如何处理共享资源?
答:
synchronized代码块。
synchronized方法。
Lock锁附加锁和解锁。
59. 题目:线程池生命周期及五种状态?
RUNNING: 运行状态, 能接受新提交的任务, 并且也能处理阻塞队列中的任务;线程池被一旦被创建, 就处于RUNNING状态。
SHUTDOWN: 关闭状态, 不再接受新提交的任务, 但却可以继续处理阻塞队列中已保存的任务。 在线程池处于 RUNNING 状态时,调用 shutdown()方法会使线程池进入到该状态。
STOP: 停止状态, 不能接受新任务, 也不处理队列中的任务,会中断正在处理任务的线程。在线程池处于 RUNNING 或 SHUTDOWN 状态时,调用 shutdownNow() 方法会使线程池进入到该状态。
TIDYING: 整理状态,如果所有的任务都已终止了,workerCount (有效线程数) 为0,进入TIDYING状态。
TERMINATED: 终止状态,线程池彻底终止,就变成TERMINATED状态
60. 题目:final关键字的作用是什么?
答: final修饰类,类不能被继承。
final修饰方法,方法不能被子类重写
final修饰变量,变量只能赋值一次,赋值之后,值不能修改。