Java-String

Q1:String类两种对象实例化方式的区别
  1. 直接赋值:只开辟一块堆内存空间,字符串的内容可以自动入池,供下次使用。
  2. 构造方法:开辟两块堆内存空间,有一块将成为垃圾,不能自动入池,可通过intern()手工入池。
Q2:为社么Char数组比String更适合存密码

A2:因为字符串存储于Java常量池和弹簧池中,直到垃圾回收为止。同时由于字符串一旦创建就不能改变其内容,因此恶意程序可以访问物理内存中的该字符串,存在泄漏的风险。但是Char数组可变,它的内容在使用后可以被覆盖,因此在使用char[]存储密码,使用后通过空白替换数组内容。

Q3:String,StringBuilder,StringBuffer区别
  1. String表示一系列字符,它的实例是不可变的。使用+进行字符串连接时会产生大量副本的字符串对象残留内存,影响程序性能。
  2. StringBuilder和StringBuffer很相似,代表可变的字符序列。
  3. StringBuffer:效率低,线程安全。多线程字符串缓冲区下操作
  4. StringBuilder:效率高,线程不安全。单线程字符串缓冲区下操作

String常用方法

  • int length(),获取字符串长度。a.length()
  • char charAt(index),获取指定index的字符
  • char toCharArray(),将字符串变为一个字符数组
  • int indexOf(“a”),获取字符a的位置,或-1
  • int lastIndexOf(“a”, [fromIndex]),(从哪儿开始找),获取字符a最后一次出现的索引
  • toUpperCase() / toLowerCase(),字符串大小写转换
  • String [] split(“:”),按照:拆分字符串,返回拆分后得到的数组
  • boolean equals(a, b),检查字符串ab内容是否一样(地址值相等使用==)
  • boolean equalsIgnoreCase(a, b),忽略大小写比较ab内容是否一样
  • trim(),去掉字符串左右空格
  • replace(old char, new char),替换单个字符
  • replaceAll(s1, s2),按照字符串替换
  • replaceFirst(s1, s2),将第一次出现的内容替换
  • substring(beginIndex, endIndex),截取字符串,返回子串
  • boolean contains(s1),判断字符串是否包含s1,返回true/false
  • boolean startsWith(s1),判断字符串是否以指定前缀开始
  • boolean endsWith(s1),判断是否以指定后缀结束
  • append(),连接字符串。new StringBuffer().append(‘a’).append(‘b’) // ab