4.12 TreeMap、Properties、Collections、Thread

4.12 TreeMap、Properties、Collections、Thread

TreeMap

​ 底层结构:红黑树

​ 特点:有序(默认升序排序),存放存储与内部真是存储的顺序是不一致的

​ 去重排序:根据key实现去重与排序,key中存放的数据的类型–>1)实现内部比较 器 2)实现外部比较器

​ 注意:以后有功能|结构需要实现排序的要想到使用比较器指定比较规则

public class TreeMapDemo01 {
    public static void main(String[] args) {
        //默认根据User类的内部比较器提供的比较方式进行比较排序
        //TreeMap<User,String> map = new TreeMap<>();

        //指定使用某种外部比较规则
        TreeMap<User,String> map = new TreeMap<>((o1, o2) -> o1.getPassword()-o2.getPassword());

        //map.put(null,null);  //treemap中存储键值对key不能为null

        //存储数据,在存储的时候才会比较,排序
        map.put(new User("abc",123),"新浪");
        map.put(new User("ab",188),"新浪");
        map.put(new User("bc",187),"新浪");
        map.put(new User("a",188),"新浪");
        map.put(new User("a",188),"点淘app");

        System.out.println(map);
    }
}

Properties

​ 1.Properties存储的是键值对数据,且都为字符串类型

​ 2.Properties类表示一组持久的属性,Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串

​ 3.Properties根式作为配置文件的格式存在,键值对 都是字符串,简单
​ 程序从properties文件中读取数据:
​ void load(InputStream inStream) 从输入字节流中读取属性列表(键和元素 对)

​ 4.总结: Properties作为配置文件使用的步骤:

​ 1.src新建一个后缀为.properties的文件

​ 2.在配置文件中定义键值对为字符串的数据

​ 3.程序中定义一个Properties对象,通过对象.load(流)指定从某一个资源文 件中读取数据,使用指定的流

​ 4.对象.getProperty(key)

​ 5.配置文件:文件中指定一些程序执行,过程中需要的一些数据|参数|路径等帮 助我们实现软编码风格(经常修改的数据与源代码分离开,避免经常修改操作源 代码->硬编码)其中.properties,.xml经常作为配置文件

public class PropertiesDemo02 {
    public static void main(String[] args) throws IOException {
        Properties pro = new Properties();

        //新增方法
        pro.setProperty("123","456");

        System.out.println(pro.getProperty("123"));
        System.out.println(pro.getProperty("123"));

        String name = "";
        String pwd = "";

        //通过properties对象从配置文件中读取数据
        //指定从哪一个文件,通过哪个流加载
        pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));

        System.out.println(pro.getProperty("username"));
        System.out.println(pro.getProperty("password").length());
    }
}

//db.properties
username=hhh
password=123

Collections

​ 常用方法:
​ void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
​ void shuffle(List) //对List容器内的元素进行随机排列
​ void reverse(List) //对List容器内的元素进行逆续排列
​ void fill(List, Object) //用一个特定的对象重写整个List容器
​ int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查 找特定对象
​ 使用前提: 升序排序

HashMap线程不安全问题的解决方法

​ 1.使用Hashtable类型,这种类型是线程安全的HashMap,Hashtable是同步的, 如果不需要线程安全实现,建议使用HashMap代替Hashtable。如果需要线程安 全的高度并发实现,则建议使用ConcurrentHashMap代替Hashtable

​ 2.Collections -> static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 返回由 指定映射支持的同步(线程安全)映射。

​ 3.juc包(高级并发编程包) - > ConcurrentHashMap 线程安全的哈希表—>推荐,安 全性好效率高

Thread

​ 单线程:单个任务,一个执行路径,一个顺序流

​ 多线程:多任务执行,多个路径执行,多个顺序流

​ 多线程的优点:资源利用率更好,程序设计在某些情况下更简单,程序响应更快

​ 串行:在同一时间段内,多任务快速串行执行–>多线程

​ 并行:在同一时刻内,多任务同时执行

​ 进程和线程的区别:

线程和进程的区别

​ 创建线程+开启线程的步骤:

​ 1.继承Thread,重写 run()+ start()

public class ThreadDemo01 extends Thread{
    public static void main(String[] args) {
        //创建线程
        ThreadDemo01 th = new ThreadDemo01();
        //开启线程
        th.start();
        //th.run(); 方法的调用

        //主线程
        for(int i=1;i<=20;i++){
            System.out.println("一边讲课");

            /*休息10ms*/
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    /*
        定义线程体代码
     */
    @Override
    public void run() {
        for(int i=1;i<=20;i++){
            System.out.println("一边喝水");

            /*休息10ms*/
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

​ 2.实现Runnable,重写run()方法,方法的内部定义线程体,+start()

​ 接口实现的好处:可以多实现,类只能单继承,可以资源共享

public class Thread4 implements Runnable{
    public static void main(String[] args) {
        //线程的创建
        Thread4 thread4 = new Thread4();//先创建类的对象才能调用接口中的run方法
        Thread thread = new Thread(thread4);
        thread.start();
        for(int i=0;i<=50;i++){
            System.out.println("一边说话...");
        }
    }

    @Override
    public void run() {
        for(int i=0;i<=50;i++){
            System.out.println("吃饭");
        }
    }
}

​ 利用内部类

public class Thread5 {

    //内部类实现Runnable接口
    static class Inner1 implements Runnable{

        @Override
        public void run() {
            for(int i=0;i<=50;i++){
                System.out.println("一边打游戏...");
            }
        }
    }

    //内部类继承Thread
    static class Inner2 extends Thread{
        @Override
        public void run() {
            for(int i=0;i<=50;i++){
                System.out.println("一边打上厕所...");
            }
        }
    }

    public static void main(String[] args) {
        //匿名内部类
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(int i=0;i<=50;i++){
                    System.out.println("一边陪女朋友...");
                }
            }
        }).start();

        //线程开启
        new Thread(new Inner1()).start(); //先创建Inner1的对象,将Inner1对象传给Thread用Thread(Runnable target)构造器创建Thread对象
        new Inner2().start(); //Inner继承Thread 直接调用父类的方法
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值