基础面试题

每日面试题总结 day03_反射机制

1、 java 中 IO 流分为几种?

  • 按照流的流向分,可以分为输入流和输出流;
  • 按照操作单元划分,可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流。
  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

每日面试题总结 day03_反射机制_02

2、BIO,NIO,AIO 有什么区别?

  • BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方
    便,并发处理能力低。
  • NIO:Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)
    通讯,实现了多路复用。
  • AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操
    作基于事件和回调机制。

3、什么是反射机制?

  • java反射机制是在运行状态中,能够动态获取类的属性和方法,能通过一个对象调用它的方法的
    过程称为java的反射机制。
  • 静态编译和动态编译
    • 静态编译:在编译时确定类型,绑定对象
    • 动态编译:运行时确定类型,绑定对象

4、反射机制优

优点:运行期类型的判断,动态的加载类,提高代码的灵活性

缺点:性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码要慢的多

5、反射机制的应用场景有哪些?

  • 反射是框架设计的灵魂。

  • 在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有
    用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

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

6、字符型常量和字符串常量的区别?

1、形式上:字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
2、含以上:字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
3、占内存大小 字符常量只占一个字节 字符串常量占若干个字节(至少一个字符结束标志)

7、什么是字符串常量池?

  • 字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。

8、 String有哪些特征?

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

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

  • 不一样,因为内存的分配方式不一样,String str='i' 的方式,java虚拟机会将其分配到常量池中,而String s=new String("i") 则会创建两个对象一个放在常量池,一个被分配到堆内存中。

10、String 类的常用方法都有哪些?

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