集合框架(5):LinkHashMap | TreeMap | Properties | Collections工具类


文章链接
Java语法https://blog.csdn.net/weixin_45606067/article/details/107049186
一维数组与二维数组、内存解析https://blog.csdn.net/weixin_45606067/article/details/107049178
面向对象(1/3)类和对象https://blog.csdn.net/weixin_45606067/article/details/108234276
面向对象(2/3)封装性、继承性、多态性https://blog.csdn.net/weixin_45606067/article/details/108234328
面向对象(3/3)抽象类、接口、内部类、代码块https://blog.csdn.net/weixin_45606067/article/details/108258152
异常处理待更新
多线程(1/2)https://blog.csdn.net/weixin_45606067/article/details/107067785
多线程(2/2)https://blog.csdn.net/weixin_45606067/article/details/107067857
常用类https://blog.csdn.net/weixin_45606067/article/details/108283203
枚举与注解待更新
集合(1/5)Collection、Iterator、增强forhttps://blog.csdn.net/weixin_45606067/article/details/107046876
集合(2/5)List、ArrayList、LinkedList、Vector的底层源码https://blog.csdn.net/weixin_45606067/article/details/107069742
集合(3/5)set、HashSet、LinkedHashSet、TreeSet的底层源码
集合(4/5)Map、HashMap底层原理分析https://blog.csdn.net/weixin_45606067/article/details/107042949
集合(5/5)LinkHashMap、TreeMap、Properties、Collections工具类https://blog.csdn.net/weixin_45606067/article/details/107069691
泛型与Filehttps://blog.csdn.net/weixin_45606067/article/details/107124099
IO流与网络编程https://blog.csdn.net/weixin_45606067/article/details/107143670
反射机制待更新
Java8新特性https://blog.csdn.net/weixin_45606067/article/details/107280823
Java9/10/11新特性待更新

一、LinkedHashMap底层实现原理

HashMap中的内部类:Node
static class Node<K,V> implements Map.Entry<K,V> {
	final int hash;
	final K key;
	V value;
	Node<K,V> next;
}

LinkedHashMap中的内部类:Entry
static class Entry<K,V> extends HashMap.Node<K,V> {
	Entry<K,V> before, after;
	Entry(int hash, K key, V value, Node<K,V> next) {
		super(hash, key, value, next);
	}
}

二、TreeMap

TreeMap两种添加方式的使用:
向treemap中添加数据,要求key必须是同一个类创建的对象。
因为要按照类进行排序:自然排序、定制排序。

1. 自然排序

代码实现:

@Test
public void test1(){
  TreeMap map = new TreeMap();
  User user1 = new User("tom", 23);
  User user2 = new User("jerry", 25);
  User user3 = new User("rose", 29);

  map.put(user1,"98");
  map.put(user2,"89");
  map.put(user3,"76");

  Set set1 = map.entrySet();
  Iterator iterator1 = set1.iterator();
  while (iterator1.hasNext()){
    Object obj = iterator1.next();
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey() +"--->"+entry.getValue());
  }
}

class User implements Comparable{
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public User() {
    }

    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;
    }

    @Override
    public String toString() {
        return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            '}';
    }
  
  	@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age &&
                Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {

        return Objects.hash(name, age);
    }	
  
    //按照姓名从大到小排序,年龄从小到大排序,
    @Override
    public int compareTo(Object o) {
        if (o instanceof User){
            User user= (User) o;
            int num= this.name.compareTo(user.name);
            if (num!=0){
                return -num;
            }else{
                return Integer.compare(this.age,user.age);
            }
        }else{
            throw new RuntimeException("类型不一致!");
        }
    }
}

2. 定制排序

@Test
public void test2(){
  TreeMap map = new TreeMap(new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
      if (o1 instanceof User && o2 instanceof User){
        User u1 = (User)o1;
        User u2 = (User)o2;
        return Integer.compare(u1.getAge(),u2.getAge());
      }
      throw new RuntimeException("类型不一致!");
    }
  });
  User user1 = new User("tom", 23);
  User user2 = new User("jerry", 25);
  User user3 = new User("rose", 29);

  map.put(user1,"98");
  map.put(user2,"89");
  map.put(user3,"76");

  Set set1 = map.entrySet();
  Iterator iterator1 = set1.iterator();
  while (iterator1.hasNext()){
    Object obj = iterator1.next();
    Map.Entry entry = (Map.Entry) obj;
    System.out.println(entry.getKey() +"--->"+entry.getValue());
  }
}

三、Properties

Properties处理配置文件

public static void main(String[] args) {
    Properties prop=new Properties();
    FileInputStream fileInputStream=null;
    try {
        fileInputStream = new FileInputStream("jdbc.properties");
        prop.load(fileInputStream);
        String name=prop.getProperty("user");
        System.out.println(name);
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            if (fileInputStream!=null){
                fileInputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、Collections 工具类

Collections工具类:操作set,map,list等集合的工具类。

1. 工具类中常用的方法

排序操作:(均为static 方法)

  • reverse(List):反转 List 中元素的顺序
  • shuffle(List):对 List 集合元素进行随机排序
  • sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
  • sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
  • swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换

查找、替换

  • Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
  • Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
  • Object min(Collection)
  • Object min(Collection,Comparator)
  • int frequency(Collection,Object):返回指定集合中指定元素的出现次数
  • void copy(List dest,List src):将src中的内容复制到dest中
  • boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换List对象的所有旧值
Collections 类中提供了多个 synchronizedXxx() 方法,该方法可使将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题

2. 代码演示

@Test
public void test1(){
  List list = new ArrayList();
  list.add(123);
  list.add(43);
  list.add(875);
  list.add(-25);
  list.add(0);

  Collections.reverse(list);
  Collections.shuffle(list);
  Collections.sort(list);
  Collections.swap(list,1,2);
  Collections.frequency(list,1);

  List dest = Arrays.asList(new Object[list.size()]);
  Collections.copy(list,dest);

  //同步控制
  List<Object> list1 = Collections.synchronizedList(list);//返回的list1就是线程安全的list
}

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客

版权声明:本文为weixin_45606067原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。