1,Java 和 C++的区别
- Java没有指针
- Java的类是单继承的,C++是多重继承;但是接口可以多继承
- Java有自己的内存管理机制
- C语言中,字符串或者字符数组结尾处都会有一个额外的字符“\0”代表结束
2,Java语言为什么说是“编译与解释并存”
- Java程序需要先编译成字节码(*.class文件),这种字节码必须由Java解释器来解释执行
3,泛型了解么?什么是类型擦除?介绍一下常用的通配符?
- Java的泛型是伪泛型,在编译期间,所有的泛型信息都会被擦掉,这就是类型擦除。
- 泛型包括:泛型类、泛型接口、泛型方法
- 常用的通配符为:T、E、K、V、?
- ? 表示不确定的java类型
- T(type)表示具体的一个java类型
- K V(key value)分别代表java键值中的Key Value
- E (element)代表Element
4,== 和equals的区别
- == 判断两个对象的地址是不是相等,即判断两个对象是不是同一个对象,基本数据类型比较的是值,引用数据类型比较的是内存地址
- equals() 判断两个对象是否相等
- 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值,如果有就赋给当前引用,如果没有就重新创建一个String对象
5,hashCode()与equals()?
- hashCode 散列码,通过散列码可以检索除对应的值。例如HashSet,当一个对象进入HashSet的时候,会计算它的hashcode,接着去判断是否有相同的hashcode值:如果有,则调用equals来判断这两个对象是否真的相同,如果两者相同,hashset加入失败;如果两者不相同,就会散列到其他位置。因此,equals方法被覆盖过,那么hashcode方法也必须被覆盖
5,Java 程序设计语言对对象采用的不是引用调用
- 一个方法不能修改一个基本数据类型的参数
- 一个方法可以改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象
6,重载与重写
- 重载太简单了,不记录了,发生在编译期
- 重写
- 返回值类型、方法名、参数列表必须相同,抛出异常范围小于等于父类,访问修饰符范围大于等于父类
- 父类方法访问修饰符为private/final/static则子类就不能重写该方法,但是被static修饰的方法能够被再次声明
- 构造方法无法被重写
- 发生在运行期
7,成员变量与局部变量的区别
- 成员变量属于类,局部变量是在方法中定义的变量或者方法的参数
- 成员变量可以被public、private、static等修饰符所修饰,局部变量不行;但是他们都能够被final所修饰
- 对象存在于堆内存、局部变量存在于栈内存
- 成员变量如果没有被赋值,则会自动以类型的默认值而赋值(除了被final修饰的成员变量也必须显式地赋值),局部变量不会自动赋值
8,静态方法和实例方法有何不同
- 调用静态方法可以无需创建对象;可以使用“类名.方法名”,也可以使用“对象名.方法名”。实例方法只能用"对象名.方法名"
- 静态方法在访问本类的成员时,只允许访问静态成员;实例方法则无此限制
9,常见关键字总结:static\final\this\super
- https://snailclimb.gitee.io/javaguide/#/docs/java/basic/final,static,this,super
10,接口雨抽象类的区别
- 接口方法默认是public,所有方法不能有实现;抽象类可以有非抽象的方法
- 一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口
- 接口方法默认修饰符是public,抽象方法可以有public、protected和default这些修饰符
11,StringBuffer和StringBuilder的区别是什么?
- 而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
- 线程安全性: StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的;StringBuilder并没有加同步锁,所以是非线程安全的
- 性能:StringBuilder比StringBuffer获取10%~15%左右的提升,但会线程不安全
- 总结:
- 操作少量数据:string
- 单线程大量数据:StringBuilder
- 多线程大量数据:StringBuffer
12,Java序列化中如果有些字段不想进行序列化,怎么办?
- 在变量上面使用transient关键字修饰
- transient只能修饰变量,不能修饰类和方法
13,Collections工具类和Arrays工具类常见方法总结
- https://gitee.com/SnailClimb/JavaGuide/blob/master/docs/java/basic/Arrays,CollectionsCommonMethods.md
14,finally
- try块或catch块中有return语句时,finally语句块将在方法返回之前被执行
- 4种特殊情况,finally块不会被执行:
- finally 第一行发生了异常
- 在前面的代码中使用了System.exit(int)已退出程序。exit是带参函数
- 程序所在线程死亡
- 关闭CPU
15,try-with-resources
- 跟python的with … as … 一样,可以自动关闭打开的IO
- 通过使用分号分隔,可以在try-with-resources块中声明多个资源
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
16,线程、程序、进程
- 线程与进程相似,但线程是一个比进程更小的执行单位,线程也被称为轻量级进程。
- 程序是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
- 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。
17,线程的状态
- NEW , 初始状态,线程被构建,但是还没有调用start()方法
- RUNNABLE , 运行状态
- BLOCKED , 阻塞状态
- WAITING , 等待状态
- TIME_WAITING , 超时等待状态
- TERMINATED , 终止状态
Tips: - 当碰到锁的时候,进入BLOCKED状态
- 当使用wait()的时候,进入WAITING状态,需要依靠其他线程的通知才能够返回到运行状态
18,JAVA中的IO流分为几种
(1)
- 按照流向分,分为输入流和输出流
- 按照操作单元划分,划分为字节流和字符流
- 按照流的角色划分为节点流和处理流
(2) - InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
19,BIO/NIO/AIO
- BIO(Blocking I/O):同步阻塞I/O模式
- NIO(Non-blocking/New I/O):同步非阻塞的I/O模型
- AIO(Asynchronous I/O): 异步非阻塞的I/O模型