(小技巧:alt+7 可以调出来一个窗口 通过这个窗口可以查看这个类的所有成员信息)
(接口)
(Arraylist实现了list接口 而list接口可以继承Collection接口 从而实现间接Collection)
具体代码
<>里说明的是集合元素的类型
具体代码演示
注意 返回值类型为void的方法,直接调用,无需接变量,也无法输出
返回值类型为Boolean的方法,有些会对集合做一些操作,这时重点在于对集合的操作,有些而是直接判断,这时重点在于对集合的判断
Collection集合有自己专用的迭代器,但是不能直接创建,而是需要通过该集合的方法的返回值得到,返回值是实现迭代器这个接口的实现类,所以这里是多态的方式创建了Iterator对象。
具体代码
Iterator 自定义变量名 = Collection类对象.iterator();
注意这里的泛型E与Collection类的泛型保持一致。
对于迭代器这个接口有两个方法,具体介绍看向上第三图
注意,因为next方法 返回的是集合下一个元素,所以在该循环中,无需用i 和 i++来控制循环。
注意,调用it的next方法时,返回的是集合中的元素,所以要用与集合的元素类型一致的变量接住,再进行后续操作。
(接口)
创建对象时,与Collection一致,采用多态的方式,new一个arraylist,arraylist实现了list接口。
由于list接口继承了Collection接口,所以,list可以使用collection的方法
注意 对对象进行遍历时,对于一个标准流对象,要用如getName这样get方法来获取成员数据进而输出。
注意 对于一些返回值为泛型的方法,会返回集合的元素
注意 如果索引值越界,会报错,索引越界
由于在平时开发中,使用Collection的Itterator迭代器较多,所以前四个不作为重点
重点来看 最后一个方法
这个列表迭代器可以用来对集合长度做修改,这是区别于Collection迭代器的。
使用迭代器遍历时,修改了集合中元素的长度(例如上图中 list.add()),所以造成并发修改异常,改为for循环即可解决
s.equals(“元素”)用于判断list集合中是否有该元素,这里利用字符串内容相同来判断,s为list集合中的某一个元素,判断某一个元素的内容是否与“world”(题目指定内容)相同
小技巧
可以用数组或者集合对象 点一个for 即可生成增强for
例如 list.for
具体代码
这里可以利用Iterator迭代器并发修改异常这一特点,来判断增强for循环内部原理是一个Iterator迭代器
(接口)
创建对象时,因为set集合仍然是一个接口,所以还是要用其子类进行实例化,如下图
注意,set集合不包含重复元素,所以如果添加了重复元素,那么,只会输出一次,如上图,添加了两个“world”,只输出了一个world
这里是否保留重复元素,要看哈希值是否重复且内容是否重复,而哈希值与地址值有关。哈希值是否重复且内容是否重复,二者都重复才会被认为是重复元素,否则,不会被认为是重复元素,也就不会被哈希表限制存入,也就不会被set集合限制输出。
因为hascode是object类中的方法,所以随便new一个类都可以直接调用
默认情况下:
对于不同的对象,就算内容相同,那么哈希值仍然不一样
对于字符串,内容如果相同,那么哈希值就相同,因为像上图方式直接创建字符串对象的话。创建的字符串会放在常量池,那么内容相同的字符串,其地址就会相同,那么哈希值也就相同。
有两个特例的字符串,内容不同但是哈希值相同
非默认情况下:
在对象类里重写object的hascode方法,并返回一个值,那么该类的所有对象的所有hascode调用出来的值都为返回值
具体代码
与set集合大体一致,只不过创建的是hashSet集合对象而已
因为内容相同但是new出来的两个不同的对象,地址不同,那么哈希值就不同,那么就会在输出时输出相同的内容
那么如果想实现将不同的对象但是内容相同,只输出一次,基于哈希值,除了内容相同之外,还需要哈希值相同,那么需要在对象所抽象的类当中重写hascode和equals方法(以保证哈希值与内容都相同),具体操作直接alt+ins 自动生成即可。(结合下面哈希表理解)
哈希表是一个数组+链表的形式
存储序号由元素的哈希值对16取余计算得到,如果取余结果相同,那么会比较哈希值,不同则会存入该序号的链表,相同的话进一步比较内容,不同则存入链表,相同则不会存入,这也就使得哈希表中元素不重复。
注意 对于基本数据类型,不可直接使用集合,因为集合只针对引用类型数据,所以,想要存入基本数据类型,就要将基本数据类型换成对应的基本类型包装类,例如:想要存入整数int 就不能在尖括号里写“int”,而是应该写int对应得基本类型包装类 Integer
注意仍然是不可重复,但是排序有两种方式,由创建集合时使用得构造方法决定
如下图,采用无参构造器创建集合,那么数据会按照自然排序(从小到大)
(Comparable是一个接口)
使用TreeSet集合存储对象元素并且使用无参构造器想要实现自然排序时,要将元素的类实现Comparable接口,并重写compareTo方法,如下图
而返回值有说法:
return 0 :只输出一个元素
return 1 :元素以存储顺序正常排序(升序)
return -1:元素以存储顺序逆序排序(降序)
(下图为降序)
自然排序:对制定需求设置规则
这里this.age是第二个元素中某一个数据,s.age是第一个元素中某一个数据,所以这里满足“年龄按照从小到大排序”
应用案例
这里考虑主要条件与次要条件,次要条件用三元选择器进行选择。
注意,这里重写方法之后,里面compareto方法就是自然排序比较的功能,其返回值是0或者正数或者负数,this.name是集合中第二个元素,s.name是集合中第一个元素。
简介
直接在测试类里定于对象时,就用有参构造器进行排序以及规则制定,这里参数传入一个Comparator实现类对象,采用内部类的方式。
同时传入两个参数,s1为后传入的元素,s2为先传入的元素,而且在制定规则时,采用get方法获取数据
字符串可以直接调用CompareTo方法,用于比较字符串是否相同,格式如图。