当我进行算法练习时,我发现许多人喜欢在操作之前将字符串传递给charArray?
我不明白为什么我们这么做呢?我的意思是,我可以使用string.charAt()
,为什么要使用string.toCharArray()
然后使用charArray[i]
?它是相同的,甚至charArray
使用O(n)内存。
任何人都可以向我解释一下吗?
答案 0 :(得分:1)
有几个原因让人们更喜欢char[]
而不是String
和StringBuffer
:
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
访问比使用StringBuilder
或charAt()
更快。
使用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 ]
可以随时简单地覆盖,从而从内存中删除敏感数据。