JAVA杂项[持续更新]
1. ?变量是否会自动初始化?
? ? 在类定义的field,String的值被赋予NULL,int被赋予0。而在方法内的String,int没有手动赋值会报编译错误The local?variable s2 may not have been initialized。
?
? ? ?正则表达式 "\\{.*?\\}" ? 会匹配到?"{name}"和"{village?}",这是勉强匹配.
? ? ?正则表达式 "\\{.*+\\}" ? 没有匹配项,这是possessive匹配(不知道怎么翻译了,理解成”全占匹配“也可以吧)。
?
?
? ? ? 算法
?? ? ?3种匹配的匹配算法不一样。? ? ? 约定概念:
目标字符串a:被匹配的字符串,如上面所说的"{name} lives in {village} , which is far from the company."
? ? ? ? 读入字符串r:算法中需要用到的临时字符串变量
? ? ? a. 贪婪匹配
? ? ? ? ? 1) 将整个目标字符串r读入,使读入字符串r=a,如果能够匹配,则返回SUCCESS,退出,否则转入2)。
? ? ? ? ? 2) 如果r的长度>=1:
去掉r末尾的一个字符,如果剩余的字符串能够匹配,则返回SUCESS,退出,否则转入2)。
? ? ? ? ? ? ? 如果此时r的长度为0:
如果""能匹配正则表达式,则返回SUCCESS,退出,否则返回FAIL,退出。
? ? ? ? ? 3) 如果1),2)之后返回SUCCESS,那么去掉a中的r部分,使 a = a - r, r = "",重新进入1)
? ? ? ?b. 勉强匹配
? 与贪婪相反
? 这里为了表达清晰,在引入一个临时变量b
? ? ? ? ? 1)将读入字符串r置为"",使b=a, 如果空字符串能够匹配,则返回SUCESS,退出,否则转入2)
? ? ? ? ? 2)如果r的长度<a的长度
b移出开始的字符,放入r的末尾,如果r能够匹配,返回SUCESS,退出,否则转入2)。
? ? ?如果r的长度==a的长度
如果r能够匹配,返回SUCESS,退出,否则返回FAILURE,退出
? ? ? ? ? 3)如果1),2)之后返回SUCCESS,那么去掉a中的r部分,使 a = a - r, r = "",b="",重新进入1)
? ? ? ?c.全占匹配
? 这个很简单,相当于贪婪的第一步
? 1)将整个目标字符串r读入,使读入字符串r=a,如果能够匹配,则返回SUCCESS,退出,否则返回FAILURE。
? 对于全占匹配,它只匹配一次——整个匹配,就像名字一样。个人觉得它没有什么存在的意义,贪婪正则表达式使用^...$不就可以取代全站匹配了吗?
?
Differences Among Greedy, Reluctant, and Possessive Quantifiers[QUOTE from http://docs.oracle.com/javase/tutorial/essential/regex/quant.html ]
The reluctant quantifiers, however, take the opposite approach: They start at the beginning of the input string, then reluctantly eat one character at a time looking for a match. The last thing they try is the entire input string.
Finally, the possessive quantifiers always eat the entire input string, trying once (and only once) for a match. Unlike the greedy quantifiers, possessive quantifiers never back off, even if doing so would allow the overall match to succeed.? 按照官方文档的说法,贪婪是从右往左吃,勉强是从左往右吃,全占是一次吃完!?5.?Class.getResource和ClassLoader.getResource的相对路径的基础路径不一样
?
前者是class本身所在的路径,而后者是classpath。前者有绝对路径概念,后者只有相对路径概念。
?
?
?
?代价2 需要在接受方法将unicode形式的字符串转换成原来的字符串
? ? ? ? ?例如收到abc\u4e2d\u6587,就转换为"abc中文"。调用parseUnicodeString("abc\u4e2d\u6587")即可转换为"abc中文"。
?