Java 字符串

1 面试题:String str1 = 'A'String str2 = new String("A")区别?

String str1 = 'A'内存会去查找永久代(常量池) ,如果没有的话,在永久代中中开辟一块儿内存空间,把地址付给栈指针,如果已经有了"ABC"的内存,直接把地址赋给栈指针;
(a) ==的判断, (b) equals()的判断:都相等,因为他们的地址都相等,因此只在常量池中有一份内存空间,地址全部相同;

String str = new String("a");是根据"a"这个String对象再次构造一个String对象;在堆中从新new一块儿内存,把指针赋给栈,将新构造出来的String对象的引用赋给str。 因此 只要是new String(),则,栈中的地址都是指向最新的new出来的堆中的地址,
(a)“”==“” 是判断地址的,当然不相同;
(b)至于equals,String类型重写了 equals()方法,判断值是否相等,明显相等,因此 equals 是相等的;

String a = "abc";
String b = "abc";
//a==b 的结果是true
//String常量存放在常量池中,Java虚拟出于优化的考虑,会让内容一致的对象共享内存块。

String b1 = new String("abc")
//b==b1 false 常量池和堆空间 不可能一致
String b2 = new String("abc")    
//b1==b2 false 内存地址不相同

2 面试题:String 的“不可变性”

46c03ae5abf6111879423f38375207cc_hd.jpg

一旦一个 String 对象在内存(堆)中被创建出来,它就无法被修改(因为 String 类的所有成员变量都是 private,并且没有提供 public 的 set 方法来修改这些值。此外成员变量都是 final 的,这就意味着一旦初始化就无法修改)。特别要注意的是,String 类的所有方法都没有改变字符串本身的值,都是返回了一个新的对象

3 String使用注意事项

  • String a = "123";定义的是常量,String b1 = new String("123");定义的是变量。尽量使用常量
  • 如果需要一个可修改的字符串,应该使用 StringBuffer 或者 StringBuilder。否则会有大量时间浪费在垃圾回收上,因为每次试图修改都有新的 String 对象被创建出来。
  • 如果修改要采用s=s.replace('1','2');

通过System.out.prinln()输出是会默认调用toString方法,如果自定义类,可以重写。

4 面试题:String, StringBuilder, StringBuffer 区别

  • String 声明的是不可变的对象,每次操作都会生成新的对象,然后将指针指向新的对象

  • StringBuilder,StringBuffer可以在原有对象上修改,StringBuider为非线程安全,性能好

5 String的 + 操作符

编译器创建了一个 StringBuilder 对象,用于构建最终的 String,并对每个字符串调用了一次 append() 方法,最后调用toString() 生成结果,并存为 s

当你为一个类编写 toString() 方法时,如果字符串操作比较简单,那就可以信赖编译器,它会为你合理地构造最终的字符串结果。但是,如果你要在toString()方法中使用循环,且可能有性能问题,那么最好自己创建一个 StringBuilder 对象

6 String的空判断

  • if(str == null || str.equals("")):最多人使用的一个方法, 直观, 方便, 但效率很低;
  • if(str == null || str.length() != 0 ):比较字符串长度, 效率高, 是最好的一个方法;
  • if(str == null || str.isEmpty()):Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二
  • if(str == null || str == “”);:这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多;

7 StringBuffer方法

StringBuffer和StringBuilder在使用上几乎一样

  • StringBuffer append(String s) :将指定的字符串追加到此字符序列
  • StringBuffer reverse(): 将此字符序列用其反转形式取代
  • delete(int start, int end): 移除此序列的子字符串中的字符
  • replace(int start, int end, String str): 使用给定 String 中的字符替换此序列的子字符串中的字符
  • insert(int offset, int i): 将 int 参数的字符串表示形式插入此序列中

8 String方法

  • int length(): 返回此字符串的长度
  • char charAt(int index): 返回指定索引处的字符
  • int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引
  • String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串
  • boolean equals(Object anObject): 将此字符串与指定的对象比较
  • boolean equalsIgnoreCase(String anotherString) :将此 String 与另一个 String 比较,不考虑大小写
  • int compareTo(String anotherString): 按字典顺序比较两个字符串
  • int compareToIgnoreCase(String str) :按字典顺序比较两个字符串,不考虑大小写
  • String concat(String str) :将指定字符串连接到此字符串的结尾
  • String replace(char oldChar, char newChar): 返回一个新的字符串,newChar替换此字符串中出现的所有oldChar
  • String trim(): 返回字符串的副本,忽略前导空白和尾部空白
  • String[] split(String regex) :根据给定正则表达式的匹配拆分此字符串
  • String toUpperCase()/String toLowerCase() :字符串大小写转换
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容