List,Set,Map三者的区别及总结:
1.List:对付顺序的好帮手
List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象
2.Set:注重独一无二的性质:
不允许重复的集合。不会有多个元素引用相同的对象。
3.Map:用key来搜索的专家
使用键值对存储,Map会维护与key有关联的值。两个key可以引用相同的对象,但key不能重复,典型的key是String类型
但ye也可以是任何对象。
Arraylist底层使用的是数组(存读数据效率高,插入删除特定位置效率低),LinkedList底层使用的是双向循环链表数据结构(插入,删除效率特别高)。学过数据结构这门课后我们就知道采用链表存储,插入,删除元素时间复杂度不受元素位置的影响,都是近似O(1)而数组为近似O(n),因此当数据特别多,而且经常需要插入删除元素时建议选用LinkedList.一般程序只用Arraylist就够用了,因为一般数据量都不会蛮大,Arraylist是使用最多的集合类。
Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector ,代码要在同步操作上耗费大量的时间。Arraylist不是同步的,所以在不需要同步时建议使用Arraylist。
1.ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。)
2.HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。
当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。
hashCode()与equals()的相关规定:
3.==指引用是否相同equals()指的是值是否相同。
comparable 和 comparator的区别
package org.java.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* 功能:Collections类方法测试之排序
* @author lee
* @date 2018.10.29
* @version 1.7
* */
public class CollectionsSort {
public static void main(String[] args) {
ArrayList
arr.add(-1);
arr.add(3);
arr.add(-5);
arr.add(7);
arr.add(4);
arr.add(-9);
arr.add(-7);
System.out.println("原始数组:");
System.out.println(arr);
//void reverse(List list):反转
Collections.reverse(arr);
System.out.println("Collections.reverse(arr):");
System.out.println(arr);
// void sort(List list),按自然排序的升序排序
Collections.sort(arr);
System.out.println("Collections.sort(arr):");
System.out.println(arr);
// void shuffle(List list),随机排序
Collections.shuffle(arr);
System.out.println("Collections.sort(arr)");
System.out.println(arr);
//定制排序的用法
Collections.sort(arr,new Comparator
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2.compareTo(o1);
}
});
System.out.println("定制排序后:");
System.out.println(arr);
}
}
package org.java.Test;
import java.util.Set;
import java.util.TreeMap;
/**
* 功能:重写compareto方法实现按年龄来排序
* @author lee
* @date 2018.10.29
*
* */
public class TreeMap2 {
public static void main(String[] args) {
TreeMap
data.put(new Person("张三",30), "zhangsan");
data.put(new Person("李四",20), "lisi");
data.put(new Person("王五",18), "wangwu");
data.put(new Person("小红",15), "xiaohong");
//得到key的值的同时得到key所对应的值
Set
for (Person key : keys) {
System.out.println(key.getAge()+"-"+key.getName());
}
}
}
package org.java.Test;
public class Person implements Comparable
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
if(this.age>o.getAge()){
return 1;
}else if(this.age
}
return age;
}
}
1.对Objects数组进行排序,我们可以用Arrays.sort()方法
2.对Objects的集合进行排序,需要使用Collections.sort()方法
List转数组:toArray(arraylist.size())方法;数组转List:Arrays的asList(a)方法
List
arrayList.add("s");
arrayList.add("e");
arrayList.add("n");
/** * ArrayList转数组 */ int size=arrayList.size(); String[] a = arrayList.toArray(new String[size]); //输出第二个元素 System.out.println(a[1]);//结果:e //输出整个数组 System.out.println(Arrays.toString(a));//结果:[s, e, n] /** * 数组转list */ Listlist=Arrays.asList(a); /** * list转Arraylist */ List arrayList2 = new ArrayList (); arrayList2.addAll(list); System.out.println(list);
如何求ArrayList集合的交集 并集 差集 去重复并集
需要用到List接口中定义的几个方法:
addAll(Collection Extends E > c):指定集合的iteator返回的顺序将指定集合中的所有元素追加到此列表的末尾 实例代码:
retainAll(Collection> c):仅保留此列表中包含在指定集合中的元素。
removeAll(Collection> c):从此列表中删除指定集合中包含的所有元素。
package org.java.Test; import java.util.ArrayList; /** public static void main(String[] args) { } |
-Collection
1.List
ArrayList:数组(查询快,增删慢 线程不安全,效率高)
Vector:数组(查询快,增删慢 线程安全,效率低)
LinkedList:链表(查询慢,增删快 线程不安全,效率高)
2.Set
HashSet(无序,唯一):哈希表或者san散列集(hash table)。
LinkedList:链表和哈希表组成。由链表保证元素的排序,由哈希表证元素的唯一性。
TreeSet(有序,唯一):红黑树(自平衡二叉树)
-Map
HashMap:基于哈希表的Map接口实现(哈希表对键进行散列,Map结构即映射表存放键值对)。
LinkedHashMap:HashMap的基础上加上了链表数据结构。
HashTable:哈希表。
TreeMap:红黑树。
主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用Map接口下的集合,需要排序时选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全就选用ConcurrentHashMap.当我们只需要存放元素值时,就选择实现Collection接口的集合,需要保证元素唯一时选择实现Set接口的集合比如TreeSet或HashSet,不需要就选择实现List接口的比如ArrayList或LinkedList,然后再根据实现这些接口的特点来选用。
建议把API多看看。