java面试:java基础、Io、容器
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流分为几种?
从流的角度分析:
- 按流的方向:输入流、输出流
- 按操作单元:字节流、字符流
- 按流的角色:节点流、处理流
所有流的基类
- InputStrean/Reader:所有输入流的基类,前者字节流类,后者字符流。
- OutputStream/Writer:所有输出流的基类,前者字节流,后者字符流。
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、抽象类和接口的区别?
继承和实现的区别?
- 表面上是单继承、多实现
- 继承:多个类的某部分的功能相同,那么可以抽象出一个类,把相同部分放到这个类中,让他们都继承这个类。
- 实现:多个类目标一样,但处理方式不同,定义一个接口,也就是标准,让他们实现这个接口。各自实现自己具体的处理方法来实现那个目标。
抽象类:
- 单继承,extend
- 可以做方法声明,也可以做方法实现
- 普通的变量,成员属性:public、default、private
- 抽象类是重构的结果
- 抽象类主要用来抽象类别
接口:
- 多实现
- 只做方法声明
- 变量只能是公共静态常量
- 接口是设计的结构
- 抽象功能
二、容器
什么是容器?
容器是指以容纳物料并以壳体为主的基本装置。
java容器类类库的用途是“保存对象”。
java集合类是一种特别有用的工具类,可以用于存储数量不等的对象,并可以实现常用的数据结构,如:栈、队列、java集合等就像一种容器,可以把多个对象(实际上是对象的引用,但习惯上都称对象)“丢进” 该容器中。
(java中的容器也叫集合,是专门用来管理对象的对象。)个人见解
1、java容器都有哪些?
数组长度限制为: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:是键值对保存对象,每一个元素包含一个键对象和值对象。
4、HashMap 和 Hashtable 有什么区别?
### 1、Map和Collection的区别
Collection是一组对立的元素,这些元素都服从某种规则(list是存储单列数据的集合,有序且允许重复;set则是无序,不允许重复),Collection的每个位置只能保留一个素。
Map是存储键和值这样的双列数据集合,但存储的数据是没有顺序的,其键不能重复,但值是可以重复的,可以通过每一个键找到每一个对应的值;
### 2、HashMap和HashTable主要区别
首先Map是一个接口,HashMap和HashTable是都实现了Map接口的类。实际上HashMap是HashTable轻量级实现(非线程安全的实现)。
1、HashMap和ArrayList都是线程不同步的,即线程不安全,但只有一个线程访问是效率较高;
HashMap实现线程同步需要使用下面语句:Map m = Collections.synchronizeMap(hashMap);
HashTable 和Vector都是线程同步,即多线程安全,但相比于上面的访问效率较低;
2、HashMap与HashTable的关键区别在下表中列出:
类 | 父类 | 是否线程同步 | KV值可否为空 |
---|---|---|---|
HashMap | AbstractMap | 否 | 是 |
HashTable | Dictionary | 是(即线程安全) | 否 |
3、HashTable使用Enumberation遍历,HashMap使用iterator遍历;
Enumberation简单示例:
public class TestEnumeration{
public static void main(String[] args){
Vector v = new Vector();
v.addElement("Lisa");
v.addElement("Billy");
v.addElement("Mr Brown");
Enumeration e = v.elements();//返回Enumeration对象
while(e.hasMoreElements()){
String value = (String)e.nextElement();//调用nextElement方法获得元素
System.out.print(value);
}
}
}
Iterator示例:
List list = new ArrayList<>();
list.add(1);
list.add(2);
//方法一:
for (Iterator i =list.iterator(); i.hasNext();) {
int str = (int) i.next();
System.out.print(str);
}
//方法二:
Iterator it = list.iterator();
while (it.hasNext()) {
int str = (int) it.next();
System.out.print(str);
}
4、HashTable直接使用对象的HashCode,而HashMap重新计算hash值。
5、如何决定使用HashMap还是TreeMap
TreeMap<k,V>的Key值是要求实现java.lang.Comparable,所以迭代的时候TreeMap默认按照Key值升序排列的;TreeMap的实现也是基于红黑树结构的。
HashMap<K,V>的Key值实现散列hashCode(),分布式散列的均匀的,不支持排序,数据结构主要是桶(数组),链表或红黑树。
所以,查询的时候使用HashMap,增加、快速创建的时候使用TreeMap.
6、说一下hahsMap的实现原理?
1、HashMap是基于hash(哈希表)实现Map接口
2、非同步实现,即线程不安全,要实现安全需要使用:Map m = Collections.sysnchronizeMap(hashMap);
3、储存的是键值对
4、允许使用null键和null值
5、存储结构是:数组 + 链表,jdk1.8后是:数组 + 链表/红黑树(hashMap的链表数量如果超过8个,自动转成红黑树)
7、说一下HashSet的实现原理
1、HahsSet底层有HashMap实现
2、HashSet的值放于HashMap的key上
3、HashMap的value统一为persent
8、ArrayList和LinkedList的区别是什么?
1、ArrayList底层的数据结构是数组,支持随机访问。
2、linkedList底层数据结构是双向循环链表,不支持随机访问。
9、如何实现数组和List之间的转换?
1、list转换成数组:toArray()方法。
2、数组转换成list:asList()方法。
10、ArrayList和Vector的区别是什么?
1、ArrayList是非同步,Vector是同步的。
2、ArrayList比Vector块获取元素快,Vetor添加元素快。
3、ArrayList更加通用,因为可以使用Collections工具类轻易实现同步列表和只读列表。
11、Array和ArrayList有和区别?
1、Array可以容纳基本类型和对象,ArrayList只能容纳对象。、
2、Array大小固定,ArrayList大小可变。
3、Array的功能比ArrayList少。addAll(),removeAll()。
12、Queue中poll()和remove()有什么区别?
Queue接口与List、Set同一级别:都是继承了Collection接口。
poll()和remove()都是从队列中去一个元素。
poll()在获取元素失败的时候会返回空,remove()失败的时候会抛出异常。
13、那些集合类是线程安全的?
Vector:比ArrayList多个了同步化机制(线程安全)
Hashtable:比HashMap多个线程安全
statck:堆栈类,先进后出
14、迭代器Iterator是什么?
迭代器是一种设计模式,他是一个对象,可以遍历并选择序列中的对象。
15、Iterator怎么使用?有什么特点?
java中Iterator功能简单,并且只能单向移动。
1、next()获得下一个元素。
2、hashNext()检查是否还有元素。
3、remove()将迭代器新返回元素删除。
4、Iterator()要求容器返回一个Iterator。
16、Iterator和ListIterator有什么区别?
1、Iterator可用来遍历Set和List集合,但ListIterator只能用来遍历List。
2、Iterator只能向前遍历,ListIterator可以向前或向后。
3、ListIterator实现了Iterator接口
三、线程
同步:发送一个指令需要等待返回才能发送下一条(完成一件事才能做下一件)。
异步:发送一个请求不需要等待返回,随时可以再发下一条(一次进行多个事件)
线程不安全根本原因是异步,对一个资源多个线程同时操作。
1、什么是线程安全和线程不安全?
压力测试或并发测试,会经常遇到此问题。
举例:假设售票系统有100张票,若线程不安全,A和B同时买了一张票后显示还有999张票,这是错的,应该只有998张票。
线程安全:
安全指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结构都一样。
线程不安全:
指不提供加锁机制保护,有可能会出现多个线程先后更改数据造成所得的数据是脏数据。
2、引起线程安全问题的原因:
1、线程安全问题都是有全局变量及静态变量引起的。
若每个线程中全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的。
若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
2、解决多线程并发访问资源安全问题的方法:
(1)synchronize(只给一个线程执行,完成后才到下一个线程)
用来控制线程同步,保证我们的线程在多线程环境下,不被多个线程同时执行,确保数据完整性。使用方法加在方法上。
(2)lock
lock的引入让锁有了可操作性,是指我们在需要的时候手动获取锁和释放锁。
java面试:java基础、Io、容器的更多相关文章
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- java面试| 精选基础题(2)
关注微信公众号"java从心",置顶公众号 每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 继续挖掘一些有趣的基础面试题,有错望指出来哈,请赐教~ 1.包装类的装箱与拆 ...
- java面试| 精选基础题(3)
每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 系列文章 java面试| 精选基础题(1) java面试|精选基础题(2) 1.float f=3.4;是否正确? 答:不正确,编译无法通过 ...
- JAVA面试-java虚拟机
1.JVM简析: 作为一名Java使用者,掌握JVM的体系结构也是很有必要的. 说起Java,我们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Ja ...
- java面试02——基础
1. JDK . JRE 和JVM有什么区别? JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境. JRE:Java Runtim ...
- Java面试专题-基础篇(1)
- java面试系列<4>——IO
面试系列--javaIO 一.概述 java的IO主要分为以下几类: 磁盘操作:File 字节操作:InputStream 和 OutputStream 字符操作:Reader 和 Writer 对象 ...
- java面试核心基础(1)
1.以下代码的执行结果 String s1 = "helloworld"; String s2 = "hello" + new Stirng("wor ...
- Java面试准备之IO
Java IO Java IO 分类 Java BIO: 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线 ...
- Java面试准备基础篇_11.24
Java类加载机制 Java内存模型JMM 为什么 Redis 单线程能支撑高并发? 高并发下的接口幂等性解决方案! 面试官问:平常你是怎么对 Java 服务进行调优的? JAVA虚拟机(JVM)六: ...
随机推荐
- js静态成员和实例成员
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 虚拟机与Docker
https://www.cnblogs.com/kex1n/p/6933039.html https://blog.csdn.net/jingzhunbiancheng/article/details ...
- cell重用
少数几个cell可不重用 NSString *CellIdentifier = [NSString stringWithFormat:@"MyCellID_%d",indexPat ...
- serverless入门介绍
1.什么是serverless Serverless 架构作为一种新型的云计算范式,是云原生时代一种革命性的架构,颠覆了传统意义上对软件应用部署和运营的认识.本节对 Serverless 架构的基本概 ...
- [翻译]Introduction to JSON Web Tokens
JWT: Json Web Tokens JWT是一种开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于将各方之间的信息安全地传输为JSON对象.因为它是经过数字签名的,所以该信息可以进 ...
- appium填坑
首次使用appium web driver,不说搭建环境的麻烦,初次写完一个操作计算器的程序,但是运行一直报错:selenium.common.exceptions.WebDriverExceptio ...
- 人工智能——CNN卷积神经网络项目之猫狗分类
首先先导入所需要的库 import sys from matplotlib import pyplot from tensorflow.keras.utils import to_categorica ...
- PHP实习生面试准备的建议
你好,是我琉忆.PHP程序员面试笔试图书系列作者. 今天就跟大家聊聊作为一个PHP程序员,每年的跳槽季都应该怎么准备一番. 其实普遍的跳槽季总的就有2个. 分别是新年后的3-4月,还有9-10月份. ...
- 小程序"errcode":41002错误问题如何解决?
我的问题是:小程序在本地测试的时候是没有问题的,但是当我扫开发者中的项目中的二维码手机浏览测试的时候发现是没有数据的,然后调试工具中出现: {"errcode":41002,&qu ...
- .Net Core Aop之IResourceFilter
一.简介 在.net core 中Filter分为一下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...