admin管理员组

文章数量:1579086

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.lengthint
isEmpty公有方法value.length == 0boolean
charAt公有方法value[index]char
codePointAt公有方法这个函数依赖于Character.codePointAtImpl,里面好像包含了utf8、Unicode编码相关的处理,暂时没搞透int
codePointBefore公有方法同上int
getChars公有方法截取指定初始位置及长度的char[]给dstvoid,直接修改入参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_LINESunix行模式,大多数系统的行都是以\n结尾的,但是少数系统,比如Windows,却是以\r\n组合来结尾的,启用这个模式之后,将会只以\n作为行结束符
Pattern.CASE_INSENSITIVEUS-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