1.replace和replaceAll
大部分情况下,两者的作用几乎是等效的。当你想替换一个掉一个子字符串时,两者的作用等效。但是还是要注意他们2者的区别:
replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
replaceAll的参数是regex,即基于规则表达式的替换,比如:可以通过replaceAll("\\d", "*")把一个字符串所有的数字字符都换成星号;
相同点:都是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或字符串;
不同点:replaceAll支持正则表达式,因此会对参数进行解析(两个参数均是),如replaceAll("\\d", "*"),而replace则不会,replace("\\d","*")就是替换"\\d"的字符串,而不会解析为正则。
如下面例子:
String str = "普通异常,#测试(指数>23 && 指数<50)#,测试吧";
String substr = "#测试(指数>23 && 指数<50)#";
str = str.replaceAll(substr, "");
是无效的,无法把substr给去掉。需要用str.replace(substr, "");才行。因为此时substr是一个非典型的字符串,replaceAll作用时,会对substr参数解析。所以在比较复杂的子字符串时,最好用replace而不是replaceAll。
2.redis的模糊匹配有时候需注意的一个小细节
众所周知,我们可以使用模糊匹配过滤出满足条件的key集合。返回的是一个Set集合。
假如有一个过滤条件: name, 我们需要这样过滤:时间 + name + "*"
但是假如你的name有2个命名如下:financing, financingmanager。 如当你匹配第一个时,redis会由于*通配符把第二个name也匹配出来,造成数据错误。
即当过滤条件的命名存在父子字符串的情形时~~~
解决办法:不妨在name之后加一个固定的字符串如:时间 + name + "{ALL}*"作为存入redis中的key,这样我们必须在过滤的时候在name加上一个固定的{ALL}字符串。这时候【 时间 + financing + "{ALL}* " 】和 【时间 + financingmanager + "{ALL}* " 】是完全可以区分开来的。
3.观察下面的代码:
try{
String a = null;
System.out.println(a.length());
} catch(Exception e) {
e.printStackTrace();
}
String str = "希望";
System.out.println(str + "长度:" + str.length());
运行之后,打印结果为:
java.lang.NullPointerException
at com.bcs.amp.core.quartz.alram.Test.main(Test.java:17)
希望长度:2
而如果你第一个地方不try..catch的话:
String a = null;
System.out.println(a.length());
String str = "希望";
System.out.println(str + "长度:" + str.length());
毫无疑问,是走不到第二步的:
Exception in thread "main" java.lang.NullPointerException
at com.bcs.amp.core.quartz.alram.Test.main(Test.java:17)
这个小例子表明,如果你一段代码有可能发生异常,而你又不想影响后面代码的执行,可以将它try catch,
如果你不try catch,它后面的代码将直接被中断执行。
4.如果频繁向db里插入数据,可以使用redis来进行改善。解决办法是把数据缓存在redis中并保存一段时间,然后用定时任务把一段时间的数据过滤出来,成为一个集合,再批量入库。这样可以大大减少与DB的IO交互,提升效率。
5.不能一边用遍历一边删除集合中满足条件的元素,否则会报异常:如
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("ok");
list.add("man");
list.add("like");
list.add("you");
list.add("meng");
list.add("uu");
System.out.println(list);
for(String str : list) {
if("ok".equals(iterator.next()))
list.remove(str);
}
System.out.println(list);
}
运行之后出现如下异常:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
如果想要遍历删除,需要用到集合的迭代器~
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
if("ok".equals(iterator.next()))
iterator.remove();
}