集合、泛型、Map

集合与数组

集合与数组的区别?
1.集合的长度是可变的,而数组一旦确定长度将无法改变
2.集合只能存储引用类型,而数组可以存储引用类型,也可以存储基本类型
3.集合内的元素可以是不同类型的元素,但是数组只能是同类元素

Collection集合的的功能

常用的方法有:
add()添加一个元素
addAll(Collection x)添加一个元素(该元素是一个集合)
clear()移除所有元素
remove()移除一个指定元素
contains()判断该集合包含指定元素
containsAll( Collection x) 判断该集合是否包含指定集合
还可以通过例如Iterator< E> iterator()等进行获取该类型元素的集合
size()用来判断集合的长度
isEmpty() 判断集合是否为空
retainAll(Collection c) 可以获取两个集合的公有元素
Object[] toArray() 可以将集合转换成数组 ,然后可用通过遍历该数组从而遍历该集合
也可以使用迭代器迭代

List集合

其可以使元素有序存储,并给每一个元素一个索引。期内的元素可以重复出现
常用的方法有:
add(int x ,X x)在指定索引添加指定的元素
remove()删除指定索引的元素
get() 返回指定索引的元素
set( )将指定索引出的元素 替换成另一个元素
List集合 可以同个size()获取集合长度,get()获取指定索引处的元素,并通过for循环对指定集合进行遍历。
ListIterator()是特有的迭代器功能 ,可以通过他的方法对集合进行遍历
hasNextInt() 后一位是否还有元素
hasPrevious(): 前面时候还存在元素
可以通过这两个方法对集合进行正向和反向的遍历
但是迭代器遍历集合也有缺陷
在迭代器遍历集合是无法对集合进行增删:
主要是因为在获取迭代器之后迭代器就确定类该集合的长度,如果在遍历过程中对其进行增删就会改变其长度,与迭代器以获取的长度的信息不符,会报错,ConcurrentModificationException(并发修改异常)

如何解决并发修改错误:
当我们用迭代器获取我们添加好元素的集合后,迭代器已知集合的长度,若在想要在遍历元素时使用集合的添加元素的方法就会产生错误。若想要不报错就需要利用迭代器自带的添加元素的方法,或者用for循环遍历集合,在过程中添加元素


List的三个子类ArrayList、Vector、LinkedList :
ArrayList和Vector的底层数据结构是数组,LinkedList是链表,前两者查询快增删慢,后者查询慢增删块
ArrayList和LinkedList的线程不安全但是效率高,Vector的线程安全但是效率不高
当想要线程安全应使用Vector,当需要效率快时应使用ArrayList和LinkedList

ArrayList

其可以对ArrayList字符串进行存储遍历‘
JDK1.8之后添加了对集合的遍历

Vector

其特有的功能有:
addElement(E obj) 给集合添加一个指定的元素
E elementAt(int index) 返回指定索引的元素

LinkedList

addFirst(E e) :将指定元素添加至列表开头
addLast(E e) : 将指定元素添加至列表结尾
E getFirst(): 返回此列表第一个元素
E getLast(): 返回此列表最后一个元素
E removeFirst(): 移除此列表开头元素
E removeLast() : 移除此列表最后的元素

泛型

其是指当创建对象的时候或者调用方法的时候才去表明自己明确类型,其存在是为了解决Object在实际应用中可能发生的类型转换的问题
优点:
1.避免了强制转换类型
2.优化程序,解决黄色线的警告
3.把运行时期的问题提前到了编译时期


把泛型定义在类上:public class 类名<泛型类型>
(泛型的类型必须是引用类型)
把泛型定义在方法上:public <泛型类型> 返回类型 方法名(泛型类型 变量名)
把泛型定义在接口上:public interface 接口名<泛型类型>

通配符

就是在上述的<>中填写?则表示任意类型,其就是Object或者任意的类型
填写? extends T 则是向下限定,表示T及其子类
填写? super T 则是向上限定,T及其父类

增强for

其是简化了for循环对数组和集合的遍历
其格式为
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}

Arrays中的asList()

其可以将数组转化成集合进行遍历,但是他所得到的集合的长度是不可变的
只能获取其中的元素,但不能对集合本身进行增删。

Set

Set集合内没有重复的元素
其子方法有HashSet()、LinkedHashSet()和TreeSet()
三者都可以存储字符串并进行遍历


HashSet
其底层的数据结构是哈希表
通过重写哈希链表,底层的hashcode和equals方法来确保元素的唯一性
LinkedHashSet
其底层的数据结构是哈希表和链表
通过重写哈希链表,底层的hashcode和equals方法来确保元素的唯一性而链表则保证了元素的有序
TreeSet
其底层数据结构是二叉树
首先将第一个元素作为树根,小于其放在左边,大于其放在右边,相等则不放入数中,这样就可以在排序的同时避免了重复元素的进入。就可以将元素进行排序
其排序的时候有两种方法
自然排序
比较器排序
自然排序需要元素实现Comparable接口,然后通过重写compareTo方法,将其返回的值作为排序的标准,对元素进行排xu
比较器排序重写Comparator接口,然后通过其返回值作为判断标准,顿元素进行排序

Map

其是一个通过键映射到值的对象 ,其中一个键最多只能映射一个值,也不能包含重复的键
Map接口和Collection接口的区别:
Map是双列且其底层的数据结构只对键有效,对值无效
Collection是单列其底层数据结构对元素有效
常用的Map方法
HashMap、LinkedMap和TreeMap
HashMap允许null值null键
TreeMap不允许null键
都可以通过底层的方法保证集合的元素唯一
后两者还可以通过自身的特性对元素进行排序(与LinkedSet和TreeSet的实现方式一样)
HashMap和Hashtable
前者线程不安全但效率高,且允许null键null值
后者则是线程安全 但效率不高,不允许null键null值
HashMap可以和自身嵌套,也可以嵌套ArrayList,同样ArrayList也可以嵌套HashMap
put(key, value):添加元素,(如果该建是第一次存储,就将给定值存入返回null,如果该键之前存储着元素,则将指定元素存入,返回上一次存储的元素)
clear():移除所有的键值对元素
remove():根据键删除指定元素
containsKey()查看是否包含指定键
containsValue()查看是否包含指定值
isEmpty() :判断集合是否为空
entrySet():返回一个键对应的Set集合
get()获取指定键的值
keySet():获取集合中所有键的集合
Map的遍历方法
1.通过keySet()遍历Map
2.通过entrySet(),利用其getKey()和getValue()对其进行遍历
Collections工具类
常用的方法:
sort() 对指定集合排序
binarySearch() 通过二分查找,寻找键
max() 获取最大值
reverse(): 将集合翻转
shuffle():将集合随机排序
Collection与Collections的区别:
前者是集合类的一个接口,提供更具体的子类接口实现需要的功能
后者是前者进行操作集合的静态组成方法如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都将抛出 NullPointerException。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值