一、Object类中有哪些常用方法?
查看API手册是最快捷的办法!!
<底部存在测试代码>
二、StringBuildder与StringBuffer的区别
1、StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,
2、只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,
而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
3、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全
而StringBuffer则每次都需要判断锁,效率相对更低
(打印效率:StringBuilder > StringBuffer > String
使用环境:操作少量数据时,使用String,
????????? 单线程操作大量数据时使用StringBuilder
????????? 多线程操作大量数据时使用StringBuffer
三、Vector与ArrayList的区别
Array List:
1、ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。
2、数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。
因此,它适合随机查找和遍历,不适合插入和删除。
Vector
- Vector也是通过数组实现的,不同的是它支持线程同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致行,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
(Vector和ArrayList在插入与删除数据方面的性能差距不大,可以说是几乎没有差别!)
四、HashMap与Hashtable的区别
HashMap:
1、hashMap的原理:底层是数组和链表 以key和value的形式存在,key不能重复,value可以重复。
2、他的默认的容量为16,加载因子为0.75,每次扩容2倍
3、存放数据:当我们添加数据的时候,先对key进行hash算法,hash值%16
得到一个下标为0-15的值。
通过这个值找到数组的下标对应位置,判断这个位置是否有值,没有值,直接存放数据,有值则对key进行equals比较,一样就覆盖之前的数据,不一样则以链表形式存放数据。
4、散列桶中的数据达到8个的时候就和形成红黑树。
Hashtable:
1、Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
2、Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
3、Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。
测试代码:
StringBuildder与StringBuffer
public static void main(String[] args) {
??? method();
?? // method2();
}
public static void method() {
??? //1.定义字符串
??? String str = "太阳太大,西瓜爆出果粒橙";
??? //2.将指定的字符串拼接10000次
??? //2.1定义变量,用来保存最终拼接的结果
??? String result ="";
??? //2.2拼接10000次
??? /**4.可以添加一个计时功能*/
??? //4.1获取系统当前时间作为开始时间
??? long t1 = System.currentTimeMillis();//ms
??? for(int i = 0; i < 10000 ; i++) {
??????? result = result + str;
??? }
??? //4.2获取系统当前时间作为结束时间
??? long t2 = System.currentTimeMillis();//ms
??? //3.打印拼接好的字符串
??? //注意:eclipse控制台显示数据有限制,都打印在同一行了,所以控制台看不出来打印的内容
??? //可以通过全选,复制拿出来看数据是否拼接成功
??? System.out.println(result);
??? //4.3打印拼接总共花费的总时长
??? System.out.println(t2-t1);
}
public static void method2() {
??? //1.定义字符串
??? String str = "太阳太大,西瓜爆出果粒橙";
??? //2.将指定的字符串拼接10000次
??? /**优化1:String-->StringBuffer/StringBuilder*/
??? StringBuffer sb = new StringBuffer();//创建工具类对象1
??? StringBuilder sb2 = new StringBuilder();//创建工具类对象2
??? //2.2拼接10000次
??? /**4.可以添加一个计时功能*/
??? //4.1获取系统当前时间作为开始时间
??? long t1 = System.currentTimeMillis();//ms
??? for(int i = 0; i < 10000 ; i++) {
??????? /**优化2:+ -->append() */
??????? //result = result + str;
??????? sb.append(str);
??????? //sb2.append(str);
??? }
??? //4.2获取系统当前时间作为结束时间
??? long t2 = System.currentTimeMillis();//ms
??? //3.打印拼接好的字符串
??? //注意:eclipse控制台显示数据有限制,都打印在同一行了,所以控制台看不出来打印的内容
??? //可以通过全选,复制拿出来看数据是否拼接成功
??? //4.3打印拼接总共花费的总时长
??? System.out.println(sb.toString());//打印拼接的结果
??? System.out.println(t2-t1);
}
Vector与ArrayList
package cn.detu.java;
import java.util.Vector;
import java.util.ArrayList;
import java.util.List;
public class D4 {
??????? public static void main(String[] args) {
//??????????? Vector<String> vector = new Vector<>();//插入
//??????????? Long start = System.currentTimeMillis();
//??????????? for (int i = 0; i < 10000; i++) {
//??????????????? vector.add("data" + i);
//??????????? }
//??????????? Long end = System.currentTimeMillis();
//??????????? Long time = end - start;
//??????????? System.out.println("time:"+time);
??????????????????? List<String> list = new ArrayList<>();
??????????????????? Long start = System.currentTimeMillis();
??????????????????? for (int i = 0; i < 10000; i++) {
??????????????????????? list.add("data" + i);
??????????????????? }
??????????????????? Long end = System.currentTimeMillis();
??????????????????? Long time = end - start;
??????????????????? System.out.println("time:"+time);
//??????????????????? Vector<String> vector = new Vector<>();//删除
//??????????????????? for (int i = 0; i < 20000; i++) {
//??????????????????????? vector.add("data" + i);
//??????????????????? }
//??????????????????? Long start = System.currentTimeMillis();
//??????????????????? for (int i = 0; i < 10000; i++) {
//??????????????????????? vector.remove(i);
//??????????????????? }
//??????????????????? Long end = System.currentTimeMillis();
//??????????????????? Long time = end - start;
//??????????????????? System.out.println("time:" + time);
//??????????????????? List<String> list = new ArrayList<>();
//??????????????????? for (int i = 0; i < 20000; i++) {
//??????????????????????? list.add("data" + i);
//??????????????????? }
//??????????????????? Long start = System.currentTimeMillis();
//??????????????????? for (int i = 0; i < 10000; i++) {
//??????????????????????? list.remove(i);
//??????????????? ????}
//??????????????????? Long end = System.currentTimeMillis();
//??????????????????? Long time = end - start;
//??????????????????? System.out.println("time:" + time);
??????????????? }
??????????? }
HashMap与Hashtable???????
HashMap允许键值对是空值的情况,而HashTable不可以。
package cn.detu.java;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.Map.Entry;
public class D5 {
??????? public static void main(String[] args) {
??????????? //初始化map和table
??????????? Map<Integer,String> map = new HashMap<>();
??????????? Map<Integer,String> table = new Hashtable<>();
??????????? //向map添加key=null,value=null,正常运行
??????????? map.put(null, null);
??????????? //正常输出1
??????????? System.out.println(map.size());
??????????? //向table中添加key=null,捕获到空指针异常
//??????????? table.put(null,null);
//??????????? System.out.println(table.size());
??????????? try{
??????????????? table.put(null, "hello");
??????????? }catch(NullPointerException e){
????????? ??????//输出:key空指针异常:java.lang.NullPointerException
??????????????? System.out.println("key空指针异常:"+e);
??????????? }
??????????
??????? }
??? }
|