当我们对字符串进行操作时,为什么要将字符串转换为charArray?

时间:2015-09-17 21:56:36

标签: java string algorithm

当我进行算法练习时,我发现许多人喜欢在操作之前将字符串传递给charArray?

我不明白为什么我们这么做呢?我的意思是,我可以使用string.charAt(),为什么要使用string.toCharArray()然后使用charArray[i]?它是相同的,甚至charArray使用O(n)内存。

任何人都可以向我解释一下吗?

1 个答案:

答案 0 :(得分:1)

有几个原因让人们更喜欢char[]而不是StringStringBuffer

  • String是不可变的。这意味着,如果您想在不使用任何实用程序类的情况下操作String,您最终会经常复制String,这会导致代码效率极低。
  • 访问char[]中的字符比使用charAt更快(虽然将String转换为char[]需要一些时间,但应该是class Test{ public static void main(String[] args){ String s = "a"; char[] c = new char[]{'a'}; StringBuffer buffer = new StringBuffer("a"); char x; long time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = s.charAt(0); time = System.nanoTime() - time; System.out.println("string: " + time); time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = c[0]; time = System.nanoTime() - time; System.out.println("[]: " + time); time = System.nanoTime(); for(int i = 0 ; i < 1000 ; i++) x = buffer.charAt(0); time = System.nanoTime() - time; System.out.println("buffer: " + time); } } 在优化时也考虑过了:

    char[]

    运行这个简单的类会产生以下输出(在我的机器上,使用javaSE 1.8.0 build b132):

      

    string:37895
      []:18948
      缓冲区:85659

    显然,通过String访问比使用StringBuildercharAt()更快。

  • 使用Object来操作单个字符会导致代码被setCharAt()String填充,这可能会被视为丑陋的代码。

  • 安全性:如果代码处理敏感数据,则String相当不安全,因为不可变String将存储在内存中。这意味着在GC将其从内存中删除之前,可以访问包含敏感数据的char[]。另一方面,from bs4 import BeautifulSoup import urllib2 url = "http://wwww.somewebsite.com" headers = { 'User-Agent' : 'Mozilla/5.0' } html = urllib2.urlopen(urllib2.Request(url, None, headers)).read() soup = BeautifulSoup(html) links = soup.findAll('a', href=re.compile('.*mypage\.php\?REF=[0-9]*')) replace = [ link['href'].split("=")[1] for link in links ] 可以随时简单地覆盖,从而从内存中删除敏感数据。