一、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 是因为有个 0
static final Long cache[] = new Long[-(-128) + 127 + 1];
// 容器初始化时,进行加载
static {
// 缓存 Long 值,注意这里是 i - 128 ,所以再拿的时候就需要 + 128
for(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关键字所修饰了,所以是不可变的