读书人

(2011-07-05) 学习札记

发布时间: 2012-12-24 10:43:14 作者: rapoo

(2011-07-05) 学习笔记

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。

?

读书人网 >编程

热点推荐