⼯具篇-Java中⼀些utils
下边是整理的⼀些Java开发的utils,顺便吐槽下新浪博客的编辑器排版跟我写的博客⼀样烂,所以改⽤博客园
⼀、字符串
1. Java中String与其他类型之间的转换
String与⽇期对象
1public static SimpleDateFormat df1 = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
2public static SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
3 df2.format(df1.parse(time_local));
在将字符串转为⽇期对象时,可以使⽤parse⽅法;⽇期对象转为字符串时,可以使⽤format⽅法。但是parse在解析⽇期字符串的时候本⾝存在⼀些问题:⽐如。
String与⼋种基本类型(以int为例)
String转int:
1try {
2int i = Integer.parseInt(str);
3 } catch (NumberFormatException e) { //str中可能有⾮数字
4 e.printStackTrace();
5 }
int转String:
第⼀种⽅法:
1 str=i+""; //会产⽣两个String对象
第⼆种⽅法:
1 str=String.valueOf(i); //直接使⽤String类的静态⽅法,只产⽣⼀个String对象
2. 去掉字符串前⾯的0
使⽤replaceAll(正则或者⽬标字符串,要替换上的字符串)
1 String str = "000000001234034120";
2 String newStr = placeAll("^(0+)", "");
3 System.out.println(newStr);
这⾥说明下replace和replaceAll的区别:replace的参数是char和CharSequence,即可以⽀持字符的替换,也⽀持字符串的替换;replaceAll的参数是regex,即基于正则表达式的替换。
使⽤replaceFirst(正则或者⽬标字符串,要替换上的字符串)
1 String str = "000000001234034120";
2 String newStr = placeFirst("^(0+)", "");
3 System.out.println(newStr);
3. String.format⽅法
1 String formatted = String.format("%s今年%d岁。", "我", 25); // 打印结果:"我今年25岁。"
第⼀个参数是格式串,后⾯参数都是格式串的参数,⽤于替换格式串中的占位符。占位符类型有下⾯⼏种:(⼤写表⽰输出为⼤写)
3. String == 和equals⽅法
“==”判断的是地址值,equals()⽅法判断的是内容
1 str1.equals(str2)
2 str1.hashCode()==str2.hashCode()
hashCode是⼀样的,hashCode相同可能是同⼀个对象,也可能是不同的对象,但是hashCode不同就肯定是不同的对象。
如果两个对象equals相等,那么这两个对象的HashCode⼀定也相同
如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同⼀个位置
equals和equalsIgnoreCase⽅法对⽐
equals⽅法来⾃于Object类,默认⽐较两个对象的内存地址,equals在把对象放⼊HashMap中会被掉⽤;
equalsIgnoreCase是String特有的⽅法,⽐较的是两个String对象是否相等(并且忽略⼤⼩写)
4. StringUtils的join⽅法
包路径:org.apachemons.lang3.StringUtils;
⽤法:将数组元素⽤特殊连接符连接
StringUtils.join(array, "-")
源码:
/**
* <p>Joins the elements of the provided array into a single String
* containing the provided list of elements.</p>
*
* <p>No delimiter is added before or after the list.
* Null objects or empty strings within the array are represented by
* empty strings.</p>
*
* <pre>
* StringUtils.join(null, *) = null
* StringUtils.join([], *) = ""
* StringUtils.join([null], *) = ""
* StringUtils.join(["a", "b", "c"], ';') = "a;b;c"
* StringUtils.join(["a", "b", "c"], null) = "abc"
* StringUtils.join([null, "", "a"], ';') = ";;a"
* </pre>
* @param array the array of values to join together, may be null
* @param separator the separator character to usewritelines方法的参数可以是
* @return the joined String, {@code null} if null array input
* @since 2.0
*/
public static String join(final Object[] array, final char separator) {
if (array == null) {
return null;
}
return join(array, separator, 0, array.length);
}
View Code
5. URLEncode编码与 URLDecode解码
String mytext = de("中国", "utf-8");
String mytext2 = java.URLDecoder.decode(mytext, "utf-8");
这两条语句在同⼀个页⾯中的话,得到的结果是:
mytext: %E4%B8%AD%E5%9B%BD
mytex2: 中国
5.
⼆、Spring
1. JSONField 注解
指定字段的名称
1@JSONField(name="role_name")
2private String roleName;
使⽤format制定⽇期格式
public class A {
// 配置date序列化和反序列使⽤yyyyMMdd⽇期格式
@JSONField(format="yyyyMMdd")
public Date date;
}
指定字段的顺序
1public static class VO {
2 @JSONField(ordinal = 3)
3private int f0;
4
5@JSONField(ordinal = 2)
6private int f1;
7
8@JSONField(ordinal = 1)
9private int f2;
使⽤serialize/deserialize指定字段不序列化
1public class A {
2 @JSONField(serialize=false)
3public Date date;
4 }
三、随机数
1. Java中产⽣随机数的⽅法
使⽤Random类
Random类可以产⽣ boolean、int、long、float, byte 数组以及 double 类型的随机数,这是它与 random()⽅法最⼤的不同之处,random()⽅法只能产⽣double类型的 0~1的随机数。
Random 类位于 java.util 包中,该类常⽤的有如下两个构造⽅法。
Random():该构造⽅法使⽤⼀个和当前系统时间对应的数字作为种⼦数,然后使⽤这个种⼦数构造 Random 对象。
Random(long seed):使⽤单个 long 类型的参数创建⼀个新的随机数⽣成器。例如:
1public static void main(String[] args)
2 {
3 Random r=new Random();
4double Double(); //⽣成[0,1.0]区间的⼩数
5double Double()*7; //⽣成[0,7.0]区间的⼩数
6int Int(10); //⽣成[0,10]区间的整数
7int Int(18)-3; //⽣成[-3,15]区间的整数
8long Long(); //⽣成⼀个随机长整型值
9boolean Boolean(); //⽣成⼀个随机布尔型值True或者False
10float Float{); //⽣成⼀个随机浮点型值
11 }
Math类的random()⽅法
该⽅法没有参数,它默认会返回⼤于等于0.0、⼩于1.0的double类型随机数。如下:
1public static void main(String[] args)
2 {
3int min=0; //定义随机数的最⼩值
4int max=100; //定义随机数的最⼤值
5//产⽣⼀个1~100的数
6int s=(int)min+(int)(Math.random()*(max-min));
7 }
2. Java⽣成UUID
UUID 的⽬的是让分布式系统中所有元素都有唯⼀辨识资讯,⽽不需要由中央控制端来做辨识资讯的指定。
UUID由以下⼏部分的组成:
当前⽇期和时间
时钟序列
全局唯⼀的IEEE机器识别号,如果有⽹卡,从⽹卡MAC地址获得,没有⽹卡以其他⽅式获得。
UUID的唯⼀缺陷在于⽣成的结果串会⽐较长。关于UUID这个标准使⽤最普遍的是微软的GUID(Globals Unique Identifiers)。标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12)。
UUID 来作为数据库数据表主键是⾮常不错的选择,保证每次⽣成的UUID 是唯⼀的。
1//获得指定数⽬的UUID
2public static String[] getUUID(int number){
3if(number < 1){
4return null;
5 }
6 String[] retArray = new String[number];
7for(int i=0;i){
8 retArray[i] = getUUID();
9 }
10return retArray;
11 }
12//获得⼀个UUID
13public static String getUUID(){
14 String uuid = UUID.randomUUID().toString();
15//去掉“-”符号
placeAll("-", "");
17 }
四、⽂件
1. FileUtils
具有封装的读写⽂件、复制⽂件等功能。例如:
1import org.apachemons.io.FileUtils;
2 List lines = new ArrayList();
3 ...
4 FileUtils.writeLines(new File("/Users/"), lines, true);
5 String result = adFileToString(new File("/Users/"), "UTF-8");
2. 配置⽂件读取
⼀般情况下,我们⽤到的资源⽂件(各种xml,properites,xsd⽂件等)都放在src/main/resources下⾯,利⽤maven打包时,maven能把这些资源⽂件打包到相应的jar或者war⾥。在程序中就可以直接读取了,例如:properties⽂件
1 InputStream input =Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties");
2 Properties prop = new Properties();
3 prop.load(input);
yaml⽂件
1 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(yamlPath);
2 Yaml yaml = new Yaml();
3 HashMap map = yaml.loadAs(inputStream, HashMap.class);
五、Java反射
1. 反射取私有⽅法
在调⽤私有⽅法时必须⽤getDeclaredMethod,getDeclaredMethod和getMethod区别如下:
getMethod:Returns a object that reflects the specified public member method of the class or interface represented by this object.(只能获取public的⽅法)
getDeclaredMethod:Returns a object that reflects the specified declared method of the class or interface represented by this object. (能获取类中所有⽅法)
调⽤私有⽅法时除了在调⽤之前需要设置setAccessible(true)
2. (JDK 1.5及以上)
3.
六、⽹络
1. 主机名转IP
1 String ip = ByName(hostName).getHostAddress();
2. HttpClient
HttpClient httpclient = new DefaultHttpClient();
不设置的话如果服务器⽆响应,可能返回(404 50x),如果没有返回则java线程会⼀直等待。
七、缓存
1. Guava Cache
2.
注:通过Cause()可以知道该对象被移除的原因
1public enum RemovalCause {
2//⽤户⼿动移除
3 EXPLICIT,
4//⽤户⼿动替换
5 REPLACED,
6//被垃圾回收
7 COLLECTED,
8//超时过期
9 EXPIRED,
10//由于缓存⼤⼩限制
12 }
⼋、⽇期
1. TimeUnit
TimeUnit提供了各种时间⽅法,⽐如常⽤的toMillis、toNaNos、sleep(Long timeout)等等,可读性极⾼,使⽤⽅便且性能也不错,具体使⽤⽅法参考:,对⽐⼀下:
1// TimeUnit
2 TimeUnit.MILLISECONDS.sleep(10);
3 TimeUnit.SECONDS.sleep(10);
4 TimeUnit.MINUTES.sleep(10);
5
6// 原⽣Thread⽅法
7 Thread.sleep(10);
8 Thread.sleep(10*1000);
9 Thread.sleep(10*60*1000);
2. Java8只取年⽉⽇的java.util.Date(时分秒清零)对象
1// set current date
2 date = new Date();
3 Calendar cal1 = Instance();
4 cal1.setTime(date);
5// clear minute second milliSecond
6 cal1.set(Calendar.MINUTE, 0);
7 cal1.set(Calendar.SECOND, 0);
8 cal1.set(Calendar.MILLISECOND, 0);
9 date = Time();
3. java.util.Date转java.sql.Date
1 Date utilDate = new Date();//uilt.Date
2 System.out.println("utilDate : " + utilDate);
3 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
4 System.out.println("format : " + format.format(utilDate));
5
6 System.out.println("**********************************************");
7
8 Timestamp sqlDate = new Time());//uilt.Date转sql.Date
9 System.out.println("sqlDate : " + sqlDate);
10 System.out.println("format : " + format.format(sqlDate));
九、代码规范
1. HashMap初始容量设置
根据阿⾥巴巴Java开发⼿册上建议HashMap初始化时设置已知的⼤⼩,如果不超过16个,那么设置成默认⼤⼩16:
集合初始化时,指定集合初始值⼤⼩。
说明: HashMap使⽤HashMap(int initialCapacity)初始化,
正例:initialCapacity = (需要存储的元素个数 / 负载因⼦) + 1。注意负载因⼦(即loader factor)默认为0.75,如果暂时⽆法确定初始值⼤⼩,请设置为16(即默认值)。
反例:HashMap需要放置1024个元素,由于没有设置容量初始⼤⼩,随着元素不断增加,容量7次被迫扩⼤,resize需要重建hash表,严重影响性能
2. 减少if/else书写(⼀般嵌套不超过三层为好)
提前return
1if (condition) {
2// do something
3 } else {
4return xxx;
5 }
这种情况条件取反,⼲掉else
1if (!condition) {
2return xxx;
3 }
4
5// do something
策略模式
有种情况是根据不同的参数⾛不同的逻辑,先看⼀般写法:
1if (strategy.equals("fast")) {
2// 快速执⾏
3 } else if ("strategy.equals("normal")) {
4// 正常执⾏
5 } else if ("strategy.equals("smooth")) {
6// 平滑执⾏
7 } else if ("strategy.equals("slow")) {
8// 慢慢执⾏
9 }
其实可以⽤枚举
1public enum Stategy {
2 FAST{
3 @Override
4public void run() {
5 System.out.println("fast---");
6 }
7 },
8 NORMAL{
9 @Override
10public void run() {
11 System.out.println("normal---");
12 }
13 },
15 @Override
16public void run() {
17 System.out.println("smooth---");
18 }
19 },
20 SLOW {
21 @Override
22public void run() {
23 System.out.println("slow---");
24 }
25 };
26
27public abstract void run();
28 }
最后,可以通过param执⾏不同逻辑
1 Strategy strategy = Strategy.valueOf(param);
2 Strategy.run();
⽤Optional
jdk8新特性,主要⽤于⾮空判断
1if (user == null) {
2// do action 1
3 } else {
4// do action2
5 }
可以改为
1 Optional<User> userOptional = Optional.ofNullable(user);
2 userOptional.map(action1).orElse(action2);
⼗、thrift
1. thrift⽂件的使⽤
最近看别⼈的⽼项⽬⽤到了thrift⽂件,以前没⽤过,挺好玩的,记录⼀下。刚开始从gitlab上clone下来以后,会发现有些包会爆红:
同时src⽬录下有thrift⽂件
问了下同事说是要compile⼀下,还得先安装0.9.3的thrift(还有⼀些插件,⼀定要FQ,如果没有全局设置的话,需要在shell⾥边重新设置下)1 export http_proxy=127.0.0.1:1087; export https_proxy=127.0.0.1:1087
⼯程⾥修改pom⽂件
1 <build>
2 <plugins>
3 <plugin>
4 <artifactId>maven-assembly-plugin</artifactId>
5 <configuration>
6 <descriptorRefs>
7 <descriptorRef>jar-with-dependencies</descriptorRef>
8 </descriptorRefs>
9 </configuration>
10 </plugin>
11 <plugin>
12 <groupId>org.apache.maven.plugins</groupId>
13 <artifactId>maven-shade-plugin</artifactId>
14 <executions>
15 <execution>
16 <phase>package</phase>
17 <goals>
18 <goal>shade</goal>
19 </goals>
20 </execution>
21 </executions>
22 </plugin>
23 <plugin>
24 <groupId>org.ls</groupId>
25 <artifactId>maven-thrift-plugin</artifactId>
26 <version>0.1.11</version>
27 <configuration>
28 <thriftSourceRoot>src/main/if</thriftSourceRoot>
29 </configuration>
30 <executions>
31 <execution>
32 <id>thrift-sources</id>
33 <phase>generate-sources</phase>
34 <goals>
35 <goal>compile</goal>
36 </goals>
37 </execution>
38 </executions>
39 </plugin>
40 <plugin>
41 <groupId>org.apache.maven.plugins</groupId>
42 <artifactId>maven-compiler-plugin</artifactId>
43 <configuration>
44 <source>1.8</source>
45 <target>1.8</target>
46 <encoding>UTF-8</encoding>
47 </configuration>
48 </plugin>
49 </plugins>
50 </build>
和
1 <!--thrift-->
2 <dependency>
3 <groupId>org.apache.thrift</groupId>
4 <artifactId>libthrift</artifactId>
5 <version>0.11.0</version>
6 </dependency>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论