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();
}
相关推荐
Linux运维-运维课程MP4频11-17-03-node相关操作小结.mp4
**WNM2016-3/TR-VB MOSFET详解** WNM2016-3/TR-VB是一款N沟道金属氧化物半导体场效应晶体管(MOSFET),设计用于DC/DC转换器和便携式应用中的负载开关。这款MOSFET具有以下特性: 1. **无卤素**:符合IEC 61249-2-...
### WNM2016-3-TR-VB SOT23封装N-Channel场效应MOS管详解 #### 概述 WNM2016-3-TR-VB是一款采用SOT23封装的N-Channel沟道增强型MOS场效应晶体管(MOSFET)。该产品具有低导通电阻、高可靠性和环保特性等优点,并且...
软件工程课程设计及实验报告与个人小结---程序员SUMER 软件工程课程设计及实验报告与个人小结---程序员SUMER 软件工程课程设计及实验报告与个人小结---程序员SUMER 软件工程课程设计及实验报告与个人小结---程序员...
Linux运维-03-监控专题-day01-zabbix安装与介绍-15-课后作业说明与今日小结.mp4
软件测试----个人体会小结 软件测试----个人体会小结 软件测试----个人体会小结 软件测试----个人体会小结
2015-2016学年高中历史-第四单元-单元学习小结-岳麓版选修1.doc
### DTS2016-VB — N-Channel沟道SOT23的MOSFET晶体管参数介绍与应用说明 #### 概述 DTS2016-VB是一款采用SOT23封装的N-Channel沟道功率MOSFET(金属氧化物半导体场效应晶体管),其主要特性包括低导通电阻、高...
根据提供的文件信息,我们可以深入探讨WPM2016-VB这款SOT23封装的N-Channel场效应MOS管的关键特性和应用。 ### 一、产品概述 #### 特性 - **无卤素**:根据IEC 61249-2-21标准定义,该MOS管采用无卤素材料,符合...
Linux运维-04-日志分析-日志监控ELK-day03-生产案例及Git版本控制-11-阶段小结.mp4
12-03-12 14:17 (后台、前台) 增加新旧注册方式的切换功能,在帐套控制台中可以切换。 12-03-07 9:56 (后台) 修改金卡储存报表汇总中储存过程增加条件 12-03-05 17:16 (后台) 修改特价促销单据传输问题 12-03-05 17:...
2015--2016学年第二学期远离毒品、珍爱生命小结.doc
大班教师个人小结-大班月小结.docx
国有企业保持------员先进性教育个人小结个人.docx
Installing Ubuntu 14.04 & ROS & TurtleBot 06-29-2016 个人小结,关于Ubuntu和ROS的安装。
Python-基础-时间日期处理小结.html
国际结算-小结-Remittance.doc
title: LC--双指针与滑动窗口类型题目小结 # 标题subtitle: 题目类型:Midium #副标题- 滑动窗口- 双指针双指针的基本思想顾名思义,
2022护理工作小结---上海中山医院.pdf
[8.7.1]--514排序与查找小结.srt