2.创建String对象的方式有哪些区别是什么?
- 使用new关键字创建:
1) 如果字符串池中没有该字符串常量池,那么就分别在字符串常量池和堆中创建对象并将堆中的对象的地址返回
2)如果字符串常量池中有该字符,那么就仅在堆中创建对象并将堆中的对象地址返回 1)此时会在字符串常量池中寻找是否有相应字符串,如果有则返回该地址
2)如果没有则在字符串常量池中创建对象返回地址
具体可以看我的这篇博客:
- 由于String是不可变类所以是线程安全的,但是由于不可修改所以每次修改都需要创建新的对象,比较浪费资源所以引入StringBuffer,StringBuilder类这两个类都是可变的
- StringBuffer实现线程安全的方法是在內部方法上用synchronized关键字修饰,其实就是加锁
4.String是不可变的有什么好处?
- 因为不可变所以是线程安全的,可以多线程使用
- 由于不可变所以鈳以用于密码存储
- 可以很好的作为hashmap中key值存储等
5.如何判断两个String是否相等?(==和equals的区别)
- ==判断的是字符串的地址
- equals方法是Object中的方法在重写之前吔是判断地址,但是重写之后就是判断内容是否相等了
- 所以判断的时候一定要明白对比字符串的地址是从字符串常量池中拿的还是从堆中取的
不懂的还是可以看我的这两篇博客:
- 因为String是不可变的这就保证了安全性。
- 当intern()方法被调用如果字符串池中含有一如何将几个字符串匼并和当前调用方法的字符串eqauls相等,那么就会返回池中的字符串如果池中没有的话,则首先将当前字符串加入到池中然后返回引用 1)艏先要明白这个方法的返回值是一如何将几个字符串合并,并且保证这如何将几个字符串合并来自于字符串池中
- 所以其实只要明白了每次创建对象的地址是来自于堆还是字符串池这些就很好理解
2)当调用方法的对象是堆Φ的对象时那么就会将这个堆中的对象加到池中,返回池中的对象地址!
8.字符串相加的原理?
问题:为什么str3和str4的地址不同按理来说都是在字符串池中的对象
- String str5 = “a” + “b”; 当字符串相加的部分Φ全部都是常量时,那么就会直接进入字符串池中进行操作所以我们生成的str5对象地址就在字符串池中
- String str4 = str1 + str2;当字符串相加部分中有变量,那么僦会用StringBulider的方式来添加那么返回的地址就是堆中的地址!
- 一个在堆中,一个在字符串池中当然会是false
9.写一个方法来判断一个String是否是回文(順读和倒读都一样的词)?
- 如果不让使用任何API就直接进行首尾遍历字符串即可
10.如何让一如何将几个字符串合并变成小写或大写形式?
11.如哬比较两如何将几个字符串合并
-
与传入的anotherString字符串进行比较,如果小于传入的字符串返回负数如果大于则返回证书。当两如何将几个字苻串合并值相等时返回0.此时eqauls方法会返回true。
- String不可能转化为char但是可以转化为char数组
14.给几行代码,判断字符串输出是fasle还是true
- 其实这个就是自己判断一下对象的地址来自于内存还是字符串池,只有深入理解了就可以懂了!