admin管理员组文章数量:1579084
JAVA开发工程师知识点总结
前言:本文撰写目的是为了给广大网友总结一份尽力涵盖所有常用的java知识点,用于笔试或面试,同时也是自己学习过程的一个记录,希望各位网友能够广开言路,各位大牛能够多给给指导。十分感谢!!
2、String字符串
内存中的字符串
字面量与String对象的关系,也涉及到JVM的一些知识,堆、常量池。若果是通过字面量定义的字符串实际上存储到的是常量池当中备用,而通过new创建出来的String对象实际上存储在堆中,常量池中的数据不容易被删除,但是堆中的数据有可能被GC掉,只要对象没有被引用。
重复创建的字面量==
重复创建的字面量实际上会重复地去常量池中存和取,当存在则取,不存在则创建至池中,所以通过字面量创建的字符串,用==比较相同字面量字符串的肯定相等(即"a"=="a"为true),但是通过new创建的String则不一定相等。同时这里也提一下==和equals的区别,==如果是基本类型则比较字面量,如果是引用类型则比较地址,equals则看具体的实现。
字符串字面量的+运算
首先我们要清楚,常量池中的变量是不会变的,而+运算有可能导致新的常量产生,而且常量池中的常量不轻易被回收,所以当需要大量的+运算的时候应该用对象处理代替+运算处理,比如说,我计算"a"+“b”+"c"其中中间常量值"ab"是不需要的。
字面量的equals和String的equals
字面量的equals实际上就是String的equals,但是String的equals把Object给Overrides了,逻辑从仅仅==改为了先判断==,如果对象地址相同则返回true,否则继续执行,然后逐个逐个判断两个字符串的char是否一致(所以本质上这个也是==和equals的区别吧,面试常问?)
再谈String中的方法和字段
键 | 类型 | 含义 | 字段类型或返回类型 |
---|---|---|---|
value | 私有不可修改的变量 | 字符串的char数组 | char[] |
hashCode | 公有方法 | hashcode,equals为true的必定hashcode相等,String重写了hashcode,空字符串的hashcode是0,hash不完全是计算值,在创建String对象的时候,字面量的hash会传给新创建String对象的hash使其一致 | int |
checkBounds | 公有静态方法 | 判断offset+length是否越界 | void但是会抛出异常 |
length | 公有方法 | value.length | int |
isEmpty | 公有方法 | value.length == 0 | boolean |
charAt | 公有方法 | value[index] | char |
codePointAt | 公有方法 | 这个函数依赖于Character.codePointAtImpl,里面好像包含了utf8、Unicode编码相关的处理,暂时没搞透 | int |
codePointBefore | 公有方法 | 同上 | int |
getChars | 公有方法 | 截取指定初始位置及长度的char[]给dst | void,直接修改入参char dst[] |
getBytes | 公有方法 | 依赖于StringCoding.encode,encode的字符集先取file.encoding系统参数,否则用UTF-8,然后开始编码,若果编码依旧失败则用ISO-8859-1编码,如果依旧编码失败则退出程序 | byte[] |
equals | 公有方法 | 已谈 | boolean |
contentEquals | 公有方法 | 如果入参是AbstractStringBuilder,则组个char比较,如果入参是String则调用equals,如果都不是则用CharSequence的成员方法charAt(i)和value[i]比较 | boolean |
compareTo | 公有方法 | 组个char比较直至有一对char对应不上,则做减法运算,如果有之一是子字符串则做长度相减 | int |
CASE_INSENSITIVE_ORDER | 公有静态变量 | 接口,实现Comparator<String>的compare方法,逻辑与compareTo相同,但是忽略大小写 | int |
regionMatches | 公有成员方法 | 比较两个字符串的指定位置子字符串是否相等 | boolean |
startsWith、endsWith、indexOf、lastIndexOf、substring、concat、replace、contains、replaceFirst、join等 | 公有成员方法 | 不谈字面意思 |
重要的工具
StringBuffer
其方法都是线程安全的,因为都加上了重量级锁synchronized。
具体可以包含字符串扩展、删除、插入、查询等功能。
具体的字符串值放在char[] toStringCache中,toString方法实际上就是用toStringCache去创建一个String对象。
当有大量的字符串运算的时候应该使用StringBuffer。
StringBuilder
与StringBuffer均继承自AbstractStringBuilder实现CharSequence接口,唯一的区别就是StringBuilder非线程安全,操作均大差不差。
正则表达式
语法
特殊字符(特殊字符如果要匹配其字面量需要转义)
特殊字符 | 含义 |
---|---|
$ | 匹配一行的结尾 |
^ | 匹配一行的开头 |
() | 标记子表达式的开始和结束位置 |
[] | 标记中括号表达式的开始和结束位置,中括号内部相当于枚举匹配,命中其一即可 |
{} | 用于标记前面子表达式的出现频度 |
* | 指定前面子表达式可以出现零次或多次 |
+ | 指定前面子表达式可以出现一次或多次 |
? | 指定前面子表达式可以出现零次或一次 |
. | 匹配除换行符之外的任何单字符(这个可以通过Patternpile的flag参数去修改) |
\ | 用于转义下一个字符,或指定八进制、十六进制字符 |
? | 指定前面子表达式可以出现零次或一次 |
| | 或 |
预设字符
字符 | 含义 |
---|---|
. | 任意字符 |
\d | 数字 |
\D | 非数字 |
\s | 空白字符 |
\S | 非空白字符 |
\w | 单词字符 |
\W | 非单词字符 |
边界字符
字符 | 含义 |
---|---|
^ | 行的开头 |
$ | 结尾 |
\b | 单词边界 |
\B | 非单词的边界 |
\G | 前一个匹配的结尾 |
数量标识符的模式(*,?,+,{})
实际上,正则表达式还提供了数量标识符,正则表达式支持的数量标识符有如下几种模式。
Greedy(贪婪模式):数量表示符默认采用贪婪模式,除非另有表示。贪婪模式的表达式会一直匹配下去,直到无法匹配为止。
Reluctant(勉强模式):用问号后缀(?)表示,它只会匹配最少的字符。也称为最小匹配模式。
Possessive(占有模式):用加号后缀(+)表示。
贪婪模式 | 勉强模式 | 占用模式 | 说明 |
---|---|---|---|
X? | X?? | X?+ | X表达式出现零次或一次 |
X* | X*? | X*+ | X表达式出现零次或多次 |
X+ | X+? | X++ | X表达式出现一次或多次 |
X{n} | X{n}? | X{n}+ | X表达式出现n次 |
X{n,} | X{n,}? | X{n,}+ | X表达式出现n次以上 |
X{n,m} | X{n,m}? | X{n,m}+ | X表达式最少出现 n 次,最多出现 m 次 |
String str = “hello,java!”;
// 贪婪模式的正则表达式
System.out.println(str.replaceFirst(“\w*” , “hdl”));
//输出hdl,java!
// 勉强模式的正则表达式
System.out.println(str.replaceFirst(“\w*?” , “hdl”"));
//输出hdlhello, java!
Pattern和Matcher
Pattern 编译正则表达式后创建一个匹配模式
Pattern 类有final修饰,不可被继承,且此类的实例是不可变可供多个并发线程安全使用。
Patternpile,有一个可以接收flag的重载方法,接收一个整型参数。
value | 含义 |
---|---|
Pattern.UNIX_LINES | unix行模式,大多数系统的行都是以\n结尾的,但是少数系统,比如Windows,却是以\r\n组合来结尾的,启用这个模式之后,将会只以\n作为行结束符 |
Pattern.CASE_INSENSITIVE | US-ASCII字符集大小写不敏感 |
Pattern.COMMENTS | 匹配时会忽略正则表达式里的空格字符和#号后的字符(注释) |
Pattern.MULTILINE | 默认情况下,输入的字符串被看作是一行,即便是这一行中包好了换行符也被看作一行。当匹配“^”到“$”之间的内容的时候,整个输入被看成一个一行。启用多行模式之后,包含换行符的输入将被自动转换成多行,然后进行匹配。 |
Pattern.LITERAL | 指定此标志后,指定模式的输入字符串就会作为字面值字符序列来对待。输入序列中的元字符或转义序列不具有任何特殊意义。 |
Pattern.DOTALL | 在这种模式中,表达式 .可以匹配任何字符,包括行结束符。 |
Pattern.UNICODE_CASE | 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不敏感的匹配。 |
可以用OR (|)运算符把这些标志配合使用 |
Matcher 使用Pattern实例提供的正则表达式对目标字符串进行匹配
方法 | 含义 |
---|---|
find | 在目标字符串里查找下一个匹配子串。如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。可以通过start参数指定起始位置 |
region | 设置此匹配器的区域限制。重置匹配器,然后设置区域,使其从 start 参数指定的索引开始,到 end 参数指定的索引结束(不包括end索引处的字符)。 |
matches | 只有完全匹配时才会返回true。 |
replaceAll | 将匹配的子串用指定的字符串替换。 |
replaceFirst | 将匹配的第一个子串用指定的字符串替换。 |
usePattern | 更改匹配器的匹配模式。 |
group | 返回当前查找而获得的与组匹配的所有子串内容。group()实际调用了group(int group)方法,参数group为0。组零表示整个模式,数字指定了哪个子匹配组。 |
start | 返回当前匹配的子串的第一个字符在目标字符串中的索引位置 ,可以通过group指定子匹配组。 |
end | 道理同start。 |
注意
上面的 7 个预定义字符其实很容易记忆,其中:
d 是 digit 的意思,代表数字。
s 是 space 的意思,代表空白。
w 是 word 的意思,代表单词。
d、s、w 的大写形式恰好匹配与之相反的字符。
方括号表达式
方括号表达式内部元素相当于或运算,命中其一即可(默认是取并集),且^的含义在方括号内部为取反,-表示范围,&&表示与运算(取交集),例如[a-z&&^bc]表示a-z的字母跟非bc字母做交集。
中文的unicode编码是\u4e00-\u9fa5
以上是简单的语法,接下来通过练习题去掌握较为复杂的正则表达式。
~~没找到合适的习题,后续做面试笔试题的时候如果遇到了,会在这里补充。
版权声明:本文标题:JAVA开发工程师知识点总结【字符串篇】 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727846293a1133130.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论