Java面试系列——Java基础(3)

​ 今天继续肝Java面试基础篇,欢迎大家关注公众号”代码与故事“获取更多内容,主要内容预览如下

  1. abstract class和interface的区别。

  2. String类有哪些常用方法。

  3. 谈谈Java中常用的日期时间类。

  4. 介绍一下BIO,NIO,AIO。

abstract class和interface有什么区别?

比较简单的一个问题,主要有三点不同。

  1. abstract class类中的⽅法不必是抽象的,interface必抽象。

  2. 抽象类可以有构造⽅法,接⼝中不能有构造⽅法。

  3. 抽象类中可以有普通成员变量,接⼝中没有普通成员变量,全是static final的

String类有哪些常用方法

比较多,可以参考API,常用方法总结如下,

int length()//返回字符串的长度
char charAt(int index)//返回指定索引处的字符
boolean isEmpty()//判断是否是空字符串
String toLowerCase()//使用默认语言环境,将String中的所有字符转换为小写
String toUpperCase()//使用默认语言环境,将String中的所有字符转换为大写
String trim()//去除字符串前导空白和尾部空白
boolean equals IgnoreCase(String anotherString)//与equals方法类似,忽略大小写
String concat(String str)//拼接字符串,等价于用“+”
int compareTo(String anotherString)//比较两个字符串的大小,按照首字符排序比较,首字符相同比较第二个字符
String substring(int beginIndex)//截取字符串,从beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex,int endIndex)//截取字符串,从beginIndex开始截取到endIndex(不包含)
boolean endsWith(String suffix)//测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix)//测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset)//测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s)//是否包含指定的 char 值序列
int indexOf(String str)//返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex)//返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str)//返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex)//返回指定子字符串在此字符串中最后一次出现处的索引,从指定的
//注:indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar)//返回一个新的字符串,将所有oldChar替换为newChar 替换此
String replace(CharSequence target, CharSequence replacement)//使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement)//使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement)//使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
boolean matches(String regex)//告知此字符串是否匹配给定的正则表达式。
String[] split(String regex)//根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit)//根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
谈谈Java中常用的日期时间类

常用的有六个与日期时间有关的类

  1. java.util.Date

  2. java.sql.Date

  3. java.sql.Time

  4. java.sql.Timestamp

  5. java.text.SimpleDateFormat

  6. java.util.Calendar

    img

java.util.Date

java.util.Date 是java.sql.Date,Time,Timestamp的父类,其表示特定的瞬间,精确到毫秒。是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点。因为Date的设计具有"千年虫"以及"时区"的问题,所以Date中的大部分方法已经不建议使用了。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和分析日期字符串。

//获取当前时间
Date date = new Date();  
System.out.println(date.getTime()); 
java.text.DateFormat(抽象类)

DateFormat 是日期/时间格式化子类的抽象类。其子类(如 SimpleDateFormat)允许进行格式化(日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年1 月 1 日 00:00:00 这一刻开始的毫秒数。 DateFormat的格式化Date的功能有限,没有SimpleDateFormat强大;

java.text.SimpleDateFormat (DateFormat的直接子类)

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstance、getDateInstance 或 getDateTimeInstance 来新的创建日期-时间格式化程序。

常见的转换有两种:

String format(Date d)//将Date格式化为String    
Date   parse(String s)//将String解析为Date    

明明格式如下:

img

//日期转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = calendar.getTime();
String dateStringParse = sdf.format(date
                                    
String dateString = "2017-12-20 14:02:08";  
Date dateParse = sdf.parse(dateString); 
java.util.Calendar(抽象类)

java.util.Calendar 类用于封装日历信息,其主要作用在于其方法可以对时间分量进行运算。

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化。

//获取当前时间
Calendar now = Calendar.getInstance();  

//获取年月周日时分秒
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
Date d1 = df.parse("2021-01-04 12:19:19");  
//指定日期  
Calendar cal = df.getCalendar();  
//当前时间  
Calendar cas = Calendar.getInstance();  
int year = cal.get(Calendar.YEAR);//获取年份  
int month=cal.get(Calendar.MONTH);//获取月份  
int day=cal.get(Calendar.DATE);//获取日  
int hour=cal.get(Calendar.HOUR);//小时  
int minute=cal.get(Calendar.MINUTE);//分  
int second=cal.get(Calendar.SECOND);//秒  
int WeekOfYear = cal.get(Calendar.DAY_OF_WEEK);//一周的第几天  

关于一些更详细的内容各位可以继续查阅API,这里参考了CSDN博主「山河远阔」文章,各位可以参考,原文链接:https://blog.csdn.net/weixin_37539378/article/details/78889992。

介绍一下BIO,NIO,AIO

BIO,NIO,AIO有什么区别

BIO (Blocking I/O): 同步阻塞 I/O 模式,一个请求接对应一个线程,数据的读取写⼊必须阻塞在⼀个线程内等待其完成。在活动连接数不是特别⾼(⼩于单机 1000)的情况下,这种模型是⽐较不错的,可以让每⼀个连接专注于⾃⼰的 I/O 并且编程模型简单,也不⽤过多考虑系统的过载、限流等问题。线程池本身就是⼀个天然的漏⽃,可以缓冲⼀些系统处理不了的连接或请求。但是,当⾯对⼗万甚⾄百万级连接的时候,传统的 BIO 模型是⽆能为⼒的。因此,我们需要⼀种更⾼效的 I/O 处理模型来应对更⾼的并发量。

NIO (Non-blocking/New I/O): NIO 是⼀种同步⾮阻塞的 I/O 模型,一个线程管理多个请求,使用连接多操作短的架构

主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统 IO 基于字节流和字符流进行操作,而 NIO 基于 Channel 和 Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区 中,或者从缓冲区写入到通道中。Selector(选择区)用于监听轮询多个通道的事件(比如:连接打开, 数据到达)。因此,单个线程可以监听多个数据通道。Java NIO 实际上就是多路复用 IO。在多路复用 IO 模型中,会有一个线程不断去轮询多个 socket 的状态,只有当 socket 真正有读写事件时,才真 正调用实际的 IO 读写操作。

image-20210803210155038

Java API实现主要包括 :

  1. FileChannel处理本地文件
  2. SockerChannel,ServerSocketChannel:TCP网络编程中的客户端和服务端Channel
  3. Datagram:UDP网络编程中的Channel

AIO (Asynchronous I/O): AIO 也就是 NIO 2,它是异步⾮阻塞的 IO 模型。异步 IO 是基于事件和回调机制实现的,也就是应⽤操作之后会直接返回,不会堵塞在那⾥,当后台处理完成,操作系统会通知相应的线程进⾏后续的操作。AIO 是异步 IO 的缩写,虽然 NIO 在⽹络操作中,提供了⾮阻塞的⽅法,但是 NIO 的 IO ⾏为还是同步的。对于 NIO 来说,我们的业务线程是在 IO 操作准备好时,得到通知,接着就由这个线程⾃⾏进⾏ IO 操作,IO 操作本身是同步的。查阅⽹上相关资料,我发现就⽬前来说 AIO 的应⽤还不是很⼴泛,Netty 之前也尝试使⽤过 AIO,不过⼜放弃了。

关于NIO的详细讲解后续会出专题文章,敬请期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值