题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路解析
暴力
代码
public class Solution {
public String LeftRotateString(String str,int n) {
if(str==null||str.length()==0) return "";
StringBuffer sb = new StringBuffer();
char[] array = str.toCharArray();
for(int i = n;i<array.length;i++){
sb.append(array[i]);
}
for(int i = 0;i<n;i++){
sb.append(array[i]);
}
return sb.toString();
}
}
趁热看看StringBuffer和StringBuild的区别
首先说到StringBuffer和StringBuild肯定要先看看String。
对于String需要注意的几个点:
- String重写了equal方法的。因此它的equal不是比较的引用类型所指向的地址,而是比较的实际存储的值。
- String的源码:
/** The value is used for character storage. */
private final char value[];
什么意思呢?意思就是说,String类是使用final关键字修饰的字符数组来保存的。立即推,String对象是不可变的。
- 值的注意的是JDK1.9的String类使用了byte数组进行存储。
private final byte value[]
StringBuffer和StringBuild
- 首先看看两者的底层源码:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
/** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L;
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
public final class StringBuilder
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence{
/** use serialVersionUID for interoperability */
static final long serialVersionUID = 4383685877147921099L;
/**
* Constructs a string builder with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuilder() {
super(16);
}
-
两者从源码上看,都是继承自
AbstractStringBuilder
。而在父类中也是使用字符串数组进行保存字符串。但是没有像String那样用final修饰,因此是可变的。 -
他们都调用了父类的构造方法。
-
String是常量,是线程安全的。
-
StringBuffer对方法加了同步锁或者是对调用的方法加了同步锁,因此是线程安全的。
-
StringBuilder没有进行加锁因此线程不安全。
-