Java 基础

1.JDK 和 JRE 有什么区别?

JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。

JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。

具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。

2.== 和 equals 的区别是什么?

==比较数值或地址引用的相等。

equals比较两个对象内容之间的相等。

== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

错,不对,两个对象的 hashCode()相同,equals()不一定 true。

代码示例:

String str1 = "str";

String str2 = "String";

System.out.println(String.format("str1:%d | str2:%d",  str1.hashCode(),str2.hashCode()));

System.out.println(str1.equals(str2));

执行的结果:

str1:1179395 | str2:1179395

false

代码解读:很显然“str”和“String”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

4.Java中final、finally、finallize的区别与用法

final、finally、finallize并无关联。

final:java中的关键字、修饰符,用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

finally:java的一种异常处理机制,是异常处理语句结构的一部分,表示总是执行。

finallize:java中Object类的一个方法,在垃圾回收其执行的时候会调用被回收对象的此方法,供垃圾回收时的其他资源回收。

5.java 中的Math.round(1.5) 等于多少?Math.round(-1.5) 等于多少?

Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加0.5然后做向下取整。

6.String 属于基础的数据类型吗?

String 不属于基础的数据类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。

1、int长度数据类型有:byte(8bits)、short(16bits)、int(32bits)、long(64bits)。

2、float长度数据类型有:单精度(32bits float)、双精度(64bits double) 。

3、boolean类型变量的取值有:ture、false 。

4、char数据类型有:unicode字符,16位 。

7.java 中操作字符串都有哪些类?它们之间有什么区别?(String、StringBuffer、StringBuilder有什么区别?)

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

执行速度:StringBuilder > StringBuffer > String。

8.String str="i"与 String str=new String("i")一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。
前者可能新建了一个对象,也可能没有新建对象。

后者因为new关键字,至少在内存中创建了一个对象,也可能新建了两个对象。
这些都取决于“i”是否在字符串常量池中。

9.如何将字符串反转?

1.使用 StringBuilder 或 StringBuffer 的 reverse() 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。(JDK1.8)

2.不考虑字符串中的字符是否是 Unicode 编码,自己实现。

3.递归

代码:

package constxiong.interview;

public class TestReverseString {

public static void main(String[] args) {

String str = "ABCDE";

System.out.println(reverseString(str));

System.out.println(reverseStringByStringBuilderApi(str));

System.out.println(reverseStringByRecursion(str));

}

/**

* 自己实现

* @param str

* @return

*/

public static String reverseString(String str) {

if (str != null && str.length() > 0) {

int len = str.length();

char[] chars = new char[len];

for (int i = len - 1; i >= 0; i--) {

chars[len - 1 - i] = str.charAt(i);

}

return new String(chars);

}

return str;

}

/**

* 使用 StringBuilder

* @param str

* @return

*/

public static String reverseStringByStringBuilderApi(String str) {

if (str != null && str.length() > 0) {

return new StringBuilder(str).reverse().toString();

}

return str;

}

/**

* 递归

* @param str

* @return

*/

public static String reverseStringByRecursion(String str) {

if (str == null || str.length() <= 1) {

return str;

}

return reverseStringByRecursion(str.substring(1)) + str.charAt(0);

}

}

10.String 类的常用方法都有哪些?

equals:字符串是否相同

equalsIgnoreCase:忽略大小写后字符串是否相同

compareTo:根据字符串中每个字符的Unicode编码进行比较

compareToIgnoreCase:根据字符串中每个字符的Unicode编码进行忽略大小写比较

indexOf:目标字符或字符串在源字符串中位置下标

lastIndexOf:目标字符或字符串在源字符串中最后一次出现的位置下标

valueOf:其他类型转字符串

charAt:获取指定下标位置的字符

codePointAt:指定下标的字符的Unicode编码

concat:追加字符串到当前字符串

isEmpty:字符串长度是否为0

contains:是否包含目标字符串

startsWith:是否以目标字符串开头

endsWith:是否以目标字符串结束

format:格式化字符串

getBytes:获取字符串的字节数组

getChars:获取字符串的指定长度字符数组

toCharArray:获取字符串的字符数组

join:以某字符串,连接某字符串数组

length:字符串字符数

matches:字符串是否匹配正则表达式

replace:字符串替换

replaceAll:带正则字符串替换

replaceFirst:替换第一个出现的目标字符串

split:以某正则表达式分割字符串

substring:截取字符串

toLowerCase:字符串转小写

toUpperCase:字符串转大写

trim:去字符串首尾空格

11.抽象类必须要有抽象方法吗?

不必须,抽象类不一定非要有抽象方法。

12.普通类和抽象类有哪些区别?

1. 抽象类声明时要使用abstract关键字来定义,而普通类可以是public , private 等;

2.抽象类里的方法不能有方法的主体, 只能是方法的声明,而普通类的方法可以有主体。

3.抽象类被继承时,子类必须实现它的所有方法,而普通类不需要;

4.抽象类的方法在扩展性和延伸性方面要比普通类的好;

5.抽象类可以应用多态,但是普通类不可以。

13.抽象类能使用 final 修饰吗?

不能,抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

14.接口和抽象类有什么区别?

实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

构造函数:抽象类可以有构造函数;接口不能有。

main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。

实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

15.java 中 IO 流分为几种?

按照流的流向可以分为输入流和输出流;

按照操作单元可以划分为字节流和字符流;

按照流的角色可以划分为节点流和处理流。

Java I0流的40多个类都是从如下4个抽象类基类中派生出来的:

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

16.BIO、NIO、AIO 有什么区别?

BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。

NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

17.Files的常用方法都有哪些?

Files.exists() 检测文件路径是否存在

Files.createFile() 创建文件

Files.createDirectory() 创建文件夹

Files.delete() 删除文件或者目录

Files.copy() 复制文件

Files.move() 移动文件

Files.size() 查看文件个数

Files.read() 读取文件

Files.write()写入文件

Java面试题(Java基础篇)的更多相关文章

  1. Java面试题之基础篇概览

    Java面试题之基础篇概览 1.一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,且public的类名必须与文件名相一致. 2.Ja ...

  2. Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步

    Java入门到精通——基础篇之多线程实现简单的PV操作的进程同步 一.概述     PV操作是对信号量进行的操作.     进程同步是指在并发进程之间存在一种制约关系,一个进程的执行依赖另一个进程的消 ...

  3. Python自动化测试面试题-Python基础篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  4. 2020年大厂Java面试题(基础+框架+系统架构+分布式+实战)

    前言 作为一个Java开发者,Java架构师应该是大家的一个职业目标了吧. 要成为Java架构师,首先你要是一个高级Java工程师,熟练使用各种框架,并知道它们实现的原理.jvm虚拟机原理.调优,懂得 ...

  5. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  6. Java面试题汇总---基础版(附答案)

    基于我个人对面试的认知和招聘经验,在此我总结一下Java开发者的基础知识掌握要求,及应聘者面试的需要准备的内容. 首先,Java基础是每个面试官都会问到的,可能只是针对工作经验的多少,对问题追踪深度有 ...

  7. 2019百度阿里Java面试题(基础+框架+数据库+分布式+JVM+多线程)

    前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高.通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初 ...

  8. 一份贴近真实面试的Java面试题(基础部分)

    这是一份关于Java基础的面试题.在网上的关于Java的面试题数不胜数,但本人认真看过后觉得大多数都没有实用性,有很多是面试官根本就不会问到的,企业根本不会用到的,一些已经脱离了实际开发的技术问题.而 ...

  9. Java面试题(设计模式篇+Spring/Spring MVC篇)

    设计模式 88.说一下你熟悉的设计模式? 自行熟悉. 89.简单工厂和抽象工厂有什么区别? 简单理解简单工厂:对 一个对象的创建进行封装.抽象工厂:对 一组对象的创建进行封装. 比如生产 陶瓷马 和  ...

  10. java类与对象基础篇

    java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...

随机推荐

  1. PHP str_shuffle() 函数

    实例 随机地打乱字符串中的所有字符: <?php高佣联盟 www.cgewang.comecho str_shuffle("Hello World");?> 定义和用法 ...

  2. 笨办法学python 第四版 中文pdf高清版|网盘下载内附提取码

    笨办法学 Python是Zed Shaw 编写的一本Python入门书籍.适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用.这本书以习题的方式引导读者一步一步学习编 程,从简单的打印一 ...

  3. 经验分享:一个 30 岁的人是如何转行做程序员,进入IT行业的?

    大约一年以前,我成为了一名全职开发者,我想要总结一下这一年的经验,并且和所有人分享,一个 30 多岁的人是如何进入科技行业的: 改变职业是一件吓人的事情,有时候还会成为一件危险的事情.年龄越大,危险就 ...

  4. luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性

    LINK:送礼物 原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30. 以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉. 能过的\ ...

  5. luogu P5826 【模板】子序列自动机 主席树 vector 二分

    LINK:子序列自动机 想了一些很有趣的做法. dp 容易看出 f[i][j]表示前i个数匹配了j个数的dp 不过复杂度很高. 贪心 容易想到匹配的时候每个数字尽量往前匹配 这样显然是最优的 复杂度Q ...

  6. 【BZOJ2724】蒲公英 题解(分块+区间众数)

    题目链接 题目大意:给定一段长度为$n$的序列和$m$次询问,每次询问区间$[l,r]$内的最小的众数.$n\leq 40000,a_i\leq 10^9$ --------------------- ...

  7. 基于boost的bind与function的一个简单示例消息处理框架

    前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...

  8. 内网 Maven 编译

    内网 Maven 编译 有个特殊的需求,在不联网的情况下编译 Java 项目. 想到两种方案: 搭建 Nexus 私有镜像仓库. 直接把依赖 jar包 放在编译机的 maven 本地库中. 步骤简述 ...

  9. [深度学习] Pytorch学习(二)—— torch.nn 实践:训练分类器(含多GPU训练CPU加载预测的使用方法)

    Learn From: Pytroch 官方Tutorials Pytorch 官方文档 环境:python3.6 CUDA10 pytorch1.3 vscode+jupyter扩展 #%% #%% ...

  10. Java—io流之打印流、 commons-IO

    打印流 打印流根据流的分类: 字节打印流  PrintStream 字符打印流  PrintWriter /* * 需求:把指定的数据,写入到printFile.txt文件中 * * 分析: * 1, ...