Collection

List arr1 = Arrays.asList(new int[]{12,33});

arr1.size() //1

List arr2 = Arrays.asList(new Integer[]{12,33})

arr2.size() //2

ArrayList LinkedList Vector的异同:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ilNG2f8D-1592220099106)(E:\笔记\Pictures\QQ图片20200605212557.png)]

ArrayList源码分析:

JDK7:

初始10,扩容1.5倍

结论:在知道大概范围的时候,建议采用带参构造器。

JDK8:

初始{},第一次add()时才创建长度10的数组,后续与JDK7无异

小结:JDK7中类似创建单例的饿汉式,而JDK8类似于单例的懒汉式,延迟了数组的创建,节省内存。

LikedList源码分析:

创建时,内部声明了Node类型的first和last属性,默认值是null。

Vector源码分析:

创建长度10的数组,默认扩容为原来的2倍。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWH08dKs-1592220099111)(E:\笔记\Pictures\QQ图片20200605235102.png)]

这个输出为 [1,2]

HashSet: 内部结构:数组+链表

  • 无序性
  • 不可重复性

添加元素a时,首先调用a的hashCode()方法,计算其哈希值,判断数组在此位置上是否已经有元素,若没有,则添加成功,。。。。。

JDK7:元素a放到数组中,指向原来的元素。

JDK8:原来的元素在数组中,指向元素a

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VYfCa058-1592220099114)(E:\笔记\Pictures\QQ图片20200606002708.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uZl2Gz72-1592220099117)(E:\笔记\Pictures\QQ图片20200606011532.png)]

要求:

  • 向Set添加的数据,其所在的类一定要重写hashcode()和equals()方法
  • 重写的hashCode()和equals()尽可能保持一致性。

即相等的对象必须具有相等的散列码(hashcode)

重写hashCode()方法的基本原则

  • 同一个对象多次调用hashCode()应该返回相同的值
  • 当两个对象的equals()方法比较返回true时,其hashCode()也应相等
  • 对象中用作equals()方法比较的Field,都应该用来计算hashCode的值。

无序指放置的位置无序,按照(hashcode)

LinkedHashSet

作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,用来记录次数据的前数据和后数据。

优点:对于频繁的遍历操作,此效率高于HashSet

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

1.添加的数据,要求是相同类的对象。

2.两种排序方式:自然排序(实现Comparable接口) 、 自订排序

3.自然排序中,比较两个对象是否相同的标准为compareTo()返回0,不再是equals()。

TreeSet和TreeMap采用红黑树的存储结构,特点是有序,查询速度比List快。

自订排序:

Comparator com = new Comparator(){…}

TreeSet set = new TreeSet(com)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgzVGZvC-1592220099119)(E:\笔记\Pictures\QQ图片20200606021356.png)]

--------------------------------------------------------------------------------------------------------------------Map:

KeySet —— Values Entry

JDK7:

在实例化之后,底层创建了长度16的一维数组Entry[] table

。。。。。。。可能已执行多次put…

map.put(key1,value1):

首先,调用key1所在类的hashCode()计算key1哈希值,得到在Entry数组中的存放位置

如果此位置为空,则添加成功。

如果不为空,比较与已经存在的一个或多个数据,比较其哈希值。

如果都不相同,则添加成功。

如果相同,继续比较,通过equals比较。

如果返回false,此时添加成功。

如果返回true,使用value1替换原来的value。

补充:

  • 新加数据和原来的数据以链表的方式存储。
  • 默认的扩容方式:扩容为原来的2倍,并将原有的数据复制过来

JDK8:

new HashMap()的时候底层不创建长度为16的数组。首次创建时才创建长度16的数组。

底层的数组是Node[],而非Entry[]。

jdk7:数组+链表 jdk8:数组+链表+红黑树

某一位置链表数据个数>8,且当前数组长度>64,此时此索引位置上的所有数据改为使用红黑树。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CymaBDaI-1592220099121)(E:\笔记\Pictures\QQ图片20200606101946.png)]

Map获取数据:

Map map = new HashMap();
map.put("chinese",88);
map.put("math",99);
map.put("english",77);
map.put("esle",82);
Set set = map.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}

Collection collection = map.values();
Iterator iterator1 = collection.iterator();
while (iterator1.hasNext()){
    System.out.println(iterator1.next());
}

Set set1 = map.entrySet();
Iterator iterator2 = set1.iterator();
while (iterator2.hasNext()){
    System.out.println(iterator2.next());
}

Properties

Properties pros = new Properties();
FileInputStream fis = new FileInputStream("yorumi.txt");
pros.load(fis);
String math = pros.getProperty("math");
System.out.println(math);

Collections工具类:操作Collection 、Map 的工具类

Collections.copy(dest,src)

List list = new ArrayList();
list.add(11);
list.add(22);
list.add(16);
list.add(56);

List dest = Arrays.asList(new Object[list.size()]);
Collections.copy(dest,list);
System.out.println(dest);

Collections里的线程安全方法。

List list1 = Collections.synchronizedList(list);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值