`
Everyday都不同
  • 浏览: 723710 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

【2016-03-29】近期小结

阅读更多

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();

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics