平日里我们常说:“抓住一个男人的心,先抓住他的胃”,同理对于编码也是一样的,我们要抓住Java的面试点,一步步让程序员继续读下去。

兄弟们兄弟们,最新的Java面试题他来了[亲亲][亲亲][亲亲][亲亲]:

1. JDK 和 JRE 有什么区别?

面向人群不同:

JDK是面向开发人员使用的SDK。

JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序的使用者。

重要程度不同:

JRE的地位就象一台PC机一样,编写的Java程序必须要JRE才能运行。只要你的电脑安装了JRE,就可以正确运行Jav a应用程序。

安装位置不同:

如果安装JDK,电脑有两套JRE,一套位于 \jre 另外一套位于 C:\Program Files\Java\j2re1.4.1_01 目录下。

如果安装JRE,会在 C:\Program Files\Java 目录下安装唯一的一套JRE。

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

对于基本类型和引用类型 == 的作用效果是不同的,如下所示:

•      基本类型:比较的是值是否相同;

•      引用类型:比较的是引用是否相同;

代码示例:

String x = "string";

String y = "string";

String z = new String("string");

System.out.println(x==y); // true

System.out.println(x==z); // false

System.out.println(x.equals(y)); // true

System.out.println(x.equals(z)); // true

代码解读:因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。

equals 解读

equals 本质上就是 ==,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了。

首先来看默认情况下 equals 比较一个有相同值的对象,代码如下:

class Cat {

public Cat(String name) {

this.name = name;

}

private String name;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

Cat c1 = new Cat("叶痕秋");

Cat c2 = new Cat("叶痕秋");

System.out.println(c1.equals(c2)); // false

输出结果出乎我们的意料,竟然是 false?这是怎么回事,看了 equals 源码就知道了,源码如下:

public boolean equals(Object obj) {

return (this == obj);

}

原来 equals 本质上就是 ==。

那问题来了,两个相同值的 String 对象,为什么返回的是 true?代码如下:

String s1 = new String("叶子");

String s2 = new String("叶子");

System.out.println(s1.equals(s2)); // true

同样的,当我们进入 String 的 equals 方法,找到了答案,代码如下:

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

原来是 String 重写了 Object 的 equals 方法,把引用比较改成了值比较。

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

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

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

代码示例:

String str1 = "keep";

String str2 = "brother";

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

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

执行的结果:

str1:1179395 | str2:1179395

false

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

4. final 在 Java 中有什么作用?

final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法。

特征:凡是引用final关键字的地方皆不可修改!

(1)修饰类:表示该类不能被继承;

(2)修饰方法:表示方法不能被重写;

(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

5. Java 中的 Math. round(-1. 5) 等于多少?

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

我们可以通过大量实验看下结果

public class test {

public static void main(String[] args){

System.out.println(Math.round(1.3));   //1

System.out.println(Math.round(1.4));   //1

System.out.println(Math.round(1.5));   //2

System.out.println(Math.round(1.6));   //2

System.out.println(Math.round(1.7));   //2

System.out.println(Math.round(-1.3));  //-1

System.out.println(Math.round(-1.4));  //-1

System.out.println(Math.round(-1.5));  //-1

System.out.println(Math.round(-1.6));  //-2

System.out.println(Math.round(-1.7));  //-2

}

}

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

String是final修饰的java类,java中的基本类型一共有8个,它们分别为:

•      字符类型:byte,char

•      基本整型:short,int,long

•      浮点型:float,double

•      布尔类型:boolean

此外需要说明 有的文章中吧void也算是一种基本的数据类型

7. Java 中操作字符串都有哪些类?它们之间有什么区别?

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

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

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

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

不一样,因为内存的分配方式不一样。String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String("i") 则会被分到堆内存中。

代码示例:

String x = "叶痕秋";

String y = "叶痕秋";

String z = new String("叶痕秋");

System.out.println(x == y); // true

System.out.println(x == z); // false

String x = "叶痕秋" 的方式,Java 虚拟机会将其分配到常量池中,而常量池中没有重复的元素,比如当执行“叶痕秋”时,java虚拟机会先在常量池中检索是否已经有“叶痕秋”,如果有那么就将“叶痕秋”的地址赋给变量,如果没有就创建一个,然后在赋给变量;而 String z = new String(“叶痕秋”) 则会被分到堆内存中,即使内容一样还是会创建新的对象。

9. 如何将字符串反转?

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代码:

// StringBuffer reverse

StringBuffer stringBuffer = new StringBuffer();

stringBuffer. append("abcdefg");

System. out. println(stringBuffer. reverse()); // gfedcba

// StringBuilder reverse

StringBuilder stringBuilder = new StringBuilder();

stringBuilder. append("abcdefg");

System. out. println(stringBuilder. reverse()); // gfedcba

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

•      indexOf():返回指定字符的索引。

•      charAt():返回指定索引处的字符。

•      replace():字符串替换。

•      trim():去除字符串两端空白。

•      split():分割字符串,返回一个分割后的字符串数组。

•      getBytes():返回字符串的 byte 类型数组。

•      length():返回字符串长度。

•      toLowerCase():将字符串转成小写字母。

•      toUpperCase():将字符串转成大写字符。

•      substring():截取字符串。

•      equals():字符串比较。

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

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

示例代码:

abstract class Cat {

public static void sayHi() {

System. out. println("hi~");

}

}

上面代码,抽象类并没有抽象方法但完全可以正常运行。

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

•      普通类不能包含抽象方法,抽象类可以包含抽象方法。

•      抽象类不能直接实例化,普通类可以直接实例化。

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

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,如下图所示,编辑器也会提示错误信息

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

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

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

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

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

15. Java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

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

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

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

•      NIO:Non 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的“小心心”相关推荐

  1. 利用JAVA画一颗小心心

    首先,这颗心是数学家画的,不是我.原理很复杂,大致原理就是迭代. 画这颗心的代码已经给出来了 public void draw(Graphics g){ for(int i=0;i<=180;i ...

  2. 小程序消息推送(含源码)java实现小程序推送,springboot实现微信消息推送

    本文是比较老得技术来实现,用最新技术实现小程序推送,请看 5行java代码实现微信小程序模版消息推送 (含springboot后台和小程序源码) 也可以看最新的视频讲解:https://edu.csd ...

  3. pythonturtle画房子_用python的turtle模块实现给女票画个小心心

    晚上自习无聊 正好拿自己的平板电脑用python写了个小程序,运用turtle模块画一个小心心,并在心上画女票名字的首字母缩写,单纯只为红颜一笑. 代码贴出来,很简单 import turtle im ...

  4. in java中文版百度云 thinking_小程序订阅消息推送(含源码)java实现小程序推送,springboot实现微信消息推送...

    前面写过一篇云开发实现小程序订阅消息(模板消息)推送的文章,<借助云开发实现小程序订阅消息和模板消息的推送功能>是有好多同学用的是Java写后台,所以今天就再来写一篇Java后台实现小程序 ...

  5. vue小米商城源代码_微信商城信息管理系统(java后台+小程序)

    前一段时间在公众号中发布了一套微信商城信息管理系统(java后台+小程序),也许大家可能都还记得.今天再给大家重复呈现一遍.重新梳理下,方便大家理解这是做什么用的,以便日后使用.开始正题 01 编写目 ...

  6. 分享几个Java面试小技巧,建议收藏!

    Java可谓编程界的元老,其资深地位无人撼动.那么学习Java的你,在面试时过五关斩六将还顺利吗?通常来讲,程序员的逻辑思维很清晰,在表达自我方面直接,但这在面试中可行不通,毕竟面试涉及到人际交流,所 ...

  7. Java web小项目_个人主页(2)—— 边缘加速原理与实现

    摘自:Java web小项目_个人主页(2)-- 边缘加速原理与实现 作者:丶PURSUING 发布时间: 2021-03-27 14:44:40 网址:https://blog.csdn.net/w ...

  8. Java web小项目_个人主页(1)—— 云环境搭建与项目部署

    摘自:Java web小项目_个人主页(1)-- 云环境搭建与项目部署 作者:丶PURSUING 发布时间: 2021-03-26 23:59:39 网址:https://blog.csdn.net/ ...

  9. Java一个小练习----String类型转换int类型

    Java一个小练习 把字符串str分割程String数组,然后转换成int数组,排序 String str = "123 345 89 93 2 6573 223" 然后在拼接成一 ...

最新文章

  1. hibernate开发错误及解决办法
  2. mysql 实时聚合分析,mysql累积聚合原理与用法实例分析
  3. Java程序员校招蚂蚁金服,mysql培训考试
  4. easyui datagrid 浏览器像素及改变表、列宽问题
  5. java本地可以发到linux不行,java 使用 ftp 在windows环境下可以正常下载文件,在linux环境下不行...
  6. CoreJava 笔记总结-第四章 对象与类
  7. 【计蒜客 - 2019南昌邀请赛网络赛 - I】Max answer(单调栈,RMQ)
  8. Java-Super
  9. 自定义 Spark item 的渲染器
  10. ubuntu 安装 最新 OpenBabel
  11. numpy——zeros(), ones(), empty(), eye()
  12. 演示Eclipse插件实现代码提示和补全
  13. matplotlib官方文档pdf_Matplotlib知识
  14. java创建集合有的不用泛型_Java如何创建泛型集合?
  15. java 从入门到精通PDF
  16. 蓝桥杯单片机组经验分享之(三)各模块用法(1)138译码器
  17. uchome登陆机制分析(三)
  18. 系统软件项目成本构成及估算方法
  19. U盘中Word文档打不开怎么办?
  20. linux下mp3编码库libmp3lame的开发使用

热门文章

  1. 怎么将pdf转换成excel
  2. 12【源码】数据可视化:基于 Echarts +Java SpringBoot 实现的动态实时大屏范例 - 供应链
  3. TensorRT加速应用
  4. WSL下的NeoVim安装与配置
  5. 一个女孩写给monica信 转贴
  6. HAL层,.sensors.h 头文件分析
  7. LeetCode#17 Python解
  8. Openvino学习之openvino2022.1版安装配置
  9. NodeJS 爬取lol英雄数据信息
  10. 关于高性能计算机的一些介绍