一、String
1、String是不可变类,一但被始化,就不能再被改变了,如果被修改,将会是新的类。
2、相等判断:
equals 和 equalsIgnoreCase。后者判断相等时,会忽略大小写。
3、替换、删除:
可以使用 replace(要替换的值,要被替换成的值) 方法 。删除就是把字符替换成空就可以达到删除的效果了
4、拆分和合并:
拆分我们使用的是splist(拆分的标准字符,限制要拆分几个元素)方法 ; 合并我们使用是的
join(合并的分隔符,合并的数据源)方法。
String a = " , a, , , b,";String[] split = a.split(",");System.out.println(Arrays.toString(split));结果:[, a, , , b,]List<String> list = Splitter.on(",").trimResults().omitEmptyStrings().splitToList(a);log.info("Guava 去掉空格的分割方法:{}",JSON.toJSONString(list));结果:[a,b]这个结果也是[a,b]System.out.println(Arrays.stream(a.split(",")).filter(t->!t.equals(" ")).collect(Collectors.toList()));//合并 一次多个字符连接Joiner joiner = Joiner.on(",").skipNulls();String result = joiner.join("hello",null,"china");System.out.println(result);//自动删除 list 中空值List<String> list = Lists.newArrayList(new String[]{"hello","china",null});
二、Long
1、Long缓存
Long自己实现了一种缓存机制, 缓存了从-128到127内的所有Long值,如果在这个范围内,Long值就不会初始化。而是从缓存中拿。缓存初始化源码如下:
private static class LongCache {private LongCache(){}// 缓存,范围从 -128 到 127,+1 是因为有个 0static final Long cache[] = new Long[-(-128) + 127 + 1];// 容器初始化时,进行加载static {// 缓存 Long 值,注意这里是 i - 128 ,所以再拿的时候就需要 + 128for(int i = 0; i < cache.length; i++)cache[i] = new Long(i - 128);}}
面试问题:
一、为什么使用Long时,大家推荐多使用valueOf方法, 少使用parseLong方法
答:因为Long本身有缓存机制,缓存了-128到127范围的Long,valueOf方法会从缓存中去拿值,如果命中缓存,会减少资源开销,而parseLong没有这个机制
二、如何解决String乱码的问题
答:乱码问题主要的根源就两个:一字符不支持复杂汉字、二是二进制进行转化时字符集不匹配
解决方案:在可以指定字符集的地方强制指定字符集:比如new String 和getBytes这两个地方;或是使用Utf-8编码
三、为什么大家说String是不可变的
答:主要是因为String和保存数据的Char数组,都被final关键字所修饰了,所以是不可变的
