侧边栏壁纸
博主头像
Zhangsnke博主等级

这是Zhangxike的平凡生活!

  • 累计撰写 16 篇文章
  • 累计创建 11 个标签
  • 累计收到 15 条评论

目 录CONTENT

文章目录

Java基础知识(四)

Zhangsnke
2021-06-26 / 0 评论 / 0 点赞 / 465 阅读 / 4,215 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-07-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. Java中IO流分为几种?

按照流的流向分:
输入流输出流

按照操作单元划分:
字节流字符流

按照流的角色划分:
节点流处理流

  • InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。
  • Java IO.png

2. BIO, NIO, AIO有什么区别

  • BIO(Blocking I/O):
    同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(单机小于1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的I/O,并且编程模型简单。也不用考虑系统的过载,限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接请求。但是,当面对十万甚至百万级连接的时候,传统的BIO模型是无能为力的。因此需要一种高效的I/O处理模型来应对更高的并发量。

  • NIO(New I/O):
    同步非阻塞的I/O模型,在Java1.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 也就是 NIO2。在 Java7 中引入 NIO 的改进版 NIO2,他是异步非阻塞的I/O模型。异步IO 是基于事件和回调机制实现的。也就是应用操作之后会直接返回,不会阻塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。AIO 是异步IO的缩写,虽然 NIO 在网络操作中,提供了非阻塞的方法,但是 NIO 的 IO 行为还是同步的。对于 NIO 来说,很多业务线程在 IO 操作准备好时,得到通知,接着就由这个线程自行进行 IO 操作,IO操作本身就是同步的。AIO应用目前不广泛,目前Windows支持,Linux貌似不支持,Netty之前也想尝试
    AIO ,后面放弃了。

3. Files的常用方法都有哪些?

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

4. 什么是反射机制?

Java反射机制是在 运行状态中,对于任意一个类,都能获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能被称为 Java语言的反射机制

  • 静态编译: 在编译时确定类型,绑定对象
  • 动态编译: 在运行时确定类型,绑定对象

5. 反射机制优缺点

  • 优点: 运行期类型的判断,动态加载类,提高代码灵活度
  • 缺点: 性能瓶颈:反射相当于一系列的解释操作,通知JVM要做的事情,性能比直接的 Java代码要慢很多

6.反射机制的应用场景有哪些?

反射就是框架设计的灵魂。
很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有日常使用的 Spring,Mybatis等框架都大量使用了反射机制。

例如:

  1. 在使用JDBC连接数据库时,使用 Class.forName() 通过反射加载数据库的驱动程序
  2. Spring框架也用到很多反射机制,经典的就是 xml 配置模式。Spring 通过 XML 配置模式装载 Bean 的过程。将程序内的所有 XML 或 Properties 配置文件加载到内存中,Java类里面解析 XML 和 Properties 里面的内容,得到对应的实体类的字节码字符串以及相关的属性信息。使用反射机制,根据这个字符串获得某个类的Class实例,动态配置实例的属性。

7. Java获取反射的三种方式

  1. 通过 new 对象实例反射机制
  2. 通过全限定路径名实现反射机制
  3. 通过类名实现反射机制
public class Person{
  private int id;
  private String name;
  private String sex;
}

public class Get{

    public static void main(String[] args) throws ClassNotFoundException{
        //方式一:通过建立对象
        Person p = new Person();
        Class clazzObject1 = p.getClass();

        //方式二:通过全限定路径名获取
        Class clazzObject2 = Class.forName("zxk.Person");
        
        //方式三:通过类名实现
        Class clazzObject3 = Person.class;
 
    }
}

8. 深度了解String

String 底层是一个 char 类型的数组。

String有哪些特性?

  • 不变性: String是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向这个对象。不变模式的主要作用当一个对象需要被多线程共享并且频繁访问时,可以保证数据的一致性。
  • 常量池优化: String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
  • final: 使用final 来定义String类,表示String类不能被继承,提高了系统的安全性。

String为什么是不可变的?

简单来说,String 利用 final 修饰类,并且用 final 修饰了 char 类型数存储字符串。image.png

String是真的不可变吗?

一般回答不可变即可,但是有一些特殊场景:

  1. String不可变,但是不代表引用不可变
    String str = "hello";
    str = str + " word";
    System.out.print(str);	

结果是 str = "hello world";
实际上,原来String的内容是不变的,只是 str 由原来指向“hello”的内存地址转变为执行“hello world"的内存地址而已,也就是说开辟了一块内存区域给 "hello world"

  1. 通过反射时可以修改所谓的“不可变”
    image.png

数组没有 length() 方法,为什么 String 有 length() 方法

数组没有 length() 方法,有 length 属性。String 有 length() 方法。

image.png

String 类常用方法有哪些?

  • indexOf():返回指定字符的索引位置
  • charAt():返回指定索引处的字符
  • replace():字符串替换
  • trim():去除字符串两端空白
  • split():分割字符串,返回一个分割后的字符串数组
  • getBytes():返回字符串的 byte 类型数组
  • length():返回字符串的长度
  • toLowerCase():将字符串转换成小写
  • toUpperCase():将字符串转换成大写
  • substring():截取字符串
  • equals():字符串比较

在使用 HashMap 的时候,用 String 做 key 有什么好处?

HashMap 内部实现是通过 key 的 hashcode 来确定 value 的存储位置。因为字符串是不可变的,所以当创建字符串的时候,它的 hashcode 被缓存下来,不需要再次计算,相比较其他对象更快。

0

评论区