常用 java 笔记

2019-09-30  本文已影响0人  Uning

notes
注解@JsonIgnore的使用方法及其效果
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。

        @JsonIgnore
        @Column(name = "hobbies")
        private String hobbies;

注解@JsonProperty的使用方法及其效果
    @JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称
        @JsonProperty("rid")
        @Column(name = "dealerscode")
        private int code;
        
注解@Builder的使用方法及其效果
    @Builder声明实体,表示可以进行Builder方式初始化
    UserInfo userInfo = userInfo.toBuilder()
        .name("OK")
        .email("zgood@sina.com")
        .build();
    
    配合这两注解一起使用
        @NoArgsConstructor  
            可以 new 对象或者说有初始构造函数
        @AllArgsConstructor 
            不会出现bug 参数列表和形式参数列表长度不同
    
注解@Primary可以标记哪个bean是默认使用的,也就是说是@Autowired自动导入的bean

AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理.原子性操作
    public final int get() //获取当前的值
    public final int getAndSet(int newValue)//获取当前的值,并设置新的值
    public final int getAndIncrement()//获取当前的值,并自增
    public final int getAndDecrement() //获取当前的值,并自减
    public final int getAndAdd(int delta)  //获取当前的值,并加上预期的值
    //使用原子操作值增长时比使用 ReentrantLock 效率更高  但是如果把值从0循环加1到1亿时 比加锁占用资源更多
    
    
公平锁 如果获取锁成功则堵塞,后续排队获取

非公平锁 无视队列直接尝试获取锁
即便是公平锁,如果通过不带超时时间限制的tryLock()的方式获取锁的话,它也是不公平的,因为其内部调用的是sync.nonfairTryAcquire()方法,无论抢到与否,都会同步返回。

java内置锁
    synchronized
        特点:简单
显式锁
    ReentrantLock
        特点:可重入、可中断、可限时、公平锁
    使用显式锁一定要手动释放,如果获取锁后由于异常的原因没有释放锁,那么这把锁将永远得不到释放!所以要将unlock()放在finally块
    
Future
    Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。
        cancel方法用来取消任务
        isDone方法表示任务是否已经完成,若任务完成,则返回true;
        ...
    
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(8);   //线程池大小
    scheduler.setAwaitTerminationSeconds(5);
    scheduler.initialize();
    
    Future gameFlowFuture = scheduler.submit(() -> {
        try {
            waitBetting();
            Thread.sleep(2000);
            deal();
            Thread.sleep(1000);
            doBeforeRoundEnd();
        } catch (InterruptedException e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }
    });
    
    
Java 双冒号用法
    java.util.List<String> list = new ArrayList<String>();
    list.add("121");
    list.add("231");

    for (String n : list) {
        System.out.println(n); 
    }

    list.forEach(n -> System.out.println(n));

    list.forEach(System.out::println);      
    
    //调用方法
    for(GameListener onRoundEnd : gameListeners){
        scheduler.execute(new Runnable() {
            @Override
            public void run() {
                onRoundEnd.onRoundEnd();
            }
        });
    }

    gameListeners.forEach(gameListener -> scheduler.execute(gameListener::onRoundEnd));
    
    
JAVA 函数式编程
    传统方式
        new Thread(new Runnable() {
            public void run() {
                System.out.println("Hello World!");
            }
        }).start();
          
    函数
        new Thread(() -> System.out.println("Hello World!")).start();
    
    
多线程简洁语法
    //开启8个线程 使用线程池
    List<Integer> testList = Arrays.asList(1,2,3,4,1,2,3,4);

    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(8);
    scheduler.setAwaitTerminationSeconds(60);
    scheduler.initialize();

    final AtomicInteger testNum = new AtomicInteger(0);

    testList.forEach(b -> scheduler.execute(() -> {
        try {
            for(int k=0;k<1000;k++){
                testNum.addAndGet(1);
            }
            System.out.println(Thread.currentThread().getName() + " ms:" + System.currentTimeMillis() + " num:" + testNum.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }));
    
    //显式创建
    final AtomicInteger testNum = new AtomicInteger(0);

    for (int i = 0; i < 8; i++) {
        new Thread(() -> {
            try {
                for (int k = 0; k < 1000; k++) {
                    testNum.addAndGet(1);
                }
                System.out.println(Thread.currentThread().getName() + " ms:" + System.currentTimeMillis() + " num:" + testNum.get());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();
    }
    
    

结束当前正在运行中的java虚拟机
    System.exit(0)是将你的整个虚拟机里的内容都停掉了,无论如何,内存都释放了!也就是说连JVM都关闭了,内存里根本不可能还有什么东西
    System.exit(0)是正常退出程序,而System.exit(1)或者说非0表示非正常退出程序

Idea 修改 Git userName
    idea中git工具的用户名修改

    在 Terminal 中输入git config user.name获取当前的用户名

    修改用户名输入git config --global user.name 用户名

    完成修改
    
java 8 Optional返回筛选后的值 or 对象
    List<String> mapperList = new ArrayList<>();
    mapperList.add("baccarat");
    mapperList.add("dragontiger");
    mapperList.add("fantan");
    
    String sd = mapperList.stream()
            .filter("fantan"::equals)
            .findFirst()
            .orElseGet(String::new);
            
            or 对象
            
            .get()
            
            
Base64 加解密
    //转码
    System.out.println(new sun.misc.BASE64Encoder().encode("666666".getBytes()));
    //解码
    BASE64Decoder decoder = new BASE64Decoder();
    System.out.println(new String(decoder.decodeBuffer("NjY2NjY2")));
上一篇 下一篇

猜你喜欢

热点阅读