内部比较器|自然排序:
实现java.lang.Comparable,重写 compareTo方法,在方法中自定义比较规则,默认的类型的比较规则
每次修改需要修改源码,不符合设计原则开闭原则 对修改关闭,对扩展开放
外部比较器|自定义比较器
实现接口java.util.Comparator的接口,重写compare()方法,方法中自定义比较规则
int compare(T o1, T o2) 比较用来排序的两个参数。
定义一个person类方便以后调用,重写了equals方法和hashcode方法,以及compareto方法方便比较(注释了).
//如果比较person对象,默认可以按照内部比较器定义的方式去比较 //public class Person implements Comparable<Person>{ public class Person{ private String name; //年龄 private int age; //身高 private double height; public Person() { // TODO Auto-generated constructor stub } public Person(String name, int age, double height) { super(); this.name = name; this.age = age; this.height = height; } 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 double getHeight() { return height; } public void setHeight(double height) { this.height = height; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", height=" + height + "]"; } //重写hashcode方法和equals方法方便进行比较因为set底层是基于hashcode算法分配数组索引再在数组下存储相同索引的链表 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; long temp; temp = Double.doubleToLongBits(height); result = prime * result + (int) (temp ^ (temp >>> 32)); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (age != other.age) return false; if (Double.doubleToLongBits(height) != Double.doubleToLongBits(other.height)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } //自定义比较规则 根据身高排序 默认升序 p1.compareTo(p2) 返回值<0 p1<p2 返回值=0 相等 返回值>0 p1>p2 /*@Override public int compareTo(Person o) { //return (int) (this.getHeight() - o.getHeight()); 根据身高升序排序 return (int) (o.getHeight() - this.getHeight()); //根据升高降序排序 }*/比较两个数组里存储的对象的值
public static void main(String[] args) { int[] arr={4,1,7,2,8,3}; System.out.println(Arrays.toString(arr)); //默认升序 Arrays.sort(arr); System.out.println(Arrays.toString(arr)); Person p1=new Person("张三",18,180); Person p2=new Person("李四",15,190); Person p3=new Person("王五",30,160); Person[] persons={p1,p2,p3}; System.out.println(Arrays.toString(persons)); //默认升序 // Arrays.sort(persons); //static <T> void sort(T[] a, Comparator<? super T> c) 第二个参数中定义当前排序的比较规则 /*Arrays.sort(persons,new Comparator(){ @Override public int compare(Object o1, Object o2) { return ((Person)o2).getAge() - ((Person)o1).getAge(); } });*/ Arrays.sort(persons,(Object o1, Object o2) ->((Person)o1).getAge() - ((Person)o2).getAge()); System.out.println(Arrays.toString(persons)); }Set接口 无序不可重复
List 有序可重复
HashSet: 底层都是有HashMap维护 *HashMap 实例的默认初始容量是 16,加载因子是 0.75。
底层: 哈希表(hashtable)实现的(数组+链表+红黑树)
特点: 查询,增删效率高,但是无序,不可重复
建议: 推荐使用HashSet
TreeSet: 底层都是有TreeMap维护
public static void main(String[] args) { Set<String> set=new HashSet(); set.add("呵呵"); set.add("不好"); set.add("啦啦"); set.add("你好"); set.add("哈哈"); set.add("呵呵"); //数据存放的的顺序和添加的不一定一致,但是一旦确定不会改变 System.out.println(set); System.out.println(set); set.remove("不好"); System.out.println(set);HashMap
底层: 哈希表的结构初始容量:16加载因子: 0.75扩容:原容量的2倍如果HashMap的key是自定义的引用数据类型,需要对key的数据的类型重写hashCode()和equals()方法,实现去重,value会覆盖如果key相同,value不覆盖–>先判断,如果key相同就不存储,key不相同,才存储如果需求个根据value去重,需要自己手动定义判断 containsKey() containsValue()//定义容器TreeMap1)存储key是基本数据类型|String ,value引用数据类型的数据–>去重,排序2)存储key是自定义的应用数据类型,value是任意类型 -->去重,排序HashMap 推荐使用 ,线程不安全增删,查询效率高TreeMap 中的数据有按照指定规则进行排序,推荐使用TreeMapHashtable 线程安全的HashMapMap 接口
存储键值对类型的数据 k-v ->映射关系k的特点: 无序的,不可重复的 -->所有的key,就是一个set集合v的特点: 无序的,可重复 --> Collection的特点一个key对象一个value值,如果想要对应多个,多个value值可以存在在一个数组|容器中key相同时候,value会覆盖 public static void main(String[] args) { Map<String,Integer> map=new HashMap(); //put(key,value) 添加 map.put("java33期", 23); map.put("java32期", 20); map.put("java32期", 21); map.put("java31期", 40); map.put("java30期", 35); map.put("java29期", 20); System.out.println(map); //remove(key) 返回被移出的value值 map.remove("java32期"); System.out.println(map); //包含 System.out.println(map.containsKey("java33期")); System.out.println(map.containsValue(19)); //get(key) System.out.println(map.get("java33期")); System.out.println(map); //遍历方式 //1.keySet() 返回所有的key,组成一个set集合 Set<String> set=map.keySet(); //1).for..each() //2).迭代器 iterator() /*Iterator<String> it=set.iterator(); while(it.hasNext()){ String key=it.next(); System.out.println(key+","+map.get(key)); //key }*/ //2.获取所有的value值 values() 只能拿到value的值,无法获取key Collection<Integer> col=map.values(); for(Integer in:col){ System.out.println(in); } //3.Set<Map.Entry<K,V>> entrySet() Set<Map.Entry<String,Integer>> sets=map.entrySet(); for(Map.Entry<String,Integer> entry:sets){ System.out.println(entry.getKey()+"-->"+entry.getValue()); } }