Collection
集合:存储对象的容器。
Collection:根接口,这个体系下有些集合可以存储重复元素,而另一些不允许,有一些存储元素是有序,另一些是无序的。
集合和数组的区别
长度:
数组一旦创建长度不可改变
集合长度可变
存储元素:
数组可以存储基本数据类型和引用数据类型
集合只能存储引用类型
List
List:存储元素有序(存入和取出的顺序一致),可重复。
void add(int index, E element):在指定位置添加元素
E get(int index):获取指定位置上的元素
E set(int index, E element):修改指定位置的元素
E remove(int index):删除指定元素
List三个实现类的特点:
ArrayList:底层数组,查询快,增删慢。
线程不安全,效率高。
Vector:底层数组,查询快,增删慢。
线程安全,效率低。
LinkedList:底层链表,查询慢,增删快。
泛型
泛型:创建集合是明确集合中存储的数据类型。
语法:
<引用数据类型>
泛型好处:
1.避免了强制类型转换
2.将运行时期错误提前到编译时期
3.解决了黄色警告线
forEach
forEach:遍历数组集合
语法:
for(元素的数据类型 变量名:数组或者集合的名称){
使用该变量,该变量就是每一个元素
}
注意:
1.底层迭代器
好处:
简化了遍历代码
HashSet
如何保证元素唯一?
HashSet的add()方法底层依靠两个方法:hashCode()和equals()
方法的执行步骤:
首先执行hashCode(),比较对象的哈希值
相同:会执行equals()方法
内容不同:存储
内容相同:不存
不同:直接存储
TreeSet
特点:排序,唯一。
排序的方式:
自然排序
比较器排序
自然排序:如果一个类想要实现自然排序,必须实现comparable接口
比较器排序:需要使用带参构造,传递一个compartor的实现类对象
LinkedHashSet
特点:有序,唯一。
Map
collection和Map的区别?
collection每次存储一个元素,Set集合是不可重复,List集合是可重复。
Map集合每次存储两个元素,键不可重复,值可重复。
Map集合遍历方式1:
1.得到所有的键存放在Set集合中 -- keySet()
2.遍历键所在的集合,得到每一个键
3.通过当前的键得到对应的值
代码:
Set<泛型> keys = 集合名.keySet();
for(泛型 key: keys){
值的数据类型 value = 集合名.get(key);
}
Map遍历第二种方式:
1.拿到每一个键值对存储在集合中
2.遍历键值对所在的集合,拿到每一组键值对
3.通过该键值对,获取键,获取值
代码:
Map<String, String> map = new HashMap<String, String>();
Set<Map.Entry<String, String>> entrys = map.entrySet();
for(Map.Entry<String, String> entry:entrys){
//K getKey():返回与此项对应的键。
//V getValue():返回与此项对应的值。
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+" "+value);
}
HashMap
注:使用HashMap集合存储键值对,自定义对象作为键,需要在类中覆盖hashCode()和equals()方法。
HashMap和Hashtable的区别?
HashMap可以存储null键和null值,线程不安全,效率高
Hashtable不可以存储null键和null值,线程安全,效率低
TreeMap
注:使用TreeMap集合存储键值对,自定义对象作为键,需要在类中实现排序接口,覆盖接口中的方法。
LinkedHashMap
LinkedHahshMap:键有序,唯一