一、String

1、String是不可变类,一但被始化,就不能再被改变了,如果被修改,将会是新的类。

2、相等判断:

equalsequalsIgnoreCase。后者判断相等时,会忽略大小写。

3、替换、删除:

可以使用 replace(要替换的值,要被替换成的值) 方法 。删除就是把字符替换成空就可以达到删除的效果了

4、拆分和合并:

拆分我们使用的是splist(拆分的标准字符,限制要拆分几个元素)方法 ; 合并我们使用是的
join(合并的分隔符,合并的数据源)方法。

  1. String a = " , a, , , b,";
  2. String[] split = a.split(",");
  3. System.out.println(Arrays.toString(split));
  4. 结果:[, a, , , b,]
  5. List<String> list = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(a);
  6. log.info("Guava 去掉空格的分割方法:{}",JSON.toJSONString(list));
  7. 结果:[a,b]
  8. 这个结果也是[a,b]
  9. System.out.println(Arrays.stream(a.split(",")).filter(t->!t.equals(" ")).collect(Collectors.toList()));
  10. //合并 一次多个字符连接
  11. Joiner joiner = Joiner.on(",").skipNulls();
  12. String result = joiner.join("hello",null,"china");
  13. System.out.println(result);
  14. //自动删除 list 中空值
  15. List<String> list = Lists.newArrayList(new String[]{"hello","china",null});

二、Long

1、Long缓存

Long自己实现了一种缓存机制, 缓存了从-128到127内的所有Long值,如果在这个范围内,Long值就不会初始化。而是从缓存中拿。缓存初始化源码如下:

  1. private static class LongCache {
  2. private LongCache(){}
  3. // 缓存,范围从 -128 到 127,+1 是因为有个 0
  4. static final Long cache[] = new Long[-(-128) + 127 + 1];
  5. // 容器初始化时,进行加载
  6. static {
  7. // 缓存 Long 值,注意这里是 i - 128 ,所以再拿的时候就需要 + 128
  8. for(int i = 0; i < cache.length; i++)
  9. cache[i] = new Long(i - 128);
  10. }
  11. }

面试问题:

一、为什么使用Long时,大家推荐多使用valueOf方法, 少使用parseLong方法

答:因为Long本身有缓存机制,缓存了-128到127范围的Long,valueOf方法会从缓存中去拿值,如果命中缓存,会减少资源开销,而parseLong没有这个机制

二、如何解决String乱码的问题

答:乱码问题主要的根源就两个:一字符不支持复杂汉字、二是二进制进行转化时字符集不匹配
解决方案:在可以指定字符集的地方强制指定字符集:比如new String 和getBytes这两个地方;或是使用Utf-8编码

三、为什么大家说String是不可变的

答:主要是因为String和保存数据的Char数组,都被final关键字所修饰了,所以是不可变的