123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- 集合
- 集合和数组的区别
- 相同点:
- 集合和数组都是一种容器,可以存储多个数据。
- 不同点:
- 数组长度不可变,集合的长度是可变的。
- 数组可以存储基本数据类型也可以存储引用数据类型
- 集合只能存储引用数据类型。如果想存储基本数据类型,需要存储基本数据类型对用的包装器类
- 基本类型 类
- byte -> Byte
- short -> Short
- int -> Integer
- long -> Long
- float -> Float
- double -> Double
- char -> Character
- boolean ->Boolean
- Java中集合的类型分为两种:
- 单列集合
- 有序、可重复
- 无序、不可重复
- 双列集合
- Collection集合
- 是单列集合的顶层接口,它表示一组对象,这些对象也可以称为Collection的元素
- java中不提供关于Collection集合的任何直接实现类,它提供更具体的子接口的实现类。
- 没有关于直接实现Collection集合的实现类,但是有Collection集合子接口(List、Set)的实现类
- 如果想要创建Collection集合的对象。
- 就需要采用多态的形式,创建Collection集合的实现类对象。比如ArrayList.
- 缺少遍历集合的方式
- Collection集合遍历的方式------迭代器
- 迭代器是专门用来遍历集合的。
- 迭代器是一个类,也是一个方法。
- //1、调用迭代器方法获取迭代器对象
- Iterator it = c.iterator();
- //再通过迭代器对象,调用方法,结合循环,实现遍历。
- //2、直接使用while循环
- //hasNext() 判断当前的位置的元素是否能被取出。 判断什么时候要结束循环
- //next() 获取当前位置的元素,然后将迭代器指向下一个元素位置。
- while (it.hasNext()){
- Object o = it.next(); //获取元素对象,从集合的最开始,获取一个有一个的元素,赋值给o对象
- //至于后面的操作,是输出,还是做运算,都可以.....
- System.out.println(o);
- }
- foreach迭代器
- 格式:
- for(元素类型 变量名 : 集合名){
- //使用变量
- }
- List集合(还是个接口)
- 是一种有序的集合,这里面的有序指的是【存取顺序】
- 我们可以精确的控制List集合中每个元素的插入位置,我们可以通过整数索引值来访问元素,并且可以搜索列表中的元素
- List允许放重复元素。
- List集合的特点:
- 1、存取有序
- 2、可以重复
- 3、有索引
- List常用的方法: (E 其实是泛型,可以使用任何类型,作用其实是规定要向集合中存取的元素类型)
- add(int index,E element) 在指定位置插入指定的元素
- E remove(int index) 删除集合中指定索引值位置的元素,并且返回被删除的元素
- E set(int index, E element) 修改指定索引位置的元素,返回被修改的元素
- E get(int index) 返回指定索引位置的元素。
- List接口是继承于Collection接口的,Collection接口里的方法List也都拥有
- 1、创建一个学生类,包含id、name、age属性,配置构造方法和setter、getter方法
- 创建ArrayList集合。
- ArrayList<Student> list=new ArrayList<>();
- list.add();
- 向集合中添加5个学生对象
- 获取索引值为3的学生的姓名
- 移除集合中索引值为4的学生
- 遍历集合
- 清空集合。
- 2、创建一个教师类,包含id、name、age属性,配置构造方法和setter、getter方法
- 创建LinkedList集合。
- 向集合中添加5个教师对象
- 获取索引值为3的教师的姓名
- 移除集合中索引值为4的教师
- 遍历集合
- 清空集合。
- 3、创建一个Person类,包含id、name、age属性,配置构造方法和setter、getter方法
- 创建LinkedList集合。
- 向集合中添加5个Person对象
- 获取索引值为3的Person的姓名
- 移除集合中索引值为4的Person对象
- 遍历集合
- 清空集合。
- 4、创建一个Person类,包含id、name、age属性,配置构造方法和setter、getter方法
- 创建ArrayList集合。
- 向集合中添加5个Person对象
- 获取索引值为3的Person的姓名
- 移除集合中索引值为4的Person对象
- 遍历集合
- 清空集合。
- Set集合
- Set集合不能存储重复元素
- Set集合没有索引,不能使用for循环遍历(可以使用foreach)
- Set集合也是一种接口,继承Collection集合
- Set集合常用的实现类分为:
- HashSet
- TreeSet
- HashSet集合
- HashSet集合的底层数据结构是哈希表
- 特点存取无序,存入的顺序和取出的顺序不一定一样。
- 不能存入重复元素
- 没有索引,不能使用for循环遍历
- hashSet集合,其实就是把一个又一个对象进行哈希运算(计算出hash码)后,再根据哈希值的顺序存入到集合中。
- 所以,我们存入集合的顺序,和取出元素的顺序是不一致的。
- HashCode(哈希值)
- 哈希值是JDK根据对象的地址或字符串或者数字进行计算,算出来的int类型的数值。
- 如果想获取某个对象的哈希值,可以调用对象.hashCode()方法。就会返回对象的哈希值。
- 哈希值(哈希码)特点:
- 同一个对象多次调用hashCode()方法,返回的hashCode值是相同的。
- 默认的情况下,不同的对象的哈希码值是不同的。
- 我们重写hashCode()方法的目的就是实现让不同的对象的哈希值相同。
- 使用HashSet集合存储学生对象并且遍历,
- - 创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合
- - 要求:学生对象的成员变量值相同,我们就认为是同一个对象
- 如果要使用HashSet集合存某个类型的对象,那么该类必须要先同时重写equals方法和hashCode方法
- TreeSet集合
- 不能存储重复元素
- 没有索引
- 可以将元素按照规则进行排序
- new TreeSet() 无参构造方法 让元素按照自然排序规则进行排序
- new TreeSet(Comparator c) 根据指定的比较器进行排序
- 注意:
- 任何存入TreeSet集合的引用类型对象,都必须要继承Comparable接口,并且重写compareTo方法,设定好两个对象的比较规则(比较大小)
- 自然排序:自定义类实现Comparable接口,并且重写compareTo方法,根据返回值进行排序
- 比较器排序:创建TreeSet对象的时候,传递Comparator的实现类对象(匿名内部类、lambda表达式),
- 重写compare(o1,o2)方法,然后根据返回值进行排序。
- 我们在使用TreeSet集合的时候,默认使用的是自然排序,但是当自然排序不能满足我们的业务需求的时候,就必须要使用比较器排序。
- 两种方式关于返回值的规则:
- 如果返回值是负数,表示当前存入的元素是较小值,存左边。
- 如果返回值是0,表示当前存入的元素是重复值,不存。
- 如果返回值是正数,表示当前存入的元素是较大值,存右边。
|