文章目录
- Java常见API面试题
-
-
- 自动装箱与拆箱
- 包装类型的常量池技术了解么?
- Integer a= 127 与 Integer b = 127相等吗
- String的创建机理是什么?什么是字符串常量池?
- String 是最基本的数据类型吗
- String s = new String(“abc”);创建了几个字符串对象
- String为什么是不可变的吗?是否可以继承 String 类
- 在使用 HashMap 的时候,用 String 做 key 有什么好处?
- String str="i"与 String str=new String(“i”)一样吗?
- String 类的常用方法都有那些?
- String和StringBuffer、StringBuilder的区别是什么?
- 字符型常量和字符串常量的区别?
- java 中 IO 流分为几种?
- 对象序列化流
- BIO,NIO,AIO 有什么区别?
-
Java常见API面试题
自动装箱与拆箱
装箱:将基本类型用它们对应的引用类型包装起来;原理:Integer.valueOf() 方法
拆箱:将包装类型转换为基本数据类型;原理:Integer.intValue() 方法
Java 为每个原始类型提供了包装类型:
原始类型: boolean,char,byte,short,int,long,float,double
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
包装类型的常量池技术了解么?
Java 基本类型的包装类的大部分都实现了常量池技术。
,,, 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 创建了数值在 [0,127] 范围的缓存数据, 直接返回 or 。
Integer a= 127 与 Integer b = 127相等吗
如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 a1==b1的结果是false
讯享网String的创建机理是什么?什么是字符串常量池?
- 创建机理:由于String在Java世界中使用过于频繁,为了提高内存的使用率,避免开辟多块空间存储相同的字符串,引入了字符串常量池(字符串常量池位于堆内存中)
- 运行机制:在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用
String 是最基本的数据类型吗
不是。Java 中的基本数据类型只有 8 个,除了基本类型,剩下的都是引用类型基本数据
类型中用来描述文本数据的是 char,但是它只能表示单个字符,如果要描述一段文本,就需要使用 char 类型数组,但是使用数组过于麻烦,所以就有了 String,String 底层就是一个 char java基础api题 类型的数组,只是使用的时候开发者不需要直接操作底层数组,使用更加简便
String s = new String(“abc”);创建了几个字符串对象
当JVM遇到上述代码时,会先检索常量池中是否存在“abc”,如果不存在“abc”这个字符串,则会先在常量池中创建这个字符串。然后再执行new操作,在堆内存中创建一个String对象,对象的引用赋值给s。此过程创建了2个对象。
当然,如果检索常量池时发现已经存在了对应的字符串,那么只会在堆内创建一个新的String对象,此过程只创建了1个对象。
String为什么是不可变的吗?是否可以继承 String 类
final修饰的String类,代表了String类的不可被继承,final修饰的char[]代表了被存储的数据不可更改被创建,是无法修改的,即便你在后面拼接一些其他字符,也会把新生成的字符串存到另外一个地址但是,虽然final代表了不可变,但仅仅是引用地址不可变,并不代表了数组本身不会变。
在使用 HashMap 的时候,用 String 做 key 有什么好处?
因为字符串是不可变的,所以当创建字符串时,它的 hashcode 被缓存下来,不需要再次计算,所以相比于其他对象更快。

String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
String 类的常用方法都有那些?
讯享网
String和StringBuffer、StringBuilder的区别是什么?
- 可变性:
String类中使用字符数组保存字符串,,所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,,这两种对象都是可变的。
- 线程安全性:
String中的对象是不可变的,也就可以理解为常量,线程安全。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
- 性能:
每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象
StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StirngBuilder 相比使用StringBuffer 仅能获得10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结:
1、在字符串内容不经常发生变化的业务场景,优先使用String类,例如常量声明、少量的字符串拼接操作等。
2、在单线程环境下,频繁地进行字符串的操作,建议使用StringBuilder,例如SQL语句拼装、JSON封装等
3、在多线程环境下,频繁地进行字符串的操作,建议使用StringBuffer,例如XML解析、HTTP参数解析与封装
字符型常量和字符串常量的区别?
形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符
含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)
占内存大小 : 字符常量只占 2 个字节; 字符串常量占若干个字节 (注意: 在 Java 中占两个字节
java 中 IO 流分为几种?
对象序列化流
讯享网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/5313.html