最近在刷一些java题目,碰到了一些有关字符串的题目,来总结一下。
类型1
- 1----字符串的比较:
String s1="hello";
String s2=new String("hello");
System.out.printfln(s1==s2);
System.out.printfln(s1.equals(s2));
//结果输出什么?
false
true
//你答对了吗?
- 上面这题的原理是:直接赋值"hello"会存储在常量池里面,而通过new String(“hello”)是开辟内存地址空间赋值,所以==进行的是地址的判断为false,String的equals()方法重写了父类方法,可以进行内容的比较,所以为true;看看接下来这题:
String s1="hello";
String s2=new String("hel");
String s3=s2+"lo";
System.out.println(s1==s3);
//结果是: false,猜对了吗?
- 上面这题有了一些变化,如果直接比较s1==s2肯定是false,但此时肯定有人会想这个拼接结果不就是"hello"应该会存放在常量池里面,但此时s2代表的是地址,所以最终的结果是s2的那个内存地址的值改变了,s3还是内存地址.接下来看一道有趣的题目:
字符串的旋转:
给定两字符串A和B,如果能将A从中间某个位置分割为左右两部分字符串(都不为空串),并将左边的字符串移动到右边字符串后面组成新的字符串可以变为字符串B时返回true。
例如:如果A=‘youzan’,B=‘zanyou’,A按‘you’‘zan’切割换位后得到‘zanyou’和B相同返回true。
- 这道题刚开始会有些懵,但如果你看到实现过程,会发现好简单:
public class Solution {
public boolean solve (String A, String B) {
if(A.length()!=B.length()) {
return false;
}
return (A+A).contains(B);//核心代码
}
}
- String类型有一个方法:contains(),该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。 这道题的巧妙就是通过字符串的重叠来实现翻转,真的神来之笔.
- 还有常见的反转字符串,输入一个字符串然后反转输出,这题我们可以这样写(自己的一个思路):通过String的一个方法toCharArray()输入的字符串变成一个char数组,然后循环反向拼接:
String s1="chengxuyi";
String s="";
char[] charArray = s1.toCharArray();
for (int i = charArray.length-1; i >= 0; i--) {
s+=charArray[i];
}
System.out.println(s);
类型2对于一串有规律的字符串进行正则的处理:
字符串s1=“1张三2李四3王五4胡歌5彭于晏6程序逸”
如何实现打印结果为1-张三,2-李四,3-王五,4-胡歌,5-彭于晏,6-程序逸?
- 上面这题其实用到了简单的正则表达式来分割字符串,具体思路代码如下:
String s="1张三2李四3王五4胡歌5彭于晏6程序逸";
String[] sname=s.split("\\d+");//1.如果遇到数字就分割
String[] sid=s.split("\\D+");//2.如果遇到非数字就分割
//3.创建一个treeMap来存储键值对类型的最终数据,并且treeMap是不允许存储相同值的,避免了重复的数据
TreeMap<Integer, String> treeMap=new TreeMap<Integer, String>();
for (int i = 0; i < sid.length; i++) {
treeMap.put(new Integer(sid[i]), sname[i+1]);
}
treeMap.forEach((t,u)->System.out.println(t+"-"+u+","));//使用forEach遍历