一、String,StringBuffer, StringBuilder 的区别是什么?
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 Strin
gBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的: String S1 = “This is only a” + “ simple” + “ test”;
StringBuffer Sb = new StringBuilder(“This is only
a”.append(“ simple”.append(“ test”; 你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM
的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做
在大部分情况下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le" 会使字符串缓冲区包含“startle”,而 z.insert(4, "le" 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder 一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API ,但不保证同步。该类被设计用作
StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
二、VECTOR,ARRAYLIST, LINKEDLIST 的区别是什么?
1 ArrayList 底层是采用数组实现的(并且改数组的类型是Object 类型的)2 如果是jdk6的话,
字符串长度最大是多少采用Array.of(方法来生成一个新的数组,如果是jdk5.0的话,使用的是System.arraycopy 方法(将数组拷贝)
3 List list = new ArrayList(;时,底层会生成一个长度为10的数组来存放对象,如果预先知道list
会存放多少个对象的话,最好通过new ArrayList(int length的方式先确定数组的最小长度,如new
ArrayList(50,这样能提高底层的效率。
4 对于ArrayList 与Vector 来说,底层都是采用数组方式来实现的(该数组是一个Object 类型的数组)
5 对于ArrayList ,所有方法都不是同步的,对于Vector ,大部分是public 的方法都是同步的。
6、LinkedList 底层是由双向循环链表实现的,对于ArrayList ,查速度非常快,增加和删除操作非常
慢。(本质上是由数组的特点来决定的)
7、对于LinkList ,查速度非常慢,增加和删除操作非常快。(本质上是由双向循环链表的特点来决定
的)
一、同步性
ArrayList,LinkedList 是不同步的,而Vestor 是的。所以如果要求线程安全的话,可以使用ArrayList 或LinkedList ,可以节省为同步而耗费开销。但在多线程的情况下,有时候就不得不使用Vector 了。当然,也可以通过一些办法包装ArrayList,LinkedList ,使他们也达到同步,但效率可能会有所降低。
二、数据增长
从内部实现机制来讲ArrayList 和Vector 都是使用Objec 的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数
组的长度,Vector 缺省情况下自动增长原来一倍的数组长度,ArrayList 是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector 有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
三、检索、插入、删除对象的效率
ArrayList 和Vector 中,从指定的位置(用index )检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i,其中n 代表集合中元素的个数,i 代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i 和第i 个元素之后的所有元素都要执行(n-i个对象的位移操作。
LinkedList 中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1,但它在索引一个元素的时候比较慢,为O(i,其中i 是索引的位置。 所以,如果只是查特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector 或ArrayList 都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList
三、HASHTABLE, HASGMAP,TreeMap 区别
四、ConcurrentMap 和HashMap 的区别
五、T omcat ,apache ,jboss 的区别
六、GET POST区别
七、SESSION, COOKIE区别
八、Servlet 的生命周期
九、HTTP 报文包含内容
十、Statement 与PreparedStatement 的区别, 什么是SQL 注入,如何防止SQL 注入

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。