Java字符串知识点整理(字符串概念、常量池、API、正则表达式)
1.字符概念:
由多个字符(char型)拼接而成的字符序列
2.常量池:
定义一个字符串采用String s=new String(“Hello”);
字符串名s定义在栈当中,而Hello则是定义在堆当中,s通过JVM指向堆中的Hello这个字符串对象。如图所示:
通常在定义一个字符串时,会先将字符串存放到字符串常量池当中,字符串操作,会先从常量池中搜索是否存在当前的字符串,如果存在则不必再堆中新建一个对象,而将新定义的变量指向常量池中的字符串,这样操作可以节约堆的空间。如果常量池当中不存在,则会先在常量池中存储下,然后在堆当中开辟新的空间存放。
3.关于字符串的常用API
length()
此方法用于返回字符串的长度,要与数组当中的length区别,一个是方法,一个则是属性
trim()
用于移除字符串前后的空格
indexOf(“ ”)
用于返回字符串中对应元素的下标
substring()
用于截取字符串,其中参数是截取范围如substring(0,2)即就是截取区间 [0,2) 左闭右开
charAt()
用于返回对应下标的元素
toCharArray()
将字符串转化为字符数组
toUpperCase() toLowerCase()
前者将小写字符转化为大写,后者则相反
equalsIgnoreCase()
忽略大小写比较,注意比较时是逐位比较
replace()
字符串拼接
4.字符串反转实现:
public void testReverse() {
String s = "hellox";
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length / 2; i++) {
char c = chs[i];
chs[i] = chs[chs.length - 1 - i];
chs[chs.length - 1 - i] = c;
}
s = new String(chs);
System.out.println(s);
}
这里也可以使用Stringbulider中的reverse()方法
5.正则表达式
1.概念
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
2.字符表示意义
限定符
特殊符号
[0-9]|[a-z]表示或者,判断单个字符是数字或者字母
进行多个字符判断的时候可以使用()()分割
3.字符串的替换
可以使用正则表达式对字符串中相应的数据进行替换
例如:去除标签标识
public void test4() {
String str = "<h1>这是测试结果</h1><p>test a</p>";
String pattern ="(<[a-z]+[0-1]*>)|(</[a-z]+[0-1]*>)";
str=str.replaceAll(pattern, "");
System.out.println(str);
}
运行结果:
另外附上本次练习题:
1.将一个字符串进行反转,例如:”abcd”=>“dcba”。
2… 判定输入的一个字符串是否全为数字,使用两种方式完成。
3… 输入一个由小写字符组成的字符串,统计出每个字符出现的次数
@Test
/**
* 1.将一个字符串进行反转,例如:”abcd”“dcba”
*/
public void test1() {
String str = "abcd";
char[] c = str.toCharArray();
for (int i = 0; i < c.length / 2; i++) {
char t = c[i];
c[i] = c[c.length - 1 - i];
c[c.length - 1 - i] = t;
}
String s = new String(c);
System.out.println(s);
}
@Test
/**
* 2. 判定输入的一个字符串是否全为数字,使用两种方式完成。
*/
public void test2() {
String s = "45666123";
// System.out.println(isNumber1(s));
System.out.println(isNumber2(s));
}
/**
* 判断字符串是否全是数字(循环)
*
* @param s字符串
* @return true则是
*/
public boolean isNumber1(String s) {
boolean f = true;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) <= '0' || s.charAt(i) >= '9') {
f = false;
break;
}
}
return f;
}
/**
* 判断字符串是否全是数字(正则表达式)
*
* @param s字符串
* @return true则是
*/
public boolean isNumber2(String s) {
boolean f = false;
String partten = "[0-9]+";
if (s.matches(partten)) {
f = true;
}
return f;
}
@Test
/**
* 3. 输入一个由小写字符组成的字符串,统计出每个字符出现的次数
*/
public void test3() {
String s = "adafafagdfgdfswioutinmbcnruimxvnxzbxvx";
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'g', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't','u', 'v', 'w', 'x', 'y', 'z' };
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
char t = s.charAt(i);
for (int j = 0; j < a.length; j++) {
if (t == a[j]) {
count[j]++;
}
}
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i] + "出现的次数为:" + count[i]);
}
}
优化解法:
public void test() {
String s = "ajfikcnjiencospeowvnoooooo";
char[] chs = s.toCharArray();
int[] a = new int[26];
for (int i = 0; i < chs.length; i++) {
char t = chs[i];
a[t - 'a'] += 1;
}
for (int i = 0; i < a.length; i++) {
System.out.println((char)(i+'a') + "出现的次数:" + a[i]);
}
int max=a[0];
int count=0;
for(int i=1;i<a.length;i++) {
if(max<a[i]) {
count=i;
}
}
System.out.println("出现最高次数的字母:"+(char)(count+'a')+"次数"+a[count]);
}
结果: