Java 面试之语言基础
原文:https://blog.csdn.net/u012102104/article/details/79772903
八种基本数据类型的大小,以及他们的封装类
类 型 | 大小 | 封 装 类 |
---|---|---|
byte | 1字节 | Byte |
short | 2字节 | Short |
int | 4字节 | Integer |
long | 8字节 | Long |
float | 4字节 | Float |
double | 8字节 | Double |
char | 2字节 | Character |
boolean | – | Boolean |
Java与C++对比
比较点 | Java | C++ |
---|---|---|
面向对象思想 | 完全对象化 | 可采用非面向对象(兼容C) |
内存管理机制 | Java自身管理 | 程序员管理 |
异常机制 | 完善 | 欠缺 |
第三方库 | 丰富(Log、JUnit等等) | 较少(STL) |
执行效率 | 慢 | 快 |
操控底层 | 麻烦 | 方便 |
Java面向对象(四个基本特性)
- 封装:将客观事物包装成类,隐藏具体实现,提供操作接口。
- 继承:子类获得父类的属性和行为(
extends
)。 - 多态:同一行为多种表现形式。
- 重写
Override
- 接口的不同实现
implements
- 抽象类和抽象方法
abstract
- 重写
- 抽象:用代码描述客观事物。包括数据抽象(属性)和过程抽象(行为)。
Java 8新特性
- 默认方法:在接口里面有了一个实现的方法
- Lambda 表达式:Lambda允许把函数作为一个方法的参数
- Stream API:把真正的函数式编程风格引入到Java中
- Date Time API:加强对日期与时间的处理
- Optional 类:Optional 类已成为 Java 8类库的一部分,用来解决空指针异常
- 方法引用:可以直接引用已有Java类或对象的方法或构造器
- 新编译工具:Nashorn引擎(一个新的JavaScript引擎)、 类依赖分析器
各种比较
Override和Overload的区别
比较点 | Override | Overload |
---|---|---|
中文 | 重写 | 重载 |
方法名 | 相同 | 相同 |
形参 | 相同 | 不同 |
返回类型 | 相同 | 可同可不同 |
Override 典型例子:接口方法的重写
Overload 典型例子:构造方法的重载
Interface与abstract类的区别
比较点 | Interface | abstract类 |
---|---|---|
中文 | 接口 | 抽象类 |
能否实例化 | 不能 | 不能 |
方法能否实现 | Java 8 可以 | 可以 |
一个类可以 |
implements 多个
|
extends 一个
|
equals()与==的区别
equals()
用于比较对象(内容),==
常用于比较原生类型(地址)。简单的说,==
比较两个人的DNA,equals()
一般用来比较两个人身高体重等等,可自定义。
int x = 10;
int y = 10;
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = new String("abc");
// == 比较两个(基本数据类型)地址值
System.out.println(x y); // true
System.out.println(str1 str2); // true
System.out.println(str3 == str4); // false
// String重写的equals()比较两个对象内容
System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // true
要注意Object类中
equals()
即为==
,equals()
是可以重写(Override
)的。
String、StringBuffer、StringBuilder
比较点 | String | StringBuffer | StringBuilder |
---|---|---|---|
底层实现 | final char value[] | char[] value | char[] value |
可变性(参考底层) | 不可变 | 可变 | 可变 |
修改时 | 不会改变自身 | 会改变自身 | 会改变自身 |
安全性 | 线程安全 | 线程安全 | 非线程安全 |
使用场景 | 少量数据 | 多线程大量数据 | 单线程大量数据 |
String str = "abc"; // str只是一个String对象的引用
str = "xyz"; // 创建了新对象"xyz",而引用str重新指向新对象
Java的四种引用
比较点 | 强引用 | 软引用 | 弱引用 | 虚引用 |
---|---|---|---|---|
特性 | 不会被回收 | 内存足则不回收,内存不足则回收 | 一旦发现便回收 | 必须和引用队列联合使用 |
使用场景 |
平时工作接触的最多(new )
|
可用来实现内存敏感的高速缓存 | 常用于Map数据结构中,引用占用内存空间较大的对象 | 跟踪对象被回收的活动 |
comparable接口和comparator接口
- Comparable:在集合内部实现排序的接口,位于java.lang包。
- Comparator:在集合外部实现排序的比较器接口,位于java.util包。
public class Person implements Comparable {String name;int age;
//使用Collections.sort(personList)即可排序
public class Person {String name;int age;static class PersonComparator implements Comparator {@Overridepublic int compare(Object o1, Object o2) {// 使用字符串的比较int i = ((Person) o1).name.compareTo(((Person) o2).name); if (i == 0) { // 如果名字一样,比较年龄,返回比较年龄结果return ((Person) o1).age - ((Person) o2).age;} else {return i; // 名字不一样, 返回比较名字的结果.}}}
}//使用Collections.sort(list, new Person.PersonComparator())即可排序
Arrays内使用双轴快排(DualPivotQuicksort),两个中心点三段数据。
Java IO与BIO,NIO,AIO分别是什么
Java中IO是以流为基础进行输入输出的,在网络编程中,接触到最多的就是利用Socket进行网络通信开发,主要有BIO、NIO、AIO三种实现方式。
比较点 | BIO | NIO | AIO |
---|---|---|---|
中文 | 阻塞IO | 非阻塞IO | 异步IO |
版本 | – | JDK 1.4提出 | JDK 1.7 提出 |
描述 | 服务端每次都需要创建一个线程来建立连接并处理消息。若建立连接、读写数据时发生阻碍,线程会阻塞。并发情况下,N个连接需要N个线程来处理。 | 使用一个线程来管理所有的Socket 通道,也就是基于Selector机制,查询到事件时(连接、读写),转发给不同的处理线程(Handler)。 | 在进行读写操作时,只需要调用相应的read/write方法,并传入CompletionHandler(动作完成处理器),在动作完成后会调用CompletionHandler。 |
序列化与反序列化
序列化即把对象转换为字节序列;反序列化即把字节序列恢复为对象。其使用场景大致有如下几种:
- 把内存中的对象状态保存到文件或者数据库中。
- 用套接字在网络上传送对象。
- 通过RMI传输对象。
JVM会把字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化。
Java反射机制
在运行状态中,对于任意一个类,都能够知道其所有属性和方法;对于任意一个对象,都能够调用其任意方法和属性。这种动态获取信息及动态调用对象方法的功能称为Java语言的反射机制。Java反射API如下:
- Class:反射的核心类。
- Field:类的成员变量。
- Method:类的成员方法。
- Constructor:类的构造方法。
/**获取Class对象的三种方式**/
// 1. 调用某个对象的getClass()方法
Class clazz = person.getClass();
// 2. 调用某个类的class属性
Class clazz = Person.class;
// 3. 使用Class类的forName()静态方法
Class clazz = Class.forName(“Person”);
反射机制主要提供了以下功能:
- 在运行时判断任意一个对象所属的类。
- 在运行时构造任意一个类的对象。
- 在运行时判断任意一个类所具有的成员变量和方法。
- 在运行时调用任意一个对象的方法。
- 生成动态代理。
Java异常机制
Error与Excption包结构
Error:程序无法处理的错误,继承自Throwable。
Exception:程序可以处理的异常,继承自Throwable。
1. Checked Exception:受检异常,需要强制catch,是Exception的子类。
2. Unchecked Exception:不受检异常,无需强制catch,是RuntimeException的子类。例如
list.size()
语句,若list为null,则会出现NullPointerException
(Unchecked Exception)
if (ex instanceof RuntimeException){// ex is unchecked exception
} else if (ex instanceof Exception){// ex is checked exception
} else {// ex is a error
}
哪些情况会导致OOM或SOF,怎么解决
OutOfMemory(OOM)
- Java堆溢出:一般由于内存泄露或者堆的大小设置不当引起。可以通过虚拟机参数
-Xms
、-Xmx
等设置堆大小。 - 方法区溢出:包括运行时常量池溢出,一般由于大量动态生成的Class导致。可以通过
-XX:PermSize
和-XX:MaxPermSize
限制方法区的大小。
使用JConsole生成Heap Dump文件,然后使用MAT分析排查
StackOverflow(SOF)
- Java虚拟机栈和本地方法栈内存溢出:一般是由于程序中存在死循环或者深度递归调用造成的,栈设置太小也会出现此种溢出。可以通过虚拟机参数
-Xss
来设置栈大小。
JNI的使用
JNI (Java Native Interface)允许Java代码和其他语言代码(主要是C和C++)进行交互。
- 定义本地native方法
- 用javah命令生成.h头文件,拷贝至jni目录
- 在jni目录中编写.c文件
- 在jni目录中创建Android.mk文件,声明所引用的.c文件和生成的函数库名
- 创建Application.mk文件,声明支持的平台(armeabi、armeabi-v7a、x86)
- 使用ndk工具编译生成.so成动态链接库文件
Java 面试之语言基础相关推荐
- Java面试之语言基础
文章目录 Java八种基本数据类型 Java三大基础特性 面向对象和面向过程的区别 面向过程 面向对象 Java与C++对比 Java8 新特性 Java反射机制 Java异常机制 Throwable ...
- [Java面试三]JavaWeb基础知识总结.
[Java面试三]JavaWeb基础知识总结. 1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Int ...
- Java回炉之语言基础
Java回炉之语言基础 Java回炉之语言基础 DOS命令 java编译过程 path和classpath的区别 关键字表 数据类型 位运算 算数优先级 内存划分 类的初始化过程 static关键字特 ...
- Java之J2se-Java语言基础(程序结构) 教学视频发布了,请小伙伴们前往观看
Java之J2se-Java语言基础(程序结构) 教学视频发布了,请小伙伴们前往观看 视频地址如下: http://v.youku.com/v_show/id_XODA5NTM3NTAw.html
- Java核心技术笔记 语言基础
<Java核心技术 卷Ⅰ> 第3章 Java 的基本程序设计结构 一些规则 类命名:CamelCase 驼峰命名法,以及必须是字母开头,后面跟字母和数字的任意组合: 源代码文件名:必须与公 ...
- java 考试题_JAVA语言基础内部测试题(50道选择题)
JAVA语言基础内部测试题 选择题(针对以下题目,请选择最符合题目要求的答案,针对每一道题目,所有答案都选对,则该题得分,所选答案错误或不能选出所有答案,则该题不得分.)(每题2分) 没有注明选择几项 ...
- java面试必知--基础
1 / 66 Java 基础知识总结 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的 j ...
- Flask实现个人博客系统(附源码),java面试说我基础太差
登录 {% endif %} {% block content %} {# 其他页面内容 #} {% endblock %} 这里页面使用了Layui定义了一个导航栏,展示了对应的功能模块.其中{% ...
- Java面试三件套:基础+多线程+___?
Netty easy of use! 面试官 不不不,咱得跟我聊聊BIO.NIO.SELECT.EPOLL Netty quick and easy development of network ap ...
最新文章
- android studio控件使用方法,android studio使用教程
- golang中的优雅中止
- matlab 设置legend(比较全面)
- 虚拟机3种网络模式(桥接、nat、Host-only)
- Attribute is missing the Android namespace prefix
- VMware 报错“Intel VT-x处于禁止状态”
- mysql join using temporary 优化_MySQL 在 INNER JOIN 场景的使用-爱可生
- 开课吧python小课学了有用吗-(内推实习)年薪30万,大量缺人,这个技能在金融圈到底有多吃香?...
- c语言中*在变量的右上角,C语言中变量的声明和定义
- LINUX FFMPEG编译汇总(中等,只编译必要的部分)
- 【安装sql 2008步骤】
- java笔试记录(基础知识复习)
- 时光倒流我这么学java
- 【2022-01-06】JS逆向之QCC请求头参数
- ps快捷键及相关基础知识总结(持续ing)
- 计算机鼠标装有,计算机插入鼠标时无法安装设备驱动程序的解决方法
- 比有钱更重要的,是拥有“选择权”(深度好文)
- 使用vue实现简单的图书管理
- jstl依赖_[JSTL表达式]
- 一寸Timing一寸金,寸金能买寸光阴——CCD
热门文章
- 润乾单查日期特别慢_SQL编写不合理导致历史日志查询特别慢
- python提供两个对象身份比较操作符_标准类型对象比较操作符
- tcp丢包一定会断线吗_有遗传就一定会脱发吗
- oracle java javapath_系统找不到C:\ProgramData\Oracle\Java\javapath\java.exe问题及解决方案...
- leetcode刷题六z字形变换
- 从golang-gin-realworld-example-app项目学写httpapi (四)
- C++基于TCP和UDP的socket通信
- javascript使用闭包模拟私有属性和方法
- ubuntu 下重装mysql若干问题
- 内卷、996的背后,AI技术该如何服务企业“人、财、物”?