数组和集合的区别
1)数组的长度一初始化就是固定的,不能改变;
集合长度可变。
2)元素固定,建议用数组,因为效率快直接在内存中创建了数组,元素个数多少,数组长度就定义多大;
部分集合底层也是数组实现的,它会有个初始值,超过这个初始值就会再重新创建一个数组将原数组元素
拷贝到新数组中。
Collection col = new ArrayList();col.add(123); //object自动装箱了col.clear(); //清空集合
col1.constainsAll(col2); //传入的集合是当前集合的子集就返回true;
col1.removeAll(col2);
//只要是调用集合col1中包含了col2中的元素,包含的元素删除(删除交集)
即:col1与col2有交集,删除交集,返回值为true; 无交集,返回值为false;
col1.retainAll(col2);
//取两个集合交集,再赋值给调用集合;只要调用的集合(原集合col1)改变了返回值为true,否则false;
List 和 Set 区别?
List: 可重复,有存储顺序;set:不可重复,无序;
易错题1:
for(Iterator it = list.iterator();it.hasNext();) {
String str = (String)it.next();
if(str.equals("bbb"))
list.add("ddd"); //出现异常:并发修改异常ConcurrentModificationException
}
//解决办法:使用ListIterator,Iterator的子类,功能更加强大。
ListIterator中有一个add方法。
int[] arr = {1,2,3};
for(int i : arr){ //增强for循环,i是定义临时变量,记录中容器的元素,arr代表的是容器
System.out.println(i+" ");
}
增强for循环底层也依赖于迭代器,所以在遍历的时候也不允许添加操作。
ArrayList、LinkedList、Vector区别
ArrayList 数组实现,增删慢,查找快;LinkedList 链表实现,增删快,查找慢;Vector 数组实现,原理和ArrayList相同,但线程安全,增删慢,查找慢;
Set
不可重复, 没索引
HashSet
使用哈希算法去重复, 效率高, 但元素无序
TreeSet
使用二叉树算法排序, 可以指定元素的存储顺序
LinkedHashSet
HashSet的子类, 原理相同, 除了去重复之外还能保留存储顺序
HashSet
1.HashSet原理
我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低
哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
如果没有哈希值相同的对象就直接存入集合
如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较
比较结果为false就存入, true则不存
2.将自定义类的对象存入HashSet去重复
类中必须重写hashCode()和equals()方法
hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
equals(): 属性相同返回true, 属性不同返回false
TreeSet
1.特点
TreeSet是用排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
2.使用方式
a.自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象强转成Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator, 那么TreeSet就不会按照自然顺序排序了
add()方法内部会自动调用Comparator接口中compare()方法排序
c.两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator
Map集合: 存储键值对
Map直接子类:HashMapHashtableLinkedHashMapTreeMap
方法put(key,value); //与add作用相同putAll(map); //相当于addAll
map集合键值唯一:相同键值的数据添加到map,后面的值会将前面的值覆盖clear(); //清空mapremove(key); //删除key,并将value返回containsKey(key); //是否包含keycontainsValue(value); //是否包含valueisEmpty(); //map是否为空
int size(); //获取map集合元素个数V get(key);//通过键获取值,还可以作为判断某个键是否存在的依据,不存在返回nullCollection values(); //获取map集合中所有值;Set keySet(); //获取map集合中所有键entrySet();
//遍历集合Set<String> set = map.keySet();for(String key : set){
System.out.println(key+" "+map.get(key));
}
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> entry : entrySet ){
System.out.println(entry.getKey+" "+entry.getValue());
}
interface Demo{
interface Demo1{public void show();}
}
class DemoTest implements Demo.Demo1{ //调用Demo内部接口Demo1public voidd show(){}}
Hashtable和HashMap区别??
1)Hashtable中键和值不允许为null;HashMap中键和值都可以为null;2)Hashtable 线程安全,HashMap是线程不安全的;3)继承体系不一样。
Collections工具类
常用方法sort(list); //自然排序sort(list,比较器); //根据比较器产生顺序对指定列表排序swap(list,int x,int y); //在指定列表的位置交换元素max(list); //自然排序找最大值min(list); //自然排序找最小值reverse(list); //饭转播指定列表元素的顺序