ArrayList,Vector和LinkedList有什么特点?HashMap和HashTable有什么区别?

    ArrayList,Vector和LinkedList类均在java.util包中。

    ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一个连续的空间来存储,由于数据存储是连续的,因此,它们支持用序号

(下标,索引)来访问元素,同时,索引数据的速度比较快。但是在插入元素的时候需要移动容器中的元素,所以,对数据的插入操作执行速度比较慢。ArrayList

和Vector都有一个初始化的容量的大小,当里面存储的元素超过这个大小的时候,就需要动态地扩充它们的存储空间。为了提高程序的效率,每次扩充容量的时候

,不是简单地扩充一个存储单元,而是一次就会增加多个存储单元。Vector默认扩充为原来的两倍(每次扩充空间的大小是可以设置的),而ArrayList默认扩充为

原来的1.5倍(没有提供方法来设置空间扩充的方法)。

   ArrayList与Vector最大的区别就是Synchronization(同步)的使用,没有一个ArrayList的方法是同步的,而Vector的绝大多数的方法(例如add,insert,set

,equals和hashCode等)都是直接或者间接同步的,所以,Vector是线程安全的,ArrayList不是线程安全的。正是由于Vector提供了线程安全的机制,使其性能上

也要略逊于ArrayList。

   LinkedList是采用双向链表来实现的,对数据的索引需要从列表头开始遍历,因此,随机访问的效率比较低,但是插入元素的时候不需要对数据进行移动,故插入效

率较高。同时LinkedList不是线程安全的。

   那么,在实际使用的情况下,如何从这几个容器中选择合适的使用呢?当对数据的主要操作为索引只在集合的末端增加,删除元素,使用ArrayList或Vector效率比较

高。当在多线程中使用容器时(即多个线程会同时访问该容器),选用Vector较为安全。

   HashMap和Hashable的区别如下:

   Java为数据结构中的映射定义了一个接口java.util.Map,它有三个实现类:HashMap,Hashtable和TreeMap。Map是用来存储键-值对的数据结构,在数组中通过数组

下标来对其内容进行索引,而在Map中,则是通过对象来进行索引,用来索引的对象叫作key,其对应的对象叫作value。

   HashMap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。由于HashMap与Hashtable都采用了Hash方法

进行索引,因此,二者具有许多相似之处,它们主要有如下的一些区别:

   1)HashMap是Hashtable的轻量级实现(非线程安全的实现),它们都实现了Map接口,主要区别在于HashMap允许空(null)键值(key)(但需要注意,HashMap最多

只允许一条记录的键为null,不允许多条记录的值为null),而Hashtable不允许空(null)键值(key)。

  2)HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易引起误解。Hashtable继承自Dictionary类,而HashMap是Java

1.2引进的Map interface的一个实现。

  3)Hashtable的方法是线程安全的,而HashMap由于不支持线程的同步,所以,它不是线程安全的。在多个线程访问Hashtable时,不需要开发人员对它进行同步,而对于

HashMap,开发人员必须提供额外的同步机制。所以,效率上HashMap可能高于Hashtable。

 4)Hashtable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。

 5)Hashtable和HashMap采用的hash/rehash算法都几乎一样,所以,性能不会有很大的差异。

 6)Hashtable中Hash数组默认大小是11,增加的方式old*2+1。在HashMap中,Hash数组的默认大小是16,而且一定是2的指数。

 7)Hash值得使用不同,Hashtable直接使用对象的HashCode。

 以上三种类型中,使用最多的是HashMap。HashMap里面存入的键-值对在取出的时候没有固定的顺序,是随机的。一般而言,在Map中插入,删除和定位元素,HashMap是

最好的选择。由于TreeMap实现了SortMap接口,能够把它保存的记录根据键排序,所以,取出来的是排序后的键-值对,如果需要按自然顺序或自定义顺序遍历键,那么TreeMap

会更好。LinkedHashMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么可以用LinkedHashMap实现,它还可以按读取顺序来排序。

public class MainStringOne {

    // 判断字符c是否是中文字符,如果是则返回true
    public static boolean isChinese(char c){
        String sb = String.valueOf(c);
        return sb.getBytes().length > 1?true:false;
    }

    public String truncateStr(String str,int len){
        if(str == null || str.equals("") || len == 0){
            return "";
        }
        char[] chrArr = str.toCharArray();
        StringBuilder sb = new StringBuilder();
        int count = 0;  //用来记录当前截取字符的长度
        for (char cc : chrArr) {

            if(count < len){
                if (isChinese(cc)) {
                    //如果要求截取子串的长度只差一个字符,但是接下来的字符是中文,
                    //则截取结果子串中不保存这个中文字符
                    if(count + 1 == len){
                        return sb.toString();
                    }
                    count = count + 2;
                    sb = sb.append(cc);
                }
                else {
                    count = count + 1;
                    sb = sb.append(cc);
                }
            }
            else {
                break;
            }
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        MainStringOne splitStr = new MainStringOne();
        String sb = "人 ABC 们 DEF";
        System.out.println(splitStr.truncateStr(sb, 6));
    }

}

程序的运行结果为

人 ABC

posted @ 2022-01-08 16:56  杜嘟嘟  阅读(21)  评论(0编辑  收藏  举报