java面试

时间:2020-07-30 01:37:30   收藏:0   阅读:83

1、java基础

1、JDK 和JRE有什么区别

? JDK:java开发工具包,java开发运行环境、包含了JRE。

? JRE:java运行环境包含java虚拟机java基础类库

2、java基础类库

	1. java.lang:java语言设计的基础类

 		2. java.util  :提供处理日期、时间、随机数等工种工具的类
           	3. java.io:输入输出相关的类
            4. java.nio:提供缓冲区类
            5. java.beans:开发JavaBeans相关的类
            6. ....

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

? hashCode:散列码是由对象导出的一个整型值。没有规律。类的hashCode()方法继承自Object类。每一个对象都有一个默认的散列码它的值为对象的存储地址(由对象的物理存储地址通过散列转换来的)

hashCode即为对象的存储地址

equals()对比对象所包含内容的对比

4、== 和 equals 的区别是什么?

? “==” 比较的是变量(变量:对象的首地址)本身的值,即连个对象在内存中的首地址

? “equals()”比较对象中所包含的内容是否相同。

5、String str="i"与 String str=new String(“i”)一样吗?

? 不一样。

? String str="i"方式,java虚拟机将其分配到常量池中。

? String str = new String("i") 被分配到堆内存中

String str1 = "i";
String str2 = "i";
String str3 = new String("i");
System.out.println(str1 == str2); // true
System.out.println(str2 == str3); //false

解释:

java虚拟机分配到常量池:常量池不会重复创建对象

str1 = "i",把i值存在常量池,地址赋给str1。

str2,把i的地址赋给str2,单i对象不会重新创建。

他们引用的是同一个地址值,共享一个i对象。

分配到堆内存:堆内存会创建新的对象

假设在写一个String str3 = new String("i");,则会创建一个新的i对象,将地址值赋给str3。

虽然str3和str1值相同但是地址值不同。

6、字符串反转?

? 方法一:

public static String(String srt) {
    return StringBuild(srt).reverse().toStirng;
}

? 方法二:

public static String(String srt) {
    String severse = "";
    for (int i = 0; i < srt.length(); i++) {
        reverse = srt.charAt() + reverse;
    }
    return reverse;
}

? 方法三:

public static String(String srt) {
    char[] chars = srt.toCharArray();
    String reverse = "";
    for (int i = srt.length()-1; i >= 0; i--) {
        reverse = reverse + chars[i];
    }
    return reverse;
}

7、java中IO流分为几种?

? 从流的角度分析:

? 所有流的基类

技术图片

8、BIO、NIO、AIO 有什么区别?

? BIO(同步阻塞IO模式):假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式,叫一个线程停留在一个水壶那,直到水壶烧开,才去处理下一个水壶。等待的时间什么也没做。

? NIO(支持阻塞与非阻塞):还拿烧开水来说,NIO的做法是叫一个线程不断轮询每个水壶状态查看是否发生改变,从而进行下一步的操作

? AIO(异步非阻塞IO模型):为每个水壶上面装了一个开关,水烧开后,水壶自动通知我水开了

9、files常用的方法有哪些?

	- files.read():读取文件
	- files.write():写入文件
	- files.size():查看文件个数
	- files.move():移动文件
	- files.delete():删除文件
	- files.copy():复制文件
	- files.createDirectory():创建文件夹
	- files.createFile():创建文件
	- files.exists():检测文件路径是否存在

10、抽象类和接口的区别?

? 继承和实现的区别?

抽象类:

接口:

二、容器

? 什么是容器?

? 数组长度限制为:Integer.Integer.MAX_VALUE;

? String的长度限制:底层是char数组 长度Integer.MAX_VALUE 线程安全的

? java.util下的集合容器:

? 技术图片

set:无序、不允许重复

list:有序、允许重复

map:双列集合的超类,键值对形式

2、Collection 和 Collections 有什么区别?

? Collection:是集合的接口,其继承它的类有set、list

? Collections:是集合工具类,定义了许多操作集合的静态方法。是帮助类

3、List、Set、Map 之间的区别是什么?

? 集合类都处于java.util包中,所以他们都是java.util包中都是接口类

set:对象无序不重复

list:对象有序重复

map:是键值对保存对象,每一个元素包含一个键对象和值对象

三、线程

1、什么是线程安全和线程不安全?

? 压力测试或并发测试,会经常遇到此问题。

举例:假设售票系统有100张票,若线程不安全,A和B同时买了一张票后显示还有999张票,这是错的,应该只有998张票。

线程安全:

? 安全指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结构都一样。

线程不安全:

? 指不提供加锁机制保护,有可能会出现多个线程先后更改数据造成所得的数据是脏数据。

2、引起线程安全问题的原因:

? 1、线程安全问题都是有全局变量及静态变量引起的。

? 若每个线程中全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的。

? 若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

? 2、解决多线程并发访问资源安全问题的方法:

? (1)synchronize(只给一个线程执行,完成后才到下一个线程)

? 用来控制线程同步,保证我们的线程在多线程环境下,不被多个线程同时执行,确保数据完整性。使用方法加在方法上。

? (2)lock

? lock的引入让锁有了可操作性,是指我们在需要的时候手动获取锁和释放锁。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!