集合
来源:互联网 发布:vt和vi的区别 知乎 编辑:程序博客网 时间:2024/05/12 05:09
集合
一、集合的由来:
1、集合的由来:数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少
2、数组和集合的区别
区别1 :数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值。
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
区别2:数组长度是固定的,不能自动增长
集合的长度的是可变的,可以根据元素的增加而增长
3、数组和集合什么时候用
1,如果元素个数是固定的推荐用数组
2,如果元素个数不是固定的推荐用集合
二、集合的遍历之集合转数组遍历
1、集合的遍历 其实就是依次获取集合中的每一个元素。
2、把集合转成数组,可以实现集合的遍历
三、集合的遍历之迭代器遍历
1、迭代器概述:集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)
2、迭代器的使用
Collectionc = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iteratorit = c.iterator(); //获取迭代器的引用
while(it.hasNext()){ //集合中的迭代方法(遍历)
System.out.println(it.next());
}
四、迭代器的原理及源码解析
1、迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可
2、迭代器源码解析
(1)在eclipse中ctrl + shift + t找到ArrayList类
(2)ctrl+o查找iterator()方法
(3)查看返回值类型是new Itr(),说明Itr这个类实现Iterator接口
(4)查找Itr这个内部类,发现重写了Iterator中的所有抽象方法
五、并发修改异常的解决方案
1、迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
2、集合遍历元素,集合修改元素
六、数据结构之数组和链表的区别:
1、数组
查询快修改也快
增删慢
2:链表
查询慢,修改也慢
增删快
七、集合框架List的三个子类的特点
1、List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
Vector和ArrayList的区别
Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的
ArrayList和LinkedList的区别
ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的
2、List的应用:
查询多用ArrayList
增删多用LinkedList
如果都多ArrayList
八、泛型的基本使用
1、泛型好处
提高安全性(将运行期的错误转换到编译期)
省去强转的麻烦
2、泛型基本使用
<>中放的必须是引用数据类型
3、泛型使用注意事项
前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
九、三种迭代的能否删除
普通for循环,可以删除,但是索引要--
迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
增强for循环不能删除
十、可变参数的概述和使用
1、可变参数概述
定义方法的时候不知道该定义多少个参数
2、格式
修饰符返回值类型方法名(数据类型… 变量名){}
3、注意事项:
这里的变量其实是一个数组
如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
十一、HashSet如何保证元素唯一性的原理
1.HashSet原理
我们使用Set集合都是需要去掉重复元素的,如果在存储的时候逐个equals()比较,效率较低,哈希算法提高了去重复的效率,降低了使用equals()方法的次数
当HashSet调用add()方法存储对象的时候,先调用对象的hashCode()方法得到一个哈希值,然后在集合中查找是否有哈希值相同的对象
如果没有哈希值相同的对象就直接存入集合
如果有哈希值相同的对象,就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
2.将自定义类的对象存入HashSet去重复
类中必须重写hashCode()和equals()方法
hashCode():属性相同的对象返回值必须相同,属性不同的返回值尽量不同(提高效率)
equals():属性相同返回true,属性不同返回false,返回false的时候存储
十二、TreeSet原理的特点和使用方式
1.特点
TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列
2.使用方式
a.自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定一个Comparator
如果传入了Comparator的子类对象,那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
调用的对象是compare方法的第一个参数,集合中的对象是compare方法的第二个参数
c.两种方式的区别
TreeSet构造函数什么都不传,默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator,就优先按照Comparator
十三、Map集合概述和特点
1、Map接口概述
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值
2、Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
3、Map集合的功能概述
a:添加功能
V put(K key,V value):添加元素。
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
voidclear():移除所有的键值对元素
Vremove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
booleancontainsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
d:获取功能
Set<Map.Entry<K,V>>entrySet():
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
e:长度功能
int size():返回集合中的键值对的个数
4、Map集合的遍历之键找值
键找值思路:
获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值
5、Map集合的遍历之键值对对象找键和值)
键值对对象找键和值思路:
获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值
十四、HashMap和Hashtable的区别
Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
Hashtable不可以存储null键和null值,HashMap可以存储null键和null值
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- 集合
- C语言重要常用知识点梳理
- Matlab中cat()函数
- Android中对Apk加固(加壳)续篇之---对Native层(so文件)进行加固
- JAVA Hibernate工作原理及为什么要用(hibernate 简介)
- <精华帖>在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .
- 集合
- in和exists的区别
- Unix环境编程学习笔记-----编程实例---- the normal exit1
- BestCoder Round #63 (div.2)1003matrix
- php 上传文件视频显示未找到文件错误
- nginx proxy_pass 后面的url 加与不加/的区别
- c中(),[],{}的作用和用法
- 反射
- MySQL批量插入,,SQL插入性能优化