写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。
技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活
。
相关文章
给定一个字符串,将字符串中指定部分进行反转。
例如:将 “helloabcdworld” 反转为 “hellodcbaworld”
不管在学习还是工作中,都会遇到操作字符串的问题,官方API里面给出了它的很多方法,只要对这些方法熟练于心,就很容易实现操作字符串。关于字符串的常用方法在此不详细介绍,参考官方文档,在以后的博客中我也会总结Java中String、StringBuilder、StringBuffer的常用方法。
这篇博客提供了三种方式实现字符串的反转操作
1 方式一: 将字符串转化为char[ ]
public class StringReverse {
public static void main(String[] args) {
String str = "helloabcdworld";
// 反转字符串开始位置的下标
int start = 5;
// 反转字符串结束位置的下标
int end = 8;
System.out.println("原先的字符串: "+str);
String strNew=strReverse(str, start, end);
System.out.println("指定部分进行反转后的字符串: "+strNew);
}
/**
*
* @param str 原先的字符串
* @param start 反转字符串开始位置的下标
* @param end 反转字符串结束位置的下标
* @return 返回反转后的字符串
*/
private static String strReverse(String str, int start, int end) {
if (str != null) {
// 将此字符串转换为新的字符数组
char[] charArray = str.toCharArray();
// 利用循环的方式交换位置
for (int i = start, j = end; i < j; i++, j--) {
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}
// 将字符数组转换为字符串
String s = String.valueOf(charArray); // String s = new String(charArray)
return s;
}
return null;
}
}
代码执行结果:
原先的字符串: helloabcdworld
指定部分进行反转后的字符串: hellodcbaworld
2 方式二: 使用String拼接的方式
public class StringReverse1 {
public static void main(String[] args) {
String str = "helloabcdworld";
// 开始位置的下标
int start = 5;
// 结束位置的下标
int end = 8;
System.out.println("原先的字符串: "+str);
String strNew=strReverse(str, start, end);
System.out.println("指定部分进行反转后的字符串: "+strNew);
}
/**
*
* @param str 原先的字符串
* @param start 反转字符串开始位置的下标
* @param end 反转字符串结束位置的下标
* @return 返回反转后的字符串
*/
private static String strReverse(String str, int start, int end) {
// 把字符串从头到要反转的位置的字符串截取出来
// 在此测试代码中,需要反转abcd. start=5,因此截取的是hello
String strNew = str.substring(0, start);
// 利用循环的方式从end位置开始遍历取值,追加到截取的子串后面
for (int i = end; i >= start; i--) {
// charAt() 获取指定位置的值
strNew += str.charAt(i);
}
// substring() 截取子串,追加到strNew后面
strNew += str.substring(end + 1);
return strNew;
}
}
在此不再展示测试结果,结果和第一种方式一样。
3 方式三: 使用StringBuilder/StringBuffer
public class StringReverse2 {
public static void main(String[] args) {
String str = "helloabcdworld";
// 开始位置的下标
int start = 5;
// 结束位置的下标
int end = 8;
System.out.println("原先的字符串: "+str);
String strNew=strReverse(str, start, end);
System.out.println("指定部分进行反转后的字符串: "+strNew);
}
/**
*
* @param str 原先的字符串
* @param start 反转字符串开始位置的下标
* @param end 反转字符串结束位置的下标
* @return 返回反转后的字符串
*/
private static String strReverse(String str, int start, int end) {
// 构造一个容量为str.length的字符串构建器
StringBuilder stringBuilder = new StringBuilder(str.length());
// 添加[0,start) 的字符串
stringBuilder.append(str.substring(0, start));
// 利用循环的方式从end位置开始遍历取值,追加到stringBuilder后面
for (int i = end; i >= start; i--) {
stringBuilder.append(str.charAt(i));
}
// substring() 截取子串,并追加到stringBuilder后面
String substring = str.substring(end + 1);
stringBuilder.append(substring);
// toString() 返回表示此顺序中的数据的字符串
return stringBuilder.toString();
}
}
在此不再展示测试结果,结果和第一种方式一样。
在反转操作中,由于不需要考虑多线程安全的问题,优先采用StringBuilder,StringBuilder 和StringBuffer.
都是可变的字符序列,但是StringBuilder 的效率高。