我计划对StringBuilders中的最后一个字符执行大量删除操作。使用sb.setLength(sb.length()-1);的解决方案对我来说看起来不错。但是,由于这些删除将处于循环中,我需要知道它的复杂性。我的理解是,此操作只是递减我的StringBuilder对象的一些私有(private)属性,并且不执行任何字符本身的复制/克隆/复制,因此它的时间复杂度为O(1),并且应该可以快速运行。我说得对吗? 最佳答案 如果新长度小于旧长度,则为O(1),在您的情况下。JDK的源码网上有,大家可以自行查看。以Java8为例,set
例如,我有一个返回排列列表的基本方法。importitertoolsdefperms(elements,set_length=elements):data=[]forxinrange(elements):data.append(x+1)returnlist(itertools.permutations(data,set_length))现在我明白了,在当前状态下,这段代码不会运行,因为第二个elements没有定义,但是有没有优雅的方式来完成我在这里尝试做的事情?如果还不清楚,我想让默认的setLength值等于传入的第一个参数。谢谢。 最佳答案
例如,我有一个返回排列列表的基本方法。importitertoolsdefperms(elements,set_length=elements):data=[]forxinrange(elements):data.append(x+1)returnlist(itertools.permutations(data,set_length))现在我明白了,在当前状态下,这段代码不会运行,因为第二个elements没有定义,但是有没有优雅的方式来完成我在这里尝试做的事情?如果还不清楚,我想让默认的setLength值等于传入的第一个参数。谢谢。 最佳答案
在调查性能测试结果时,我发现JavaFlightRecorder的“HotMethods”中报告了以下堆栈跟踪:StackTraceSampleCountPercentage(%)---------------------------------java.util.Arrays.rangeCheck(int,int,int)3582.212java.util.Arrays.fill(char[],int,int,char)3582.212java.lang.AbstractStringBuilder.setLength(int)3582.212java.lang.StringBuild
在很多情况下,我们需要删除StringBuilder/StringBuffer的最后一个字符。例如,给定一个int[]{1,2,3},实现一个StringtoString(int[]a)方法,用逗号分隔符连接每个元素.输出应为1,2,3,没有尾部逗号。我们可以很容易地写一个循环:int[]nums=newint[]{1,2,3,4,5};StringBuildersb=newStringBuilder();for(inti=0;i但我们总是需要删除尾部','。有两种实现方式:sb.deleteCharAt(sb.length()-1);和sb.setLength(sb.length()
以下代码publicclassMain{publicstaticvoidmain(String[]args)throwsIOException{Filetmp=File.createTempFile("deleteme","dat");tmp.deleteOnExit();RandomAccessFileraf=newRandomAccessFile(tmp,"rw");for(intt=0;t在Java8上,这运行良好(文件在tmpfs上,所以你会认为它是微不足道的)Averagecalltime1us.Averagecalltime0us.Averagecalltime0us.Av