Java中的一些基础代码片段


=Start=

缘由:

因为Java代码写的还不多,所以有时候在碰到一些在其他语言(比如:Python、Shell、……)里比较容易实现的功能时也不太顺畅,所以打算不断用文章进行整理总结,争取早日能较为熟练的使用Java进行开发。

正文:

参考解答:
1、打印当前日期和时间、统计某一段代码的执行耗时
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StrFormatPrint {

    public static void main(String[] args) {
        long time1 = System.currentTimeMillis();
        DateFormat dateFormat = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
        Date date = new Date();
        System.out.println(dateFormat.format(date));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long time2 = System.currentTimeMillis();

        String strTemplate = "[%s] spend {%d} ms to call %s";
        System.out.println( String.format(strTemplate, dateFormat.format(date), time2-time1, "method_name") );
    }
}

上面这一段代码主要是因为Java里面的 `System.out.println` 不支持字符串+整型的写法,所以使用 String.format 做的一个折中,也怪我对Java还不够熟。

2、sleep一段时间在Java中该怎么写
try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}

为什么使用sleep()而不是wait(),具体原因可以参考「java中的sleep()和wait()的区别」,总结起来其实就是:当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备;而sleep()到时间了之后会自动恢复。

3、Java中json字符串的解析(此处用fastjson进行处理)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;


String sourceData = "{\"key1\": \"value1\", \"key2\": \"value2\"}";
JSONObject jsonObject = JSON.parseObject(sourceData);
for (String key: jsonObject.keySet()) {
    System.out.println("key: " + key + "\tvalue: " + jsonObject.getString(key));
}

if (jsonObject.containsKey("key0")) {
    System.out.println("jsonObject.containsKey(\"key0\") == True");
} else {
    System.out.println("jsonObject.containsKey(\"key0\") == False");
}

JSONObject result = new JSONObject();
result.put("ua", jsonObject.getString("ua"));
result.put("name", jsonObject.getString("key1"));
System.out.println(result);

System.out.println("jsonObject.getString(\"ua\")==" + jsonObject.getString("ua"));
4、Java中Collection集合的简单操作
package com.ixyzero.learn;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * Java集合总结之Collection整体框架 https://blog.csdn.net/snail_rao/article/details/7617810
 * java Collection中的排序问题 https://www.cnblogs.com/huangfox/archive/2012/07/05/2577306.html
 *
 * https://blog.csdn.net/oguro/article/details/53413861
 * 数组:存储同一种数据类型的集合容器.
 数组的特点:
 1. 只能存储同一种数据类型的数据。
 2. 一旦初始化,长度固定。
 3. 数组中的元素与元素之间的内存地址是连续的。
 注意: Object类型的数组可以存储任意类型的数据。

 * 集合:集合是存储对象数据的集合容器。
 集合比数组的优势:
 1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型 的数据。
 2. 集合的长度是会发生变化的,数组的长度是固定的。

 Java集合框架之Collection实例解析
 https://blog.csdn.net/qq_28261343/article/details/52614411


 */
public class CollectionTest {
    public static void main(String[] args) {
        Collection<Long> uids = new ArrayList<Long>();
        System.out.print(uids);
        System.out.println(uids.size());

        uids.add((long) 12345);
        System.out.print(uids);
        System.out.println(uids.size());

        String uidStr = "1,2,3,4,5,6,7,8,9,12345";
        for (String uid: uidStr.split(",")) {
            uids.add(Long.parseLong(uid));
        }
        System.out.print(uids);
        System.out.println(uids.size());

        uids.remove(1);
        System.out.print(uids);
        System.out.println(uids.size());

        uids.remove((long) 1);
        System.out.print(uids);
        System.out.println(uids.size());

        // String testStr = "123";
        // String[] items = testStr.split(",");
        // System.out.println(items.length);
        // for (String item: testStr.split(",")) {
        //     System.out.println(item);
        // }

        String[] words = {"ace", "boom", "crew", "dog", "eon"};
        List<String> wordList = Arrays.asList(words);
        System.out.println(wordList.size());
        System.out.println(wordList);
        // for (String e: wordList){
        //     System.out.println(e);
        // }
    }
}
5、待添加
  • Java中的list/map/set操作,以及去重、排序;
  • Java中的HTTP操作;
  • Java中的MySQL操作(直连、使用c3p0等连接池);
  • Java中的Redis/Mongo操作;
  • Java中的命令执行操作;
  • Java中的多线程、线程池操作;

 

参考链接:

java中的sleep()和wait()的区别
https://www.cnblogs.com/hongten/p/hongten_java_sleep_wait.html

Java中如何获取当前日期/时间
https://stackoverflow.com/questions/5175728/how-to-get-the-current-date-time-in-java
https://stackoverflow.com/questions/23944370/how-to-get-milliseconds-from-localdatetime-in-java-8
http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/

Java中 String 和 Date/Timestamp 之间的转换
http://yunnick.iteye.com/blog/1074495
https://www.cnblogs.com/Matrix54/archive/2012/05/03/2481260.html

java c3p0连接池 不用spring单独使用c3p0
https://blog.csdn.net/nx188/article/details/51758055

Java中的字符串切分
https://stackoverflow.com/questions/3481828/how-to-split-a-string-in-java

java的Collection类详解
https://blog.csdn.net/oguro/article/details/53413861

java——Collection框架,Collections
https://www.cnblogs.com/dong-liu/p/7428982.html

=END=

,

《 “Java中的一些基础代码片段” 》 有 12 条评论

  1. Java中如何将一个json格式字符串转换成一个对象?
    https://www.cnblogs.com/wgale025/p/5875430.html
    `
    // 其中 LogMatch 是一个 POJO 类(只有一堆private变量,和对应的public的getter和setter);
    // 只要 inputStr 不是空字符串,后面的get操作就不会包空指针异常,即便所有的元素值可能都是null;但如果是空串的话,解析没问题,但是如果有get操作,则会报 NullPointerException 异常。

    import com.alibaba.fastjson.JSON;

    String inputStr = “{\”reportTime\”: \”2018-07-15 00:00:05\”}”;
    LogMatch logMatch = JSON.parseObject(inputStr, LogMatch.class);
    String keyName = logMatch.getKeyName();
    System.out.println(keyName);
    `
    fastjson将json字符串转化成map的五种方法
    https://blog.csdn.net/sinat_29774479/article/details/78730359

  2. Java中如何解析json数组?
    https://stackoverflow.com/questions/30531567/parse-the-json-objects-inside-json-array-in-android
    `
    1、如果是大的json对象里面某一个字段值的类型是json数组的话,可以通过 getJSONArray() 方法取出,然后遍历;
    2、如果是某字符串本身就是json数组的话,可以使用 JSONArray jArray = new JSONArray(stringJson); 进行解析,然后遍历;
    `
    https://stackoverflow.com/questions/7634518/getting-jsonobject-from-jsonarray

  3. 千万不要这样使用 Arrays.asList !
    https://mp.weixin.qq.com/s/iDpx7krEjSue0-IXGiMFeQ
    `
    使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。

    而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印函数Arrays.toString(),于是打印不再使用asList(),而asList()恰巧可用于将数组转为集合。
    `

  4. Java中使用 ASCII 码中的 0x01,0x02 作为分隔符
    https://blog.csdn.net/moxiaomomo/article/details/8820890
    https://blog.csdn.net/qun715715/article/details/84725773
    `
    用 ASCII 码中的 0x01,0x02 作为分隔符的好处在于——这几个字符是键盘不能直接输入的,避免和其它的字符冲突,导致代码功能和预期不一致。

    byte b1[] = {0x01};
    String ascii01 = new String(b1);
    byte b2[] = {0x02};
    String ascii02 = new String(b2);

    String out_str = String.format(“abc%sabc%sabc%s”, ascii01, ascii01, ascii02);
    System.out.println(out_str.length()); // 12
    for (String item: out_str.split(ascii01)) {
    System.out.println(item);
    }
    `

  5. 如何优雅的在java中统计代码块耗时
    https://mp.weixin.qq.com/s/3cw3WsTUG94-C9894EBXUQ
    `
    下面小结一下三种统计耗时的方式:

    # 基本写法
    long start = System.currentTimeMillis();
    try {
    // …. 具体的代码段
    } finally {
    System.out.println(“cost: ” + (System.currentTimeMillis() – start));
    }
    优点是简单,适用范围广泛;缺点是侵入性强,大量的重复代码

    # Spring AOP
    在 Spring 生态下,可以借助 AOP 来拦截目标方法,统计耗时

    @Around(“…”)
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    long start = System.currentTimeMillis();
    try{
    return joinPoint.proceed();
    } finally {
    System.out.println(“cost: ” + (System.currentTimeMillis() – start));
    }
    }
    优点:无侵入,适合统一管理(比如测试环境输出统计耗时,生产环境不输出);缺点是适用范围小,且粒度为方法级别,并受限于 AOP 的使用范围

    # AutoCloseable
    这种方式可以看做是第一种写法的进阶版

    // 定义类
    publicstaticclass Cost implements AutoCloseable {
    privatelong start;

    public Cost() {
    this.start = System.currentTimeMillis();
    }

    @Override
    public void close() {
    System.out.println(“cost: ” + (System.currentTimeMillis() – start));
    }
    }

    // 使用姿势
    try (Cost c = new Cost()) {

    }
    优点是:简单,适用范围广泛,且适合统一管理;缺点是依然有代码侵入

    说明:
    上面第二种方法看着属于最优雅的方式,但是限制性强;如果有更灵活的需求,建议考虑第三种写法,在代码的简洁性和统一管理上都要优雅很多,相比较第一种可以减少大量冗余代码。
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注