一、集合Collection<E>
1、定义
数据存储的容器,大小不固定。
Collection集合层次的顶级接口。
<Ē>表示泛型---用于限定元素的数据类型的---而且由于泛型的限定,集合中只能存储引用类型的数据。
2 、集合中的成员
1、List<E>集合-----有序列表
有序集合---指的是保证元素的存入顺序,可以重复添加元素
1.2、常用直接子类
1-顺序表ArrayList<E>
特点:基于数组。默认初始容量为10,每次扩容是在原数组的基础上增加一半。基于右移运算 10->15 ->22.内存空间连续。插入或者删除一个元素相对效率较低,查询元素相对效率比较高。是一个线程不安全的集合.
常用方法 | |
---|---|
add() | 向列表添加一个元素 |
size() | 获取集合的大小 |
get() | 得到索引处的值 |
toArray() | 将集合转化成数组 |
remove() | 删除元素 |
set() | 修改索引处的元素 |
ArrayList<String> str = new ArrayList<>();
str.add("a");
str.add("b");
str.add("a");
str.add("asdd12");
System.out.println(Arrays.toString(str.toArray()));//[a, b, a, asdd12]
System.out.println(str.size());//4
System.out.println(str.get(2));//a
System.out.println(str.remove("a"));//默认删除第一个符合的元素
System.out.println(str.remove(1));//删除索引的元素
System.out.println(Arrays.toString(str.toArray()));//[b, asdd12]
System.out.println(str.get(0));//b
2-链表LinkedList
特点: 基于链表。用节点(Node)来存储元素。内存空间不连续。插入或者删除元素的效率相对较快,
查询元素效率相对较低。是一个线程不安全的集合
(双端队列)Deque<E>extends Queue<E>(队列
ArrayList和LinkedList的区别 | |
---|---|
不同点 | -底层的数据结构不同,ArrayList(基于数组),LinkedList(基于链表)-读数据:某些场景下ArrayList效率高于LinkedList-写(添加/删除)数据:LinkedList效率高于ArrayList |
相同点 | 相同点:-都实现List接日-线程不安全的集合 |
LinkedList<String> str = new LinkedList<>();
str.add("aa");
System.out.println(Arrays.toString(str.toArray()));//aa
str.push("bb");//压栈,把添加的元素放到第一位
str.push("cc");//压栈,把添加的元素放到第一位
System.out.println(Arrays.toString(str.toArray()));//cc bb aa
str.addFirst("第一");
str.addLast("最后");
System.out.println(Arrays.toString(str.toArray()));//[第一, cc, bb, aa, 最后]
System.out.println(str.pop());//第一
3-Vector向量
特点:是ava中最早的集合。底层是基于数组的。默认初始容量是10,每次扩容一倍。
基于三元运算。是一个线程安全的集合
4-stack 栈
特点:遵循先进后出的原则。向栈中添加元素---入栈/压栈,
将元素从栈中取出---出栈/弹栈,最先放入栈中的元素---栈底元素,最后放入栈中的元素---栈顶元素---底层是用的Vector实现的
2、Set<E>集合-----无序列表
不包含重复的元素
2.1 常用的直接子类
HasheSet
特点:不保证元素的存入顺序
默认初始容量是16,加载因子是0.75f,默认扩容一倍。是一个线程不安全的集底层基于HashMap(映射)。
3、迭代器
Iterator 迭代器,用于迭代遍历集合---在迭代过程中“不允许增删原集合"
Iterable提供了个iterator方法来产生一个Iterator对象。增强for循环本质上在迭代遍历
如果一个对象允许使用增强for循环遍历,则这个对象对应的类必须实现Iterable接口。---JDK1.5的特性之一
案例:
利用迭代器遍历set
HashSet<String> names= new HashSet<>();
names.add("张三");
names.add("李川");
names.add("王五");
//迭代器
//1-先将集合转化为迭代器对象
Iterator<string> iterator =names.iterator();
//2-利用迭代器的方法实现遍历
while (iterator.hasNext()){
String next = iterator.next()
System.out.println(next)
}
4、Collections集合工具类
方法 | 意义 |
---|---|
sort() | 默认升序 |
reverse() | 将集合的元素反转顺序 |
shuffle() | 打乱原来元素的顺序(随机洗牌) |
5、Comparator 比较器
比较器。重写compare方法,将比较规则写到compare方法中。
如果返回一个正数,则意味着第一个参数要排在第二个参数后边:如果返回一个负数,则意味着第一个参数要排在第二个参数前边。
如果在排序的时候没有指定比较规则,那么这个时候要求排序的元素所对应的类必须实现comparab重写接口中compareTo万法
二、泛型
对数据类型的泛型化 :(数据类型不确定)
泛型的定义方式 : <大写字母> -----<T><E>;单个字母大写是规范,字母可以自定义<T> 位置: 泛型定义出现在类上----泛型类ArrayList<E>
泛型定义出现在方法上----泛型方法泛型定义出现在接口上----泛型接口List<E>
类/接口:
泛型定义应写到名称后方法:
泛型定义应写到返回值类型前。
泛型被具体类型的替换的过程---泛型的擦除---发生在编译期 ? extends 类/接口---表示这个类/接口及其子类/子接口(上限)
? super 类/接口---表示这个类/接口及其父类/父接口(下限)
?表示通配符 --- List<?>
三、映射----Map<K , V>
1、HashMap
在idk1.8中底层是通过数组+链表+红黑树实现:
当链表个数达到8个时,链表转为红黑树:TREEIEY THRESHOLD =8:
红黑树节点个数小于等于6时,红黑树转为链表:UNTREEIFY THRESHOLD = 6;
在HashMap中由键的哈希值确定放入哪个桶中---允许键或者值为nu11,默认初始容量是16,加载因子是0.75f,每次扩容一倍。是一个异步式线程不安全的映射。
常用方法 | |
---|---|
put() | 将键值对添加到映射中 |
get() | 传入key值获取对应的value值 |
keySet() | 将映射中的所有key以Set集合返回 |
entrySet() | 将键值对包装到Entry中返回Set集合---键值对集合 |
2、HashTable 不允许键或者值为nu11,默认初始容量是11,加载因子是0.75f。是一个同步式线程安全的映射 3、ConcurrentHashMap
异步式线程安全的映射
jdk1.5:
JUC->Java Util Concurrent java的并发工具集