JavaSE------集合(容器)

容器
Collection(单值)
    |--Set:无序,不允许重复    子接口-->SortedSet
    |        |--HashSet
    |        |--TreeSet:插入数据时是没有顺序的,输出之后数据是有顺序的,所以TreeSet是可以排序的子类
    |--List:有序,允许重复
        |--ArrayList
        |--LinkedList
        |--Vector
            |--Stack
Map(键值对)


    1、ArrayList与Vector的区别
        推出时间    ArrayList新的子类JDK1.2推出;Vector是JDK1.0时推出是旧的子类
        性能        ArrayList采用异步处理方式,性能更高;Vector采用同步处理方式性能较低
        线程安全    ArrayList属于非线程安全的操作类;Vector属于线程安全的操作类
        数据增长    需要增长时,ArrayList增长时只增长原数组的一半;Vector增长时成倍增长
    2、ArrayList与LinkedList的区别
        ArrayList、LinkedList都是List接口(列表)的子类,但他们的内部实现不同
        ArrayList采用数组实现List,而LinkedList采用双向链表实现List,因此:
        ArrayList存取速度快,插入删除慢,LinkedList存取速度慢,插入删除快。
    3、Collection与Collectons的区别
        Collection是单值集合类(容器)的最大父接口,继承于它的主要子接口有List、Set
        Collections是针对集合实现类(如ArrayList)的帮助类,他提供一系列静态方法实现各种集合的查找、排序等操作

    4、运算符“==”与方法“equals()”的区别

         指针:内存地址,用于间接访问内存单元。

         引用:为一个变量、函数等对象规定一个别名,该别名称为引用。此后,对别名的操作即是对别名所代表的对象的操作。即引用变量创建了变量和对象的别名。
引用虽是一种类型,但不是值,只能用它标识另一个对象。从理论意义上说,引用是一种映射,把一个标识符映射到一个对象。从直观意义上说,引用是用一个标识符给一个对象起了一个别名,引用标识对象,就是用一个别名标识对象。

        “==”运算符用于比较地址,equals用于比较内容
        Java中内存分4块:栈、堆、全局数据区、全局代码区
        值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
        ==用于比较引用和比较基本数据类型时具有不同的功能:
        ==操作比较的是两个基本类型变量的值(内容)是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同(即比较引用指向的对象的地址),即栈中(在栈中存放的位置不同)的内容(即对象的地址)是否相等。(记住:堆中存放的是对象本身)
        equals操作表示的两个变量是否是对同一个对象(在堆中存放的位置不同)的引用,即堆中的内容是否相同。equals()只能用于对象的比较。
        如:a.equals(b),因为equals比较的是两个对象,所以a,b都不能为基本数据类型,否则会出编译错误。(在jdk1.5以上版本中,b可以为基本数据类型,a不可以)
        注意:这里要当心空指向异常
    5、Comparable接口(制定对象比较的标准)
        基本数据类型和String类型数据,它们的比较标准Java语言本身已经提供好了,而用户自定义类对象间的比较标准Java语言是没有提供的,所以如果要进行用户自定义类对象间的比较、排序、查找等操作时,我们就必须制定这些对象之间的比较标准,即实现Comparable接口,覆写接口中的compareTo()方法或者实现Comparator类并实现compare()方法。
    6、Object类的主要方法:toString()、equals()、hashCode()
        ①Java中有两类集合(Collection),一类是List,一类是Set,前者是有序的,元素可以重复,后者是无序的,元素不可以重复 那么在set类型的集合中,如何判断元素是否重复呢,这就需要使用Object.equals方法,但如果元素很多了,添加一个新元素时,比较的次数 就很多,例如已经有100个元素了,添加第101个元素时,就要和前面的元素比较100次,效率很低。有一种数据结构,可以快速的查找所需要的对象,即将数据依据算法直接指定到一个地址上。这就是散列表(hash table)。在Java中哈希表用以链表为元素的数组即链表数组实现。每个链表被称为桶(bucket)。当存储一个新元素时,先调用元素的hashcode方法,计算出相应的桶的地址(链表的头结点),如果这个桶中没有元素,就直接存储了,如果有元素,会调用equals方法进行比较,如果相等的就不存了,不相等的话就保存到另外一个桶上;如果两个对象相等,则hascode一定相等,如果hascode相等,并不表示两个对象相等。
        ②实际上,Object.hashCode()是一个与本地OS相关的方法,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)而String、Integer等类已经覆些了Object类的hashCode()方法、equals()方法。自定义的类是Object类的子类,默认继承了Object.equals()方法,默认是比较地址的 。(可以分别查看Object类、String类、Integer类的toString()、HashCode()、equals()方法进行比较)
        ①、什么是hashcode
            哈希表为每个对象计算的一个整数,与对象的属性和地址都有关。
        ②、hashSet中,为什么要重写equals()、hashCode()方法
            向hashSet中添加元素时,先调用元素的hashcode方法,计算出相应的桶的地址(链表的头结点),如果这个桶中没有元素,就直接存储了,如果有元素,会调用equals方法进行比较,如果相等的就不存了,不相等的话就保存到另外一个桶上;如果两个对象相等,则hascode一定相等,如果hascode相等,并不表示两个对象相等。
        ③、如何覆些equals()、hashCode()方法
            public boolean equals(Object obj){
                强制转换成当前类对象(如A a = (A)obj)
                如果this和obj的内容是一模一样的
                    返回true
                否则
                    返回false
            }
            public int hashCode(){
                return 包装类或String对象的hashCode()方法(匿名对象.hashCode())
            }
    7、哈希表(数据结构知识)、比较器
        Java中Map接口的实现
        映射、哈希冲突、哈希因子、再散列(rehashed)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值