1.Math.round(-1.5)
等于多少?★★★
结果:-1
ceil():向上取整
floor():向下取整
round():朝正无穷方向取整
2. BIO、NIO、AIO
有什么区别?★★★★★
- BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能
- 力低。
- NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了
- 多路复用。
- AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件
- 和回调机制。
3.java语言和javaScript语言
的区别?★★★★
同为类c语言
区别:
1.java是强类型语言,JavaScript是弱类型语言
2.java是基于面向对象的语言,javaScript是基于对象和事件驱动的脚本语言
3.java是编译型语言,JavaScript是解释性语言
4.java是运行在服务端的静态类型语言,javaScript是运行在浏览器上的动态类型语言
4.java语言和php语言
的区别?★★★★
同为类c语言
区别:
1.java是半编译语言,PHP是脚本语言
2.java是基于面向对象,以类为单位,PHP基于面向过程,以方法为单位
3.java的内存自动分配回收,PHP是一次创建一次销毁
java:
j2SE:多用于桌面软件开发
j2EE:多用于企业级开发
j2ME:多用于嵌入式系统开发
PHP的优势:
可以用PHP动态创建图像,程序开发快,运行快,跨平台性强,web方向的编程
5.java中有哪些新特性
?★★★★★
接口:增加了default和static修饰的方法
Lambda表达式:Lambda 表达式本质上是一段匿名内部类,类中只有一个方法,也可以是一段可以传递的代码
Stream API:链式操作,操作流可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等
操作
日期时间API:Java 8 对时间分量的操作更加简洁。
`
6.什么是工厂方法
?工厂方法有哪些分类?★★★
工厂方法:创建对象的方法
分类:动态工厂和静态工厂
7.finaly
相关面试题 ★★
finally出现了return
public class Demo1 {
public static void main(String[] args) {
int result=test();
System.out.println(result);
}
private static int test() {
try{
return 10;
} finally {
return 20;
}
}
}
结果为20
finally对返回值影响
public class Demo1 {
public static void main(String[] args) {
int result=test();
System.out.println(result);
}
private static int test() {
int i = 10;
try{
return i;
} finally {
i = 20;
}
}
}
结果为10
8.数组
有没有length()
方法?String
有没有length()
方法?★
数组是没有length()这个方法的,有length这个属性,可以计算数组的长度
String是有length()这个方法的,用来计算字符串的长度。
9.一个”.java”源文件
中是否可以包含多个类(不是内部类)?有什么限制?★
Java中可以包含多个类 ,但public修饰的类只有一个,且类名必须与文件名一致
10.泛型和泛型擦除
?★★★
泛型:
泛型在编译时检查类型,泛型的实质是参数化类型
类型通配符一般是使用?
<? extends T>:表示该通配符所代表的类型是T类型的子类
<? super T>:表示该通配符所代表的的类型是T类型的父类
泛型擦除:
在java的字节码文件中不包含泛型中的类型信息,在使用泛型的时候加上这些参数,会在编译的时候被去掉,
这个过程就叫做泛型擦除
这个过程,会找一个具体类型来代替类型参数,这个具体类型通常是object,如果指定了上界,则使用这个
上界类型
11.main 方法
可以被重写和重载吗,可以被调用吗?★★★
main()方法也是普通方法,可以重载
不能被重写,静态方法能被继承,但是不能被重写
可以被调用
12.Java 中相关关键字
?★★★
asser:断言,增加 jvm 参数 -ea,默认是关闭的
assert [boolean 表达式]
如果[boolean表达式]为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
instanceof: 是 Java 的保留关键字。
它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。
transient:
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,
我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在
这个域前加上关键字transient。
native
用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
synchronized
表明一段代码需要同步执行
volatile
表明两个或者多个变量必须同步地发生变化
13.什么时候会发生空指针异常
?★★★
1.所谓的指针,就是java中的对象的引用。比如String s;这个s就是指针。
2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针。
3.所谓的空指针异常,就是一个指针是空指针,你还要去操作它,既然它指向的是空对象,它就不能使用这个对象的方法。
比如上面的s假如为null,你还要用s的方法,比如s.equals( String x);那么就会产生空指针异常。如果一个
数组为null,试图访问或修改其中某个元素时。
14.避免空指针异常
的办法?★★★★★
1.使用Optional
Optional 是 JDK 8 新增的新特性,再也不用 != null 来判断了,这个在一个对象里面的多个子对象连续判断的时候非常有用。
2.字符串比较,常量放在前面会出现空指针异常,一种避免的方法就是将常量放在后面,如下:
if("success".equals(status)){
}
3.使用null安全的方法库
比如StringUtils.isBlank(),isNumeric(),isWhiteSpace()。
4.初始化默认值
返回空集合
在返回集合的时候如果是null,统一默认返回一个空集合
public List getUserList(){
List list = userMapper.gerUserList();
return list == null ? new ArrayList() : list;
}
5.断言
断言是用来检查程序的安全性的,在使用之前进行检查条件,如果不符合条件就报异常,符合就继续。
assert name == null : "名称不能为空";
15.内部类
有哪些?有什么区别?★★★
内部类分为四类:成员内部类、局部类部类、静态内部类、匿名内部类
静态内部类:内部定义的静态类
1.可以访问外部的所有静态方法和变量,即使是private类型
2.可以定义静态变量、方法、构造方法等,不能使用非静态的成员,非静态方法也不能访问
3.其他类使用内部类的方式通过:“外部类.静态内部类”
4.hashMap中就有一个Entry的静态内部类
5.随着类的加载而加载,只会执行一次
成员内部类:定义在内部的非静态类
1.成员内部类不能定义静态方法和变量(final修饰的除外)
2.因为成员内部类非静态的,类初始化的时候会先初始化静态成员,如果成员内部类定义静态变量,
那么成员内部类的静态变量初始化顺序是有歧义的
3. 当外部类的成员与内部类的成员重名时,使用外部名.this.成员
局部内部类:定义在方法中的类
1. 当内部类时非static的情况下,在内部类中不能定义static内容
匿名内部类:没有使用class定义的类
1.必须要继承一个父类或者实现一个接口
2.匿名内部类是直接使用new来生成一个对象的引用
3.不能有构造方法
4.不能有静态变量
5.不能有静态方法
6. 用法:确认某个类的子类在程序执行过程中,只创建一次对象,则使用匿名内部类
16.Object 类
有哪些常用的方法?★★★
Object类方法,是所有类的父类,任何类都默认继承Object。
(1)clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
(2)getClass方法
final方法,获得运行时类型。
(3)toString方法
该方法用得比较多,一般子类都有覆盖。
(4)finalize方法
该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
(5)equals方法
该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
(6)hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定
就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
(7)wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,
直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
(8)notify方法
该方法唤醒在该对象上等待的某个线程。
(9)notifyAll方法
该方法唤醒在该对象上等待的所有线程。
17.什么是正则表达式
?String类中用到正则的方法有哪些?★★★★★
一套字符串的匹配规则:
正则表达式:就是一种字符串的匹配规则
[xyz]:等于其中之一
[0-9]:等于0-9其中之一
[a-z]:小写字母等于其中之一
[A-Z]:大写字母等于其中之一
\d:等价于[0-9]
\D:不等价于[0-9](非数字类)
\w:等价于[0-9a-zA-Z_]
\W:不等价于[0-9a-zA-Z_](非字符)
\s:空白(回车、换行、制表符)
\S:非空白
():分组
{}:范围
+:[1-无穷)
*:[0-无穷)
{n}:有n个 \d{n}:有n个0-9的数字
{m,n}:有m到n个 \d{6,10}:有6-10个0-9的数字
{m,}:至少有m个
(xyz|abc):分组xyz或者abc((xyz&&abc):)
?:可有可无(+86|+0086)?\d{11} +8613888888888或者13888888888()
|:或者
^,&:分界符,java中会自动添加分界符
^:开始
&:结束
\:转义字符
.:任意一个字符
身份证:'fenString reg="^[1-9]\\d{5}[12]\\d{3}[01]\\d[0123]\\d\\d{3}(\\d|X})$"
18.Java常用元注解
?★
@Target:描述了注解修饰的对象范围常用的包括:
method:用于描述方法
pacage:用于描述包
parameter:用于描述方法变量
type:用于描述类、接口或enum类型
@Retention: 表示注解保留时间长短
RetentionPolicy.SOURCE -------------注解将被编译器丢弃
RetentionPolicy.CLASS -------------注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME ---------VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息
@Documented
描述在使用 javadoc 工具为类生成帮助文档时是否要保留其注解信息。
@Inherited
Inherited注解的作用是:使被它修饰的注解具有继承性(如果某个类使用了被@Inherited修饰的注解,则其子类将自动具有该注解)。
19.Java 泛型中的 T、K、V、E 、N
分别指什么?★
E – Element (在集合中使用,因为集合中存放的是元素)
T – Type(Java 类)
K – Key(键)
V – Value(值)
N – Number(数值类型)
? – 表示不确定的java类型(无限制通配符类型)
S、U、V – 2nd、3rd、4th types
20.String
拼接字符串底层原理?★★★
jdk1.8之后字符串拼接底层就是创建了一个StringBuilder,然后调用append方法,最后调用toString
转化成String
1、在循环和多个表达式中不能 +,频繁创建 SB 性能影响;
2、在单个表达式中可以用 +,编译器直接做了优化;
21.为什么成员变量命名不建议用 isXXX
?★★★
POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。
例如:定义一个变量 boolean isSuccess;的属性,它的方法也是isSuccess(),RPC框架在
反向解析的时候,以为对应的属性名称是success,导致属性获取不到,进而抛出异常。
22.StringJoiner
有什么用?★
StringJoiner是一种收集器,尽管它没有实现Collector接口。 它只是这样表现。 除了可以传递定界符,
前缀和后缀之外,还可以使用StringJoiner调用Collectors.joining(CharSequence)从Stream创建格式化
的输出。
当使用并行流时,这特别有用,因为在某些时候,将需要并行处理的批处理,这就是StringJoiner发生的
地方。StringJoiner是一种收集器,尽管它没有实现Collector接口。 它只是这样表现。 除了可以传递
定界符,前缀和后缀之外,还可以使用StringJoiner调用Collectors.joining(CharSequence)从
Stream创建格式化的输出。
当使用并行流时,这特别有用,因为在某些时候,将需要并行处理的批处理,这就是StringJoiner发生的
地方。
23.怎么查看一个 Java 类的字节码
?★★
1、使用 javap 命令查看字节码
命令格式如下:javap -c xxx.class
2、Intellij IDEA 中查看字节码
需要安装ByteCode Viewer插件,点击view→Show Bytecode
24.Java 语法糖
是什么意思?★
语法糖指的是计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员
使用。因为 Java 代码需要运行在 JVM 中,JVM 是并不支持语法糖的,语法糖在程序编译阶段就会被
还原成简单的基础语法结构,这个过程就是解语法糖
1.泛型是一种语法糖。在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过类型擦除 来实
现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除
2.泛型是一种语法糖。在 JDK1.5 中,引入了泛型机制,但是泛型机制的本身是通过类型擦除 来实
现的,在 JVM 中没有泛型,只有普通类型和普通方法,泛型类的类型参数,在编译时都会被擦除
3.枚举只是一个语法糖,在编译完成后就会被编译成一个普通的类,也是用 Class 修饰。这个类
继承于 java.lang.Enum,并被 final 关键字修饰。
4.方法变长参数(JDK 1.5)
5.接口Iterable支持的foreach语法(JDK 1.5)
6.switch支持枚举、字符串
``