邯郸住房和城乡建设局网站,wordpress 淘宝优惠券,抚州市住房和城乡建设局网站,湖北手机版建站系统信息一、java基础面试题 第四天
1. String 为什么不可变#xff1f;
**不可变对象#xff1a;**不可变对象在java中就是被final修饰的类就称为不可变对象#xff0c;具体含义是#xff0c;不可变对象一但被赋值以后#xff0c;他的引用地址就不能被修改#xff08;它的属性…一、java基础面试题 第四天
1. String 为什么不可变
**不可变对象**不可变对象在java中就是被final修饰的类就称为不可变对象具体含义是不可变对象一但被赋值以后他的引用地址就不能被修改它的属性的值可以被修改
不可变原因
线程安全。同一个字符串实例可以被多个线程共享因为字符串不可变本身就是线程安全的。
支持hash映射和缓存。因为String的hash值经常会使用到比如作为 Map 的键不可变的特性使得 hash 值也不会变不需要重新计算。
出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以String类型保存假若String不是固定不变的将会引起各种安全隐患。比如将密码用String的类型保存那么它将一直留在内存中直到垃圾收集器把它清除。假如String类不是固定不变的那么这个密码可能会被改变导致出现安全隐患。
字符串常量池优化。String对象创建之后会缓存到字符串常量池中下次需要创建同样的对象时可以直接返回缓存的引用
2.为何JDK9要将String的底层实现由char[]改成byte[]?
这样能节省内存
在java的存放堆内存中存放最多的就是字符串大部分的字符串编码类型为拉丁字符拉丁字符只占1个字节
在Java中char类型占两个字节这样就极大的浪费Java中堆内存所以JDK9将String的底层实现由char[]改成byte[]
3.String, StringBuffer 和 StringBuilder区别 String类是不可变字符串他是不可以进行修改的而 StringBuffer和StringBuilder为可变字符串 StringBuffer实在1.5之前出的StringBuilder实在1.5之后出的StringBuffer 和StringBuilder 区别在于StringBuffer方法都加同步锁所以在单线程情况下StringBuilder效率要比StringBuffer 效率要高
4.什么是StringJoiner?
StringJoiner是Java 8新增的一个API他是基于StringBuilder实现用于实现对字符串之间通过分隔符拼接的场景。
StringJoiner sj new StringJoiner(间隔符号);
//创建一个StringJoiner对象指定拼接时的间隔符号
间隔符号为“---”
1---2---3StringJoiner sj new StringJoiner(间隔符号,开始符号,结束符号);
//创建一个StringJoiner对象指定拼接时的间隔符号、开始符号、结束符号
间隔符号为“---” 开始符号“[” 结束符号“]”
[1---2---3]5.String 类的常用方法有哪些
indexOf()返回指定字符的索引。charAt()返回指定索引处的字符。replace()字符串替换。trim()去除字符串两端空白。split()分割字符串返回一个分割后的字符串数组。getBytes()返回字符串的 byte 类型数组。length()返回字符串长度。toLowerCase()将字符串转成小写字母。toUpperCase()将字符串转成大写字符。substring()截取字符串。equals()字符串比较。
6.new String(“dabin”)会创建几个对象
会创建两个对象
dabin会在字符运行常量中生产一份
在堆中生成一份字符串对象
7.什么是字符串常量池
字符串常量池在java用于保存在编译期已确定的已编译的class文件中的一份数据。它包括了关于类方法接口等中的常量也包括字符串常量如String s java这种申明方式当然也可扩充执行器产生的常量也会放入常量池故认为常量池是JVM的一块特殊的内存空间。