Java进阶---集合

PS : 前段时间花了大半个月的时间了解前端的一些基本知识,现在转向后端开发。X之前学过java,但是当时在学习d的过程中缺乏实践和整理,现在有一部分知识已经健忘,比如集合、I/O、反射、多线程以及网络编程等。我们知道,学习Web后端得要有扎实的Java基础。所以现在先重新捡起这几个方面的知识,加深印象。

 

一.Collection

1.集合与数组的区别

集合,集合是java中提供的一种容器,可以用来存储多个数据。

数组的长度是固定的。集合的长度是可变的。而集合中存储的元素必须是引用类型数据

2.Collection 接口

一些集合允许重复的元素,而其他的则不允许。有些是有序和无序的人。JDK没有提供这个接口的任何直接的实现:它提供更具体的子接口像 Set和 List实现。此接口通常用于通过收集和操纵他们最大的共性是理想。

下面是Collection接口下的常用的方法:

PS : Collection下的子接口和子接口的实现类都拥有Collection接口下的方法

3.迭代器

a:java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。

b:Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代

Iterator常用的两个方法:

 

c:Iterator的并发修改异常

并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。

那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。

4. 泛型

至于什么是泛型,我就不说了

1. 泛型的好处

a:将运行时期的ClassCastException,转移到了编译时期变成了编译失败。

b:避免了类型强转的麻烦

2. 泛型的通配

匹配所有的数据类型   " ? "

? extends 父类 限制的是父类, 上限限定, 可以传递Employee,传递他的子类对象

? super  父类 限制的是子类, 下限限定, 可以传递Employee,传递他的父类对象

二、List

一个有序集合(也被称为序列)。此接口的用户在列表中的每个元素都被插入的地方有精确的控制。用户可以通过它们的整数索引(在列表中的位置)访问元素,并在列表中搜索元素。并且可以存储重复的元素

1.List接口 特有常用方法

2.ArrayList和LinkedList

这两个List接口下的实现类就不单独展开了,下面就说说这两个实现类的区别:

ArrayList : 底层数据结构是数组,查询快,增删慢

LinkedList : 底层数据结构是链表,查询慢,增删快。LinkedList提供了大量首尾操作的方法

三、Set

不能存储重复的元素

1. HashSet 

HashSet集合,实际上是HashMap.采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

规则如下:先判断新元素与集合内已经有的旧元素的HashCode值

a:如果不同,说明是不同元素,添加到集合。

b:如果相同,再判断equals比较结果。返回true则相同元素;返回false则不同元素,添加到集合。

所以,使用HashSet存储自定义类型,如果没有重写该类的hashCode与equals方法,则判断重复时,使用的是地址值,如果想通过内容比较元素是否相同,需要重写该元素类的hashcode与equals方法。

哈希表的存储过程:

2.HashSet和LinkedHashSet区别

HashSet :

a:底层结构是 哈希表结构

b:元素的存与取的顺序不能保证一致

LinkedHashSet

a:底层结构是 哈希表结构 + 链表结构

b:元素的存与取的顺序一致

四、Map

a:Map集合中的元素都是成对出现,成对存储的

b:Map集合中的元素都是以一对键和值的形式组成存在的,称为键值对,理解为夫妻对

c:Map集合中的键不能重复存储,值可以重复。依然通过重写hashCode() 与 equals()方法来保证键的唯一

d:Map集合中的每一个键 对应着一个值

1.Map接口下的常用方法:

2.Entry键值对对象

在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

Map.Entry<k,v>下的常用两个方法:

3.HashMap和LinkedHashMap

HashMap和LinkedHashMap的区别:

HashMap:

a:底层采用哈希表结构

b:不能保证元素存与取的顺序完全一致

LinkedHashMap:

a:底层采用哈希表+链表结构

b:继承自 HashMap,具有高效性,同时在 HashMap 的基础上,又在内部增加了一个链表,用以存放元素的顺序。

4.Map集合遍历的两种方式

方式1:根据键找值的方式

 

方式2:根据键值对对象找键和值的方式


注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了

 

最后,附张集合继承体系的面向对象思想图

 

 

 

 

### 回答1: comparator是Java中的一个接口,用于比较两个对象的大小。它可以用于对集合中的元素进行排序,也可以用于自定义排序规则。实现comparator接口需要重写compare方法,该方法返回一个整数值,表示两个对象的大小关系。如果返回负数,则表示第一个对象小于第二个对象;如果返回正数,则表示第一个对象大于第二个对象;如果返回,则表示两个对象相等。comparator接口可以与Java中的排序算法一起使用,例如Collections.sort()方法。 ### 回答2: jmu-java-04面向对象进阶--02-接口-comparator讲述了Java中的接口以及比较器的使用。接口是一种约束,它规定了某个类必须要实现哪些方法,但不需要具体的实现方式。比较器则是一种接口,它规定了两个对象之间的排序方式。 在Java中,接口的定义方式为interface,其中的方法默认为public abstract形式。定义接口时,需要注意接口只能继承接口,并且可以有常量,但不能有成员变量。另外,接口中所有的方法都没有方法体,必须由实现它的类去具体实现。举例来说,如果我们定义一个接口Animal,可以定义一个方法move(),而实现这个接口的类必须实现move()方法,并且可以自由决定具体的实现方式,如Dog类可以实现为跑步,Bird类可以实现为飞行。 在讨论了接口的使用之后,jmu-java-04面向对象进阶--02-接口-comparator着重介绍了比较器的使用。比较器类似于一个工具箱,可以定义多种比较方式供其他类使用。比较器的核心类是Comparator,其定义的方法为compare(),用于比较两个对象并返回结果(0、1或-1)。比较器可以用于对对象进行排序或查找指定的对象。 在使用比较器时,需要实现Comparator接口,并覆盖compare()方法。比如,我们可以定义一个Person类,并在其中实现Comparator接口,然后在compare()方法中指定按照年龄从小到大排序。当我们使用Collections.sort()对Person列表进行排序时,就会按照我们定义的比较方式进行排序。 总的来说,jmu-java-04面向对象进阶--02-接口-comparator讲述了Java中的接口和比较器的使用,这是Java中优秀的编程方式之一,也是开发者必备的基本知识。掌握了接口和比较器的使用,我们就可以更好地实现面向对象编程,并对Java中的集合框架有更深刻的理解。 ### 回答3: Comparator是Java中一个非常重要的接口,它主要用于定义对象之间的比较规则。在Java中,比较规则是由比较器来实现的。比较器可以用于排序、查找和其他需要比较的场景。 Comparator接口有一个方法compare(Object o1, Object o2),用于比较两个对象的大小。如果o1大于o2,则该方法返回一个正整数;如果o1小于o2,则该方法返回一个负整数;如果o1等于o2,则该方法返回0。 我们可以使用Comparator接口来实现自定义的比较规则。比如,我们可以定义一个Student类,包含姓名和年龄两个属性,然后实现一个比较器,按照年龄从小到大的顺序对Student对象进行排序。 可以通过使用Collections.sort()方法对Student对象进行排序,提供一个实现Comparator接口的比较器作为参数进行排序。 实现一个比较器还可以实现多种排序方式。例如,按照姓名从小到大排序,实现如下: ``` public class NameComparator implements Comparator<Student> { public int compare(Student s1, Student s2) { return s1.getName().compareTo(s2.getName()); } } ``` 在使用时,我们可以将NameComparator对象作为参数传递给sort()方法,进行姓名排序。 Comparator接口的使用不仅仅局限于对象的比较排序,还可以用于其他需要比较的场景,比如查找、筛选等。例如,我们可以按照年龄筛选出年龄大于20岁的Student对象,并将它们存储在一个新的List中,实现如下: ``` List<Student> ageGreaterThan20 = students.stream() .filter(s -> s.getAge() > 20) .sorted(new AgeComparator()) .collect(Collectors.toList()); ``` 以上的代码使用了Java 8的新特性,使用流将年龄大于20岁的Student对象筛选出来,并按照年龄进行排序,最后存储在一个新的List中。 总之,Comparator是一个非常重要的接口,在Java中有着广泛的应用。掌握Comparator的使用可以帮助我们快速地实现对象比较、排序、筛选等操作,提高我们的编程效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值