Java
1. String,StringBuffer, StringBuilder 的区别是什么?
String(大姐,出生于JDK1.0时代) 不可变字符序列
StringBuffer(二姐,出生于JDK1.0时代) 线程安全的可变字符序列
StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列
String是不可变类,任何对String的改变都会引发新的String对象的生成,
而StringBuffer则是可变类,任何对他所指代的字符串的改变都不会产生新的对象,它是线程安全的。
StringBuilder是线程不安全的,速度上,一般来说,StringBuilder > StringBuffer > String
public class StringStringBufferStringBuilder {
public void str(){
//测试 String
String str = "";
Long beginTime = System.currentTimeMillis();
for(int i = 0; i < 1000; i++){
str = str + i;
}
Long endTime = System.currentTimeMillis();
System.out.println("str:" + (endTime - beginTime));
//测试 StringBuffer
StringBuffer stringBuffer = new StringBuffer();
Long beginTime1 = System.currentTimeMillis();
for(int i = 0; i < 1000; i++){
stringBuffer.append(String.valueOf(i));
}
Long endTime1 = System.currentTimeMillis();
System.err.println("strBuffer:" + (endTime1 - beginTime1));
//测试 StringBuilder
StringBuilder stringBuilder = new StringBuilder("");
Long beginTime2 = System.currentTimeMillis();
for(int i = 0; i < 1000; i++){
stringBuilder.append(String.valueOf(i));
}
Long endTime2 = System.currentTimeMillis();
System.out.println("strBuilder:" + (endTime2 - beginTime2));
}
public static void main(String[] args) {
StringStringBufferStringBuilder s = new StringStringBufferStringBuilder();
s.str();
}
}
不过有一种情况,String比其他两种快,就是String连接时 String str = "ab" + "cd";
参考文章:http://www.iteye.com/topic/522167
2. String为什么是不可变的?
字符串String是Java程序中经常使用的一个类。但是,它有一个特殊的属性,就是一旦初始化以后,就不可再更改了。
大家都说String不可变的原因,是因为JDK源码中String类声明为final的原因。其实这不尽然,我们可以考虑这样一个问题:
String类声明为fianl就成为不可变的.
StringBuffer类和StringBuilder类也是被声明为final的,为什么他俩又可以变呢?
所以说这样的理解是错误的,String不可变是因为:
String类自身是final的;
其次String类里面的内容也是final的,比如最重要的保存字符串的部分。
到JDK的包里面看一下String 的源代码就一目了然了:
public final class String
implements java.io.Serializable, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count; ……
我们还可以再对比一下String和StringBuilder的不同:
private final char value[];
那么StringBuilder呢?
public StringBuilder() {
super(2);
}
在 AbstractStringBuilder 里面是
char value[];
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
可见,这个char是可以变化的。通过一个 expandCapacity的方法进行扩充容量。
3. Get 和 Post 的区别
HTTP:定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
HTTP-GET和HTTP-POST是使用HTTP的协议标准动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每一个HTTP-GET和HTTP-POST都由HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么。
HTTP:定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
HTTP-GET和HTTP-POST是使用HTTP的协议标准动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每一个HTTP-GET和HTTP-POST都由HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么。
与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
(1)get 是从服务器上获取数据,post是向服务器传送数据。 在客户端,get方式在通过url提交数据,数据在url中可以看到;post方式,数据放置在html header内提交。
(2)使用get 的时候,参数会显示在地址栏上,而post不会。
(3) get 方式提交的数据最多只能有1024字节,而post则没有此限制。
(4) 安全性 :如果用get提交一个验证用户名和密码的form ,一般认为是不安全的。因为用户名和密码将出现在url上,进而出现在浏览器的历史记录中。显然,在对安全性有要求的情况下,应该用post。 与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
(1)get 是从服务器上获取数据,post是向服务器传送数据。 在客户端,get方式在通过url提交数据,数据在url中可以看到;post方式,数据放置在html header内提交。
(2)使用get 的时候,参数会显示在地址栏上,而post不会。
(3) get 方式提交的数据最多只能有1024字节,而post则没有此限制。
(4) 安全性 :如果用get提交一个验证用户名和密码的form ,一般认为是不安全的。因为用户名和密码将出现在url上,进而出现在浏览器的历史记录中。显然,在对安全性有要求的情况下,应该用post。