Java高级编程day21【谷】

Java高级编程day21

Collection类的方式

contains(Object obj)

判断当前obj是否存在于集合中

比较的元素为自定义类则必须全部都重写过equals方法

containsAll(Collection coll)

判断集合coll内的所有元素是否都在当前集合中

remove(Object o)

将当前集合中去除o

removeAll(Collection coll)

将coll集合中出现的所有元素都在当前集合中去除

retainAll(Collection coll)

获取coll与当前集合的交集

equals(Collection coll)

判断两个集合是否相等,至于与顺序有没有关系主要看Collection的子类是List还是Set

hascode()

获取当前集合的hascode编码

toArray()

将当前集合转换为数组

Array.asList(数组或基本数据类型)

如果数组为基本数据类型,那么将转换为地址,不会讲数组元素保存在集合中,

所以当数据为基本数据类型我们需要使用封装类进行装填,不可以使用基本类型数组

或者直接将元素存入用逗号隔开

Iterator() 迭代器

遍历集合元素

while(interator.hasNext()){

​ interator.next();

}

迭代器相当于一个指针,不是容器,指向第一个元素的上一个

迭代器中由remove()方法删除集合元素,不同于集合中使用的remove方法

注意

测试Iterator中的remove()
如果还未调用next()或在上一次调用next方法之后已经调用了remove方法,
再调用remove都会报ILLegalStateException。

遍历集合/数组foreach

for(集合元素类型 局部变量 :集合对象)

内部用的依然迭代器原理

是将集合元素依次赋给局部变量,所以不能用于赋值操作

List接口

面试题

ArrayList LinkedList Vector三者有何异同

同:都是实现了List接口,存储单个数据,集合元素有顺序,可重复

异:ArrayList:是List接口的主要实现类,线程不安全效率高,底层由Object类数组来存储元素

​ LinkedList:一般多用于频繁的插入,删除,频繁的插入与删除效率远远高于ArrayList和Vector,底层由双向链表来存储数据

​ Vector:是List接口的古老实现类,线程安全,效率低,底层由Object类数组来存储元素

ArrayList的源码分析
jdk7

ArrayList list =new ArrayList()//底层创建了长度为10的Object[]数组elementData

list.add(123)//elementData[0]=123;

list.add(11)//如果此次的添加导致底层elementData数组容量不够,则扩容

默认情况下,扩容为原来的1.5倍,同时需要将原有的数组中的数据复制到新的数组中

结论:建议开发中使用带参数的构造器:ArrayList list =new ArrayList(int capacity);

jdk8

ArrayList list =new ArrayList()//底层的Object[]数组elementData初始化为{},并没有创建长度

list.add(123)//elementData[0]=123;//第一次调用add()时,底层创建了长度为10的数组,elementData[0]=123;

剩下操作由jdk7一样

小结

jdk7中ArrayList的创建相当于单例模式的饿汉式,先创建数组

jdk8中ArrayList的创建相当于单例模式的懒汉式,当调用add()方法时,才创建数组,延迟了数组的创建,节省了空间

LinkedList源码分析

LinkedList link=new LinkedList();内部声明了Node类型的first和last属性,默认值为null

list.add(123); 将123封装到Node中,创建了Node对象

其中Node定义为:体现了LinkedList双向表的说法

Vector源码分析

jdk7与jdk8通过Vector()构造器创建对象时,都是默认为长度为10的Object[]数组

在扩容方面,默认扩容为原来数组长度的2倍

List接口常用方法

void add(int index,Object ele):在index位置插入ele元素
boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中未次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index,Object ele):设置指定index位置的元素为ele
List subList(int fromIndex,int toIndex):返回从fromlndex到toIndex位置的子集合

public class ListMethod {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.forEach(System.out::println);
        list.add(2,88);
        System.out.println(list);
        List list1 = Arrays.asList(3, 2);
        list.addAll(2,list1);
        System.out.println(list);
        System.out.println(list.get(5));
        System.out.println(list.indexOf(3));
        System.out.println(list.lastIndexOf(3));
        System.out.println(list.remove(5));
        System.out.println(list);
        list.set(0,list1);
        System.out.println(list);
        List list2 = list.subList(0, 2);
        System.out.println(list2);

    }

}

Set接口

HashSet:作为Set接口的主要实现类:线程不安全,可以使用null值

​ LinkedHashSet:作为HashSet的子类;遍历器内部数据时,可以按照添加时的顺序遍历,对于频繁的遍历操作,LinkedHashSet效率高于HashSet

TreeSet:可以按照添加对象的指定属性,进行排序

Set接口没有额外的方法,用的都是Collection中声明过的方法

以HashSet为例

1.无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据每个元素的哈希值通过某种算法进行排序

2.不可重复性:添加元素时保证equals()方法不能为true,比较的也是哈希值,即:相同元素只能添加一个

HashSet

二、添加元素的过程:
我们向HashSet中添加元素a,首先调用元素a所在类hashCode()方法,计算元素a的哈希值,
此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为:索引位置),判断
数组此位置上是否已经有元素:
如果此位置上没有其他元素,则元素a添加成功。–>情况1
如果此位置上有其他元素b(或以链表形式存在的多个元素),则刚比较元素a与元素b hash值:
如果hash值不相同,则元素a,添加成功。–>情况2
如果hash值相同,进而需要调用元素a所在类的equals()方法:
equals()返回true,元素a添加失败
equals()返回False,则元素a添加成功。—>情况2
对于添加成功的情况2和情况3而言:元素a与已经存在指定索引位置上数据以链表的方式存储。
jd7:元素a放到数组中,指向原来的元素。
jdk8:原来的元素在数组中,指向元素a
总结:七上八下
HashSet底层:数组+链表的结构。

要求:向Set中添加的数据,其所在的类一定要重写hashCode()和equals()
要求:重写的hashCode()和equals()尽可能保待一致性:相等的对象必须具有相等的散列码
重写两个方法的小技巧:对象中用作equals()方法比较的Field,都应该用来计算hashCode

LinkedHashSet的使用

LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个数据和后一个数据
优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet

TreeSet的使用

1.问TreeSet中添加的数据,要求是相同类的对象。
2.两种排序方式:自然排序(实现Comparable接口)和定制排序(comparator)
3.自然排序中,此较两个对象是否相同的标准为:compareTo()返回0,不再是equals()

4.定制排序中,此较两个对象是否相同的标准为:compare()返回0,不再是equals()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值