面试中可能遇到的java基础类问题
Java 基础
JDK 和 JRE 有什么区别
- JDK:Java Development Kit Java开发工具包
- JRE:Java Runtime environment Java运行环境
JRE,即java运行环境,包含了Java虚拟机、Java核心类库和支持文件,不包含开发工具,主要向用户提供运行java开发软件的运行环境。
JDK,即Java开发工具包,包含JRE,编译器和调试器等工具(JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序,主要供开发人员使用。
值得注意的是,在JDK 11 中,Oracle不再提供JRE和Server JRE下载
== 和 equals 的区别是什么
“==”
比较的是变量内存中存放的对象的存地址,用来判断两个对象的地址是否相同,即两个对象是否指向相同的地址,可以说‘==’比较的是引用。
“equals”
equals用来比较两个对象的内容,由于所有的类都继承于java.lang.Object类,因此适用于所有对象,只要没有对equals方法进行覆盖,平时调用的就是Object中的equals方法,而Object中的equals方法返回的是 == 的判断,因此需要注意。
字符串对象之间的比较能很好的区别 == 与 equals
hashCode 和 equals
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗
不一定,因为hashCode()方法 和 equals()方法都可以覆盖,返回值可以自定义
两个对象用equals方法比较为true,它们的Hashcode值相同吗
不一定,因为默认情况下equals() 方法比较的是对象的内容,内容相同时但对象不一定相同,对象不同hashcode的值就不会相同。
关于hashCode和equals方法的覆盖使用是有有些规则的:
- 两个对象使用equals比较返回true,那么hashCode方法必须返回相同值
- 两个对象equals比较返回false,不意味着hashCode方法必须返回不同值
hashCode()和equals()方法的重要性体现在什么地方
Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。
final 在 java 中有什么作用
- 修饰类
使用final修饰类的话,这个类将无法被继承(由于final类禁止继承,所以final类中所有的方法都隐式的指定为是final的)
- 修饰方法
《JAVA编程思想》第143页:
“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。”
- 修饰变量
一个被final修饰的变量或引用,一旦初始化后便不能更改。
类的private方法会隐式地被指定为final方法。
java 中的 Math.round(-1.5) 等于多少
round 表示“四舍五入”,算法为Math.floor(x+0.5),所以
Math.round(1.5) = 2
Math.round(-1.5) = -1
注:floor() 方法可对一个数进行下舍入,返回给定参数最大的整数,该整数小于或等于给定的参数。 the largest (closest to positive infinity) floating-point value that less than or equal to the argument and is equal to a mathematical integer.
String 属于基础的数据类型吗
不是,Java中的String是引用类型
java中的基本数据类型:byte,short,int,long,float,double,boolean,char
引用类型包括:类,接口类型,数组类型,枚举类型,注解类型
基本数据类型在创建时,在栈上给其划分一块内存,将数值直接存储在栈上。
引用数据类型在创建时,需要先在栈上分配一块内存给引用(句柄),而对象的具体信息都存储在堆内存上,然后由栈上面的引用指向堆对象的地址。
java 中操作字符串都有哪些类它们之间有什么区别
主要是:String、StringBuffer、StringBuilder
- String:final修饰类型,String类的方法都是返回new String()。即String对象不能被修改,修改后都会产生新的对象。
- StringBuffer:类中操作方法都有synchronized修饰,线程安全。
- StringBuilder:和StringBuffer用法类似,区别在于类中的方法没有synchronized修饰,线程不安全。速度最快。
String str=”i”与 String str=new String(“i”)一样吗
不一样,因为String为final类型所以String str=”i”中,‘i’是在常量池,而new String(“i”)是新建的对象在堆内存中
如何将字符串反转
1 | //使用StringBuffer中的reverse方法 |
String 类的常用方法都有那些
| 方法名 | 描述 |
|---|---|
| toCharArray | 将字符串转换成字符数组 |
| charAt | 取出指定位置的字符 |
| getBytes | 将字符串转换成byte数组 |
| length | 获取字符串长度 |
| trim | 去掉字符串两端空格 |
| substring | 字符串的截取 |
| split | 按照指定字符对字符串进行拆分,返回字符串数组 |
| toUpperCase | 将字符串中小写字母转换成大写字母 |
| toLowerCase | 将字符串中大写字母转换成小写字母 |
| startsWith | 判断是否以指定字符串开头 |
| endsWith | 判断是否以指定字符串结尾 |
| equals | 两个String类型内容比较 |
| equalsIgnoreCase | 将两个字符串进行不区分大小写比较 |
| replaceAll | 替换指定字符串 |
抽象类必须要有抽象方法吗
用abstract修饰的类就是抽象类,但抽象类中的方法不一定是抽象方法,也就是说,不一定非要有抽象方法。
注:抽象类不能被实例化
普通类和抽象类有哪些区别
- 抽象类不能被实例化
- 抽象类可以有构造方法,被继承事子类必须继承父类得一个构造方法
- 含有抽象方法的类必须修饰为抽象类
- 抽象方法不能被声明为静态,但抽象类中可以有静态方法
- 抽象类的子类必须实现抽象类中的所有抽象方法,否则这个子类也必须抽象类
抽象类能使用 final 修饰吗
抽象类是用于继承得,使用final对其修饰将意味着这个类无法被修改和不可以被继承,所以抽象类不能使用final修饰
接口和抽象类有什么区别
- 抽象类要被子类继承,接口要被类实现
- 接口只能做方法申明,在抽象类种可以做方法声明也可以做方法实现
- 接口里定义的变量是公共的静态常量,抽象类中的变量是普通变量
恰当的原则应该是优先选择类而不是接口。
java 中 IO 流分为几种
- 按流的流向分类:输入流和输出流
- 按操作单元划分:字节流和字符流
- 按流的角色划分:节点流和处理流
Java IO 流共涉及40多个类,并且都是从如下4个抽象类基类派生出来:InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流:OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
BIO、NIO、AIO 有什么区别
BIO:Block IO同步阻塞式IO,传统的IO,特点是模式简单,并发处理能力低
NIO:Non IO 同步非阻塞IO,传统IO的升级,客户端和服务端通过通道通信,实现多路复用
AIO:Asynchronous IO,NIO的升级版,也叫NIO2,实现异步非阻塞IO,异步IO的操作基于事件和回调机制
Files的常用方法都有哪些
| 方法名 | 描述 |
|---|---|
| Files.exists() | 检测文件路径是否存在 |
| Files.createFile() | 创建文件 |
| Files.createDirectory() | 创建文件夹 |
| Files.delete() | 删除文件或者目录 |
| Files.copy() | 复制文件 |
| Files.move() | 移动文件 |
| Files.size() | 查看文件个数 |
| Files.read() | 读取文件 |
| Files.write() | 写入文件 |
老师有讲过,思想是需要建立在一定的实践基础上,前期需要对代码基础进行多多练习,对代码真正的熟悉,熟练,再去掂量思想也不迟,或许能收获更多,就像读书一样,不同时期感触不同,收获也就不一定相同。