`
rockyuse
  • 浏览: 195426 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(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。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics