java实习生面试基础(二)

1、JDK与JRE的区别?
JRE是Java编译时环境,是运行java程序的条件,里面包含对应的jvm和java基础类,是提供给运行java程序用户使用的
JDK是Java开发运行环境,是开发程序所必须的,即java开发工具包。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。

2、==和equals()的区别?
首席数据的表示有基本类型和引用类型,基本类型比较的是值是否相同,而引用类型比较的是存储地址是否相等
==有两种表现情况?
当时数据表示基本类型时:等等判断的是值是否相同!例如:
String a = “123”;
String b = “123”; 此时用a等等b返回的是false
当数据表示引用类型时:等等判断的是存储地址是否相等!例如:
String a = new String(“123”);
String b = new String(“123”); 此时用a等等b返回是false
equals()只能比较引用类型,默认情况比较的是存储地址值是否相等。且equals比较时类型必须要是同一引用类型!例如:
在这里插入图片描述
在这里插入图片描述

3、两个对象的hashCode()相同,则equals()也相同吗?
答:不对(有时相同有时不同),简单的回答:其实hashCode无非是通过算法返回的一个int值,重写hashCode方法使传递的对象返回值相等,但他们的内容不相等,则equals()则为false;
1.若重写了equals(Object obj)方法,则有必要重写hashCode()方法。
2.若两个对象equals(Object obj)返回true,则hashCode()有必要也返回相同的int数。
3.若两个对象equals(Object obj)返回false,则hashCode()不一定返回不同的int数。
4.若两个对象hashCode()返回相同int数,则equals(Object obj)不一定返回true。
5.若两个对象hashCode()返回不同int数,则equals(Object obj)一定返回false。
6.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。

4、final在Java中有什么作用?
final修饰类:表示该类为最终类,不能被继承。final修饰的类里面的方法与变量默认为final。
final修饰方法:表示该方法是最终方法,不能被子类重写。
final修饰成员变量:表示该成员变量或常量为最终变量;一旦初始化后就不能再改变变量的值。

5、java中Math.round(-1.5)等于多少?
等于-1;表示的是Math.round(-1.5+0.5)后再向下取整,Math.round(-1.6)就等于-2;
Math中还有floor()与ceil()方法:
floor():方法是向上取整;Math.floor(23.2) 值为23
ceil():方法是向下取整;Math.ceil(23.3)值为24

6、String属于基础数据类型吗?
不属于基础数据类型,因为String类型的值是存储在常量池中的。String类型是我们在编程中经常使用的数据类型。因此java的设计者将String类型做了一定的特殊处理,使其可以直接定义和基础数据类型一样:int a = 5; String a =“aa”;将值放在常量池中,直接利用hashCode返回的值作为存储地址后找到对应的字符串值。而String a = new String(“wuhui”);则先在堆内存中画出一块区域存储对象,根据这个对象的地址判断常量池有没有对应的地址,没有就创建一个常量池地址;
在这里插入图片描述

7、java中操作字符串有哪些类,他们之间有什么区别?
Java中操作字符串的类有:String、StringBuffer、StringBuilder。这三个类都是以char[]的形式保存的字符串,但是String类型的字符串是不可变的,对String类型的字符床做修改操作都是相当于重新创建对象.而对StringBuffer和StringBuilder进行增删操作都是对同一个对象做操作.StringBuffer中的方法大部分都使用synchronized关键字修饰,所以StringBuffer是线程安全的,StringBuilder中的方法则没有,线程不安全,但是StringBuilder因为没有使用使用synchronized关键字修饰,所以性能更高,在单线程环境下我会选择使用StringBuilder,多线程环境下使用StringBuffer.

8、String str="i"与String str = new String(“i”)一样吗?
String str=“i”;
这句话的意思是把“i”这个值在内存中的地址赋给str,如果再有String str3=“i”;那么这句话的操作也是把“i”这个值在内存中的地址赋给str3,这两个引用的是同一个地址值,他们两个共享同一个内存。
而String str2 = new String(“i”);
则是将new String(“i”);的对象地址赋给str2,需要注意的是这句话是新创建了一个对象。如果再有String str4= new String(“i”);那么相当于又创建了一个新的对象,然后将对象的地址值赋给str4,虽然str2的值和str4的值是相同的,但是他们依然不是同一个对象了。
需要注意的是:String str=“i”; 因为String 是final类型的,所以“i”应该是在常量池。
而new String(“i”);则是新建对象放到堆内存中。

9、如何将字符串反转?
1、使用 StringBuilder 或 StringBuffer 的 reverse 方法,本质都调用了它们的父类 AbstractStringBuilder 的 reverse 方法实现。StringBuilder a = new StringBuilder(“abcd”); a.reverse()
在这里插入图片描述

2、自定义循环
3、递归实现

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、Object常用的方法有哪些?
toString():方法将对象信息变成字符串返回;
equals()方法比较两个对象的地址是否相等,需要重写equals()方法。
hashcode(),用来返回所在对象的物理地址。
wait(),用来线程等待,让出cpu。
getClass()用来获取运行的类。
notify()唤醒某个线程。
notifyAll()唤醒所有线程。

12、抽象类必须要有抽象方法吗?
不必须
抽象类必须要有abstract关键字;
抽象类可以不包含抽象方法;
包含抽象方法那么这个类就是抽象类;
当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是abstract的,而这个子类也必须是抽象的,即声明为abstract。abstract抽象类不能用new实例化对象,abstract方法只允许声明不能实现。如果一个类中含有abstract方法,那么这个类必须用abstract来修饰,当然abstract类也可以没有abstract方法。 一个抽象类里面没有一个抽象方法可用来禁止产生这种类的对象。

13、普通类和抽象类的区别?
抽象类不能被实例化对象
抽象类可以有抽象方法,抽象方法只需申明,无需实现
含有抽象方法的类必须申明为抽象类
抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类
抽象方法不能被声明为静态
抽象方法不能用private修饰
抽象方法不能用final修饰

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

15、接口和抽象类有什么区别?
抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口只能有方法名;
抽象类中的成员变量可以是各种类型,而接口的成员变量只能是private static final类型的;
接口中不能包含静态代码块以及静态方法(即用static修饰的),而抽象类可以有静态方法和静态代码块;
一个类只能继承一个抽象类,而一个类可以实现多个接口;
(接口是隐士抽象的,当申明一个接口时,不必写abstract关键字。接口中每一个方法都是抽象的,声明时不必加 abstract。接口中的方法由实现接口的类来实现接口中的方法)

16、java中IO流分为几种?
按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流。

Java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java IO流的40多个类都是从如下4个抽象类基类中派生出来的。
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

17、BIO、NIO、AIO有什么区别?
BIO (Blocking I/O): 同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。因此,我们需要一种更高效的 I/O 处理模型来应对更高的并发量。
NIO (New I/O): NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。NIO中的N可以理解为Non-blocking,不单纯是New。它支持面向缓冲的,基于通道的I/O操作方法。 NIO提供了与传统BIO模型中的 Socket 和 ServerSocket 相对应的 SocketChannel 和 ServerSocketChannel 两种不同的套接字通道实现,两种通道都支持阻塞和非阻塞两种模式。阻塞模式使用就像传统中的支持一样,比较简单,但是性能和可靠性都不好;非阻塞模式正好与之相反。对于低负载、低并发的应用程序,可以使用同步阻塞I/O来提升开发速率和更好的维护性;对于高负载、高并发的(网络)应用,应使用 NIO 的非阻塞模式来开发
**AIO (Asynchronous I/O): AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。**异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身是同步的。查阅网上相关资料,我发现就目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

18、Files的常用方法有哪些?
Files.exists() 检测文件路径是否存在
Files.createFile()创建文件
Files.createDirectory()创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size()查看文件个数
Files.read() 读取文件
Files.write()写入文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值