Java 交换内容后构建新字符串的更好方法
我在操纵ssn。 输入=“123456789” Output=“896745123” 从输入中取出前3位数字(即123),将其与最后两位数字“89”交换,然后将“45”与“67”交换。下面是我使用ToCharray的代码。但我不喜欢它。这个方法(不是测试)一次可以被许多用户访问。我一直在寻找性能、可读性和贸易安全性更好的解决方案 我感谢你的帮助Java 交换内容后构建新字符串的更好方法,java,string,thread-safety,char,stringbuilder,Java,String,Thread Safety,Char,Stringbuilder,我在操纵ssn。 输入=“123456789” Output=“896745123” 从输入中取出前3位数字(即123),将其与最后两位数字“89”交换,然后将“45”与“67”交换。下面是我使用ToCharray的代码。但我不喜欢它。这个方法(不是测试)一次可以被许多用户访问。我一直在寻找性能、可读性和贸易安全性更好的解决方案 我感谢你的帮助 @Test public void testSSNString(){ String original="123456789";
@Test
public void testSSNString(){
String original="123456789";
String result="896745123";
char[] charResult=original.toCharArray();
char temp=charResult[6];
charResult[6]=charResult[0];
charResult[0]=charResult[7];
charResult[7]=charResult[1];
charResult[1]=charResult[8];
charResult[8]=charResult[2];
charResult[2]=charResult[5];
charResult[5]=charResult[4];
charResult[4]=charResult[3];
charResult[3]=temp;
assertEquals(original.toCharArray(),charResult);
}
就性能而言,您给出的方法本质上是Java中所能做到的最好的。使用数组比使用
StringBuilder
更快
为了提高可读性,我只需要做一些小的更改,比如为置换输出创建一个新数组:
@Test
public void testSSNString() {
String original = "123456789";
String expected = "896745123";
char[] in = original.toCharArray();
char[] out = new char[9];
out[0] = in[7];
out[1] = in[8];
out[2] = in[5];
out[3] = in[6];
out[4] = in[3];
out[5] = in[4];
out[6] = in[0];
out[7] = in[1];
out[8] = in[2];
assertEquals(expected.toCharArray(), out);
}
t这是完全线程安全的,而且性能最好。没有任何解决方案可以打败您的硬编码映射。如果您多次调用
System.arrayCopy
.Sweet(这是用于“输入至少15个字符”),则性能可能会略有提高(代码也会减少),我想补充一点。我创建了一个方法,并将此逻辑放在该方法中,然后返回“out.toString()”。toString返回的是地址,而不是“out”的字符串表示形式。为什么呢?尽管返回新字符串(out);工作正常。对于char[]->String
转换,请使用@NayukiMinase。我就是这么做的。但是我想知道为什么char[]->String没有给我字符串而不是地址?