通过代码实例跟我学Java语言程序设计及应用技术——util程序包中典型类的应用实例
Java程序员的日常——IOUtils总结
Java程序员的⽇常——IOUtils总结常⽤的静态变量在IOUtils中还是有很多常⽤的⼀些变量的,⽐如换⾏符等等public static final char DIR_SEPARATOR_UNIX = '/';public static final char DIR_SEPARATOR_WINDOWS = '\\';public static final char DIR_SEPARATOR;public static final String LINE_SEPARATOR_UNIX = "\n";public static final String LINE_SEPARATOR_WINDOWS = "\r\n";public static final String LINE_SEPARATOR;static {DIR_SEPARATOR = File.separatorChar;StringBuilderWriter buf = new StringBuilderWriter(4);PrintWriter out = new PrintWriter(buf);out.println();LINE_SEPARATOR = buf.toString();out.close();}常⽤⽅法copy这个⽅法可以拷贝流,算是这个⼯具类中使⽤最多的⽅法了。
⽀持多种数据间的拷贝:copy(inputstream,outputstream)copy(inputstream,writer)copy(inputstream,writer,encoding)copy(reader,outputstream)copy(reader,writer)copy(reader,writer,encoding)copy内部使⽤的其实还是copyLarge⽅法。
java.util.scanner的用法
如题,文章主题为“java.util.Scanner的用法”。
在本文中,将对java.util.Scanner类进行全面评估,并探讨其深度和广度的用法,以帮助读者更深入地理解这一主题。
1. Java.util.Scanner类简介java.util.Scanner是Java编程语言中的一个类,它可以用来扫描用户输入,以及从各种数据源中获取输入。
Scanner类提供了一种简便的方式来解析基本类型和字符串,因此在Java编程中被广泛使用。
2. Scanner的基本用法在Java中,我们可以使用Scanner类来获取用户的输入。
我们可以通过以下代码创建一个Scanner对象,并开始扫描用户的输入:```Scanner scanner = new Scanner(System.in);```通过这个简单的示例,我们可以看到Scanner类的基本用法。
它可以从标准输入流中获取用户的输入,并将其解析成不同的数据类型。
3. Scanner的高级用法除了简单的用户输入外,Scanner类还可以用于扫描文件、字符串等不同的数据源。
我们可以使用Scanner类的不同构造函数来指定不同的数据源,比如从文件中读取输入:```File file = new File("input.txt");Scanner scanner = new Scanner(file);```通过这种方式,我们可以利用Scanner类来处理文件输入,而无需编写复杂的输入输出代码。
4. Scanner的原理和内部机制在深入使用Scanner类时,了解它的原理和内部机制是非常重要的。
Scanner类使用了正则表达式来解析输入,因此能够支持复杂的输入格式。
在实际应用中,我们可以通过给Scanner对象指定不同的分隔符和模式来定制化地解析输入。
这为我们处理各种不同格式的输入提供了便利。
5. 总结与回顾在本文中,我们全面评估了java.util.Scanner类的用法。
idea中utils的作用
idea中utils的作用idea中的utils是指常用工具类,它是指在实际开发中常常用到的公共方法或功能的集合。
这些工具类的作用是提供一些常用的方法或函数,以便开发人员在编写代码时可以更加快速和高效地完成任务。
一、为什么需要utils类?在实际开发中,我们经常会遇到一些常用的操作或计算,例如日期处理、字符串处理、文件操作等。
这些操作往往是与业务逻辑无关的通用操作,每次都需要重新编写,不仅繁琐而且浪费时间。
而utils类的作用就是将这些通用的操作进行封装,以供开发人员复用。
二、utils类的功能和特点1. 提供常用的方法utils类中包含了一系列常用的方法,例如日期格式化、字符串截取、文件读写等。
这些方法可以帮助开发人员实现特定的功能,从而减少了重复的代码编写。
2. 代码复用utils类的目的就是为了方便代码的复用。
通过将常用的操作进行封装,开发人员只需要调用相应的方法即可完成特定的功能,无需重写相同的代码,提高了开发效率。
3. 提高代码的可读性和可维护性由于utils类将一些常用的操作进行封装,使得代码更加简洁明了。
开发人员在阅读代码时可以更快地理解其功能,从而提高了代码的可读性。
同时,当需要修改某个功能时,只需要修改utils类中的对应方法即可,避免了在多个地方进行修改的麻烦,提高了代码的可维护性。
4. 提高开发效率由于utils类提供了常用的方法,开发人员无需从零开始编写代码,可以直接调用utils类中的方法,从而减少了开发时间。
这样可以更加专注于业务逻辑的实现,提高了开发效率。
三、utils类的使用方法1. 导入utils类在使用utils类的方法之前,需要先导入utils类。
通常情况下,utils类会以包的形式存在,开发人员只需导入相应的包即可使用utils类提供的功能。
2. 调用utils类的方法一旦导入了utils类,开发人员就可以直接调用其中的方法了。
根据utils类的设计,通常每个方法会有一些参数,这些参数用于指定方法执行的具体行为。
runtimeutil.exec 例子
1. 简介在软件开发过程中,经常会遇到需要调用外部命令或者启动外部程序的需求。
Java编程语言提供了很多实用的类来满足这种需求,其中一个非常常用的类就是runtimeutil.exec。
runtimeutil.exec允许Java 程序调用外部命令,并获得该外部命令的执行结果。
本文将以一个实际的例子来说明如何使用runtimeutil.exec类。
2. 什么是runtimeutil.execruntimeutil.exec是Java中的一个类,它允许Java程序调用外部命令。
通过runtimeutil.exec,可以在Java程序中执行命令行程序,比如调用系统命令、启动外部应用程序或者执行一段系统脚本等。
使用runtimeutil.exec可以方便地与操作系统进行交互,同时也可以获取命令执行的结果。
3. 使用runtimeutil.exec的例子假设我们需要在Java程序中调用系统命令"ipconfig"来获取当前系统的网络配置信息。
下面是一个示例代码:```javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class ExecExample {public static void m本人n(String[] args) {try {Process process = Runtime.getRuntime().exec("ipconfig"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();} catch (IOException e) {e.printStackTrace();}}}```以上代码中,我们首先通过调用Runtime.getRuntime().exec()方法来执行系统命令"ipconfig",然后通过读取process.getInputStream()获取命令执行的结果,最后将结果打印到控制台上。
java.util.Date用法小结
java.util.Date⽤法⼩结java中的时间操作不外乎这四种情况:1、获取当前时间2、获取某个时间的某种格式3、设置时间4、时间的运算好,下⾯就针对这三种情况,⼀个⼀个搞定。
⼀、获取当前时间有两种⽅式可以获得,第⼀种,使⽤Date类。
j2SE的包⾥有两个Date类,⼀个是java.sql.Date,⼀个是java.util.Date这⾥,要使⽤java.util.Date。
获取当前时间的代码如下Date date = new Date();date.getTime();还有⼀种⽅式,使⽤System.currentTimeMillis();这两种⽅式获得的结果是⼀样的,都是得到⼀个当前的时间的long型的时间的毫秒值,这个值实际上是当前时间值与1970年⼀⽉⼀号零时零分零秒相差的毫秒数。
当前的时间得到了,但实际的应⽤中最后往往不是要⽤这个long型的东西,⽤户希望得到的往往是⼀个时间的字符串,⽐如“2006年6⽉18号”,或“2006-06-18”,⽼外可能希望得到的是“06-18-2006”,诸如此类等等。
这就是下⼀个要解决的问题⼆、获取某个时间的某种格式获取时间的格式,需要⽤到⼀个专门⽤于时间格式的类java.text.SimpleDateFormat。
⾸先,定义⼀个SimpleDateFormat变量SimpleDateFormat sdf = new SimpleDateFormat("",Locale.SIMPLIFIED_CHINESE);这个构造函数的定义如下:SimpleDateFormat(String pattern, Locale locale)第⼀个参数pattern,我们后⾯再解释,这⾥我们使⽤⼀个"",第⼆个参数,是⽤来设置时区的,这⾥⽤到了java.util.Locale 这个类,这个类了⾯定义了很多静态变量,直接拿过来⽤就OK,我们把时区设置为Locale.SIMPLIFIED_CHINESE,只看名字,这个静态变量的意义已经很清楚了。
java.util包内容
Java.util包1.java.util包简介java.util包是Java内置的一个工具包,import java.util.*;2.java.util中是常用的工具类:Date类Date类对象用来表示时间和日期;该类提供一系列操纵日期和时间各组成部分的方法;Date类最多的用途是获取系统当前的日期和时间。
Date类的构造方法有6种重载方式,以下是比较常用的几种。
Date类的构造方法:Date类的常用方法:年份 y 由整数 year - 1900 表示。
月份由从 0 至 11 的整数表示;0 是一月、1 是二月等等;因此 11 是十二月。
一月中的某天按通常方式由整数 1 至 31 表示。
小时由从 0 至 23 的整数表示。
分钟按通常方式由 0 至 59 的整数表示。
秒由 0 至 60 的整数表示;在所有情形中,针对这些目的赋予方法的参数不需要在指定的范围内;例如,可以把日期指定为 1 月 32 日,并把它解释为 2 月 1 日的相同含义。
Date类示例SimpleDateFormat类示例作用:用来格式化日期并输入使用其format()来格式化日期Calendar类Calendar类也是用来操作日期和时间的类,但它可以以整数形式检索类似于年、月、日之类的信息;Calendar类是抽象类,无法实例化,要得到该类对象只能通过调用getInstance方法来获得;Calendar对象提供为特定语言或日历样式实现日期格式化所需的所有时间字段。
Calendar类的常用方法:Calendar类示例Random类使用Random类的对象来生成随机数该类的构造方法有2种重载方式:Random类的常用方法:Random类示例 ( 可以在方法刮号里面放随机的范围 )集合集合是将多个元素组成一个单元的对象;类似于数组,但数组最大的缺点是:长度受到限制(一经创建,就不可再改变),并且只能存放相同数据类型的元素;集合的长度没有限制,可以存放任意多的元素,而且元素的数据类型也可以不同;集合还提供一系列操纵数据的方法,如存储、检索等等。
通过代码实例跟我学Java语言程序设计及应用技术——util程序包中典型类的应用实例
1.1util程序包中典型类的应用实例1、BigDecimal是Java提供的一个不变的、任意精度的有符号十进制数对象(1)应用BigDecimal可以提高计算的精度在商业应用开发中,涉及金额等浮点数计算的数据,全部定义为String,数据库中可定义为字符型字段,在需要使用这些数据进行运算的时候,使用BigDecimal(String)构造BigDecimal对象进行运算,保证数据的精确计算。
下面为一个工具类,定义浮点数的加、减、乘、除和四舍五入等运算方法:import java.math.BigDecimal;public class MathExtend{ //默认除法运算精度private static final int DEFAULT_DIV_SCALE = 10;public static double add(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doublue();}public static String add(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.add(b2).toString();}public static double subtract(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doublue();}public static String subtract(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.subtract(b2).toString();}public static double multiply(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doublue();}public static String multiply(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.multiply(b2).toString();}public static double divide(double v1, double v2){return divide(v1, v2, DEFAULT_DIV_SCALE);}public static double divide(double v1,double v2, int scale){return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);}public static double divide(double v1,double v2,int scale, int round_mode){if(scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2, scale, round_mode).doublue();}public static String divide(String v1, String v2){return divide(v1, v2, DEFAULT_DIV_SCALE);}public static String divide(String v1, String v2, int scale){return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN); }public static String divide(String v1, String v2, int scale, int round_mode){if(scale < 0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.divide(b2, scale, round_mode).toString();}public static double round(double v,int scale){return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}public static double round(double v, int scale, int round_mode){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(Double.toString(v));return b.setScale(scale, round_mode).doublue();}public static String round(String v, int scale){return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}public static String round(String v, int scale, int round_mode){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(v);return b.setScale(scale, round_mode).toString();}}(2)控制四舍五入1)ROUND_HALF_UP:遇到.5的情况时往上近似,例:1.5 ->;22)ROUND_HALF_DOWN:遇到.5的情况时往下近似,例: 1.5 ->;13)ROUND_CEILING:如果BigDecimal是正的,则做ROUND_UP操作;而如果为负,则做ROUND_DOWN操作。
java.util包下的类及常用方法
java.util包下的类及常⽤⽅法1、⽇期类 Date类
常⽤⽅法
创建⽇期对象:Date date = new Date ( ) ;
获取当前时间以标准格式:date
获取当前时间的毫秒数:date.getTIme ( )
获取纪元时间:date。
toGMTString ( )
时间转成字符串:date.toString ( )
这个类的⼀些⽅法已经过时了、被⽇历类取代!
2、⽇历类 Calender类
常⽤⽅法
getlnstance():获取⽇历对象
get():获取指定的单位的⽇历数值(年,⽉,⽇等等)
set():设置指定单位的⽇历数值
add():添加指定单位的⽇历数值
getTimelnMills():获取⽇历的毫秒数
3、SCanner类
常⽤⽅法
扫描控制台:Scanner sc = new Scanner(System.in)
扫描字符串,遇到空格就返回给程序:sc.next()
扫描⼀个整数:sc.nextInt()
扫描⼀个⼩数:sc.nextDouble()
扫描⼀⾏:sc.nextLine()
4、定时器类 Timer类
常⽤⽅法
创建TImer对象:
Timer timer = new Timer();
Timer timer = new Timer(name);
timer.schedule(TimerTask,2000); 2秒后执⾏⼀次任务
t imer.schedule(TimerTask,2000,1000); 2秒后开始执⾏任务,每1s执⾏⼀次。
Java集合框架(java.util包)
Java集合框架(java.util包)集合的概念: 是⼀种⼯具类,可以存储任意数量、任意类型的对象(所以后⾯需要⽤到泛型,以约束集合中元素的类型)集合的作⽤: 1、在类的内部对属性进⾏组织 2、⽅便快速定位属性位置 3、某些集合接⼝,提供了⼀系列排列有序的元素,可以在序列中快速插⼊或删除 4、某些集合接⼝,提供了映射关系,可以通过关键字(key)快速查找到对应的唯⼀对象,⽽这个key可以是任意类型集合与数组的差别: 1、数组长度固定,集合长度可变 2、数组只能通过下标访问具体元素,集合则可通过任意类型查找所映射的具体对象Java集合框架体系结构:根接⼝——⼦接⼝——实现类(并未全部列出)List接⼝及其常⽤实现类——ArrayList 1、List是元素有序并且可以重复的集合,称为序列 2、List可以精确插⼊或删除某个位置的元素 3、ArrayList——数组序列,底层是由数组实现的注意:对象存⼊集合都会变成Object类型,取出时需要进⾏类型转换泛型: 集合中的元素可以是任意类型的对象,如果把某个对象放⼊集合,则会忽略他的类型,当作Object处理 1、泛型集合中,不能添加泛型规定的类型及其⼦类型以外的对象,编译期间会进⾏类型检查 2、泛型使⽤for each⽅法遍历集合时,不需要⽤Object,直接使⽤原类型即可 3、泛型集合中的限定类型不能使⽤基本数据类型,可以通过使⽤包装类限定允许存⼊的基本数据类型Set接⼝及其实现类——HashSet 1、Set是元素⽆序并且不可以重复的集合,称为“集” 2、HashSet——哈希集 3、Set中,同⼀个对象⽆论添加多少次,只有第⼀次会添加⽣效 4、Set中可以添加nullMap Map提供了⼀种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够根据key查找value,key和value可以是任意类型的对象 key和value属于Entry类的对象实例 key值不能重复 ⼀个value可以对应多个key,⼀个key只能对应⼀个value Map的泛型:Map<K, V> //K为key值的类型,V为value值的类型HashMap HashMap中的Entry对象是⽆序排列的 key值和value值可以为null,但是只能有⼀个key为null,因为key不可重复。
java_util包学习笔记
java util包学习笔记Java Util 包使用详解本章介绍Java的实用工具类库java.util包。
在这个包中,Java提供了一些实用的方法和数据结构。
例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。
图1.1给出了java.util包的基本层次结构图。
下面我们将具体介绍其中几个重要的类。
┌java.util.BitSet│java.util.Calendar│└java.util.GregorianCalendar│java.util.Date│java.util.Dictionary│└java.util.Hashtable│└java.util.Properties│java.util.EventObject│java.util.ResourceBundle┌普通类┤├java.util.ListResourceBundle││└java.util.PropertyResourceBundle││java.util.Local││java.util.Observable││java.util.Random││java.util.StringTokenizer││java.util.Vector││└java.util.StackJava.util┤└java.util.TimeZone│└java.util.SimpleTimeZone│┌java.util.Enumeration├接口┤java.util.EventListener│└java.util.Observer│┌java.util.EmptyStackException└异常类┤java.util.MissingResourceException│java.util.NoSuchElementException└java.util.TooManyListenersException图1.1 java.util包的基本层次结构1.2 日期类DateJava在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间。
Java开发常用Util工具类-StringUtil、CastUtil、Collectio。。。
Java开发常⽤Util⼯具类-StringUtil、CastUtil、Collectio。
字符串⼯具类StringUtil.javapackage com.***.util;/*** StringUtil* @description: 字符串⼯具类**/public class StringUtil {/*** 判断是否为空字符串最优代码* @param str* @return如果为空,则返回true*/public static boolean isEmpty(String str){return str == null || str.trim().length() == 0;}/*** 判断字符串是否⾮空* @param str 如果不为空,则返回true* @return*/public static boolean isNotEmpty(String str){return !isEmpty(str);}}数据类型转换类CastUtil.javapackage com.***.util;/*** CastUtil* @description: 数据转型⼯具类**/public class CastUtil {/*** @Description: 转为String类型* @Param: [obj]* @return: ng.String 如果参数为null则转为空字符串*/public static String castString(Object obj){return CastUtil.castString(obj,"");}/*** @Description: 转为String类型(提供默认值)* @Param: [obj, defaultValue] 将obj转为string,如果obj为null则返回default* @return: String*/public static String castString(Object obj,String defaultValue){return obj!=null?String.valueOf(obj):defaultValue;}/*** @Description: 转为double类型,如果为null或者空字符串或者格式不对则返回0* @Param: [obj]* @return: String*/public static double castDouble(Object obj){return CastUtil.castDouble(obj,0);}/*** @Description: 转为double类型,如果obj为null或者空字符串或者格式不对则返回defaultValue* @Param: [obj, defaultValue]* @return: String obj为null或者空字符串或者格式不对返回defaultValue*/public static double castDouble(Object obj,double defaultValue){double value = defaultValue; //声明结果,把默认值赋给结果if (obj!=null){ //判断是否为nullString strValue = castString(obj); //转换为Stringif (StringUtil.isNotEmpty(strValue)){ //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)try{value = Double.parseDouble(strValue); //不为空则把值赋给value}catch (NumberFormatException e){value = defaultValue; //格式不对把默认值赋给value}}}return value;}/*** 转为long型,如果obj为null或者空字符串或者格式不对则返回0* @return*/public static long castLong(Object obj){return CastUtil.castLong(obj,0);}/*** 转为long型(提供默认数值),如果obj为null或者空字符串或者格式不对则返回defaultValue* @param obj* @param defaultValue* @return obj为null或者空字符串或者格式不对返回defaultValue*/public static long castLong(Object obj,long defaultValue){long value = defaultValue; //声明结果,把默认值赋给结果if (obj!=null){ //判断是否为nullString strValue = castString(obj); //转换为Stringif (StringUtil.isNotEmpty(strValue)){ //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)try{value = Long.parseLong(strValue); //不为空则把值赋给value}catch (NumberFormatException e){value = defaultValue; //格式不对把默认值赋给value}}}return value;}/*** 转为int型* @param obj* @return如果obj为null或者空字符串或者格式不对则返回0*/public static int castInt(Object obj){return CastUtil.castInt(obj,0);}/*** 转为int型(提供默认值)* @param obj* @param defaultValue* @return如果obj为null或者空字符串或者格式不对则返回defaultValue*/public static int castInt(Object obj,int defaultValue){int value = defaultValue; //声明结果,把默认值赋给结果if (obj!=null){ //判断是否为nullString strValue = castString(obj); //转换为Stringif (StringUtil.isNotEmpty(strValue)){ //判断字符串是否为空(是否为空只能判断字符串,不能判断Object)try{value = Integer.parseInt(strValue); //不为空则把值赋给value}catch (NumberFormatException e){value = defaultValue; //格式不对把默认值赋给value}}}return value;}/*** 转为boolean型,不是true的返回为false* @param obj* @return*/public static boolean castBoolean(Object obj){return CastUtil.castBoolean(obj,false);}/*** 转为boolean型(提供默认值)* @param obj* @param defaultValue* @return*/public static boolean castBoolean(Object obj,boolean defaultValue){boolean value = defaultValue;if (obj!=null){ //为null则返回默认值value = Boolean.parseBoolean(castString(obj)); //底层会把字符串和true对⽐,所以不⽤判断是否为空字符串 }return value;}}集合⼯具类CollectionUtil.javapackage com.***.util;import mons.collections4.CollectionUtils;import mons.collections4.MapUtils;import java.util.Collection;import java.util.Map;/*** @description: 集合⼯具类**/public class CollectionUtil {/*** 判断collection是否为空* @param collection* @return*/public static boolean isEmpty(Collection<?> collection){//return CollectionUtils.isEmpty(collection);return collection == null || collection.isEmpty();}/*** 判断Collection是否⾮空* @return*/public static boolean isNotEmpty(Collection<?> collection){return !isEmpty(collection);}/*** 判断map是否为空* @param map* @return*/public static boolean isEmpty(Map<?,?> map){//return MapUtils.isEmpty(map);return map == null || map.isEmpty();}/*** 判断map是否⾮* @param map* @return*/public static boolean isNotEmpty(Map<?,?> map){return !isEmpty(map);}}数组⼯具类ArrayUtil.java/*** 数组⼯具类*/public class ArrayUtil {/*** 判断数组是否为空* @param array* @return*/public static boolean isNotEmpty(Object[] array){return !isEmpty(array);}/*** 判断数组是否⾮空* @param array* @return*/public static boolean isEmpty(Object[] array){return array==null||array.length==0;}}Properties⽂件操作类PropsUtil.javapackage com.***.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.util.Properties;/*** 属性⽂件⼯具类*/public class PropsUtil {private static final Logger LOGGER = LoggerFactory.getLogger(PropsUtil.class);/*** 加载属性⽂件* @param fileName fileName⼀定要在class下⾯及java根⽬录或者resource跟⽬录下 * @return*/public static Properties loadProps(String fileName){Properties props = new Properties();InputStream is = null;try {//将资源⽂件加载为流is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName); props.load(is);if(is==null){throw new FileNotFoundException(fileName+"file is not Found");}} catch (FileNotFoundException e) {LOGGER.error("load properties file filure",e);}finally {if(is !=null){try {is.close();} catch (IOException e) {LOGGER.error("close input stream failure",e);}}}return props;}/*** 获取字符型属性(默认值为空字符串)* @param props* @param key* @return*/public static String getString(Properties props,String key){return getString(props,key,"");}/*** 获取字符型属性(可制定默认值)* @param props* @param key* @param defaultValue 当⽂件中⽆此key对应的则返回defaultValue* @return*/public static String getString(Properties props,String key,String defaultValue){String value = defaultValue;if (props.containsKey(key)){value = props.getProperty(key);}return value;}/*** 获取数值型属性(默认值为0)* @param props* @param key* @return*/public static int getInt(Properties props,String key){return getInt(props,key,0);}/*** 获取数值型属性(可指定默认值)* @param props* @param key* @param defaultValue* @return*/public static int getInt(Properties props,String key,int defaultValue){int value = defaultValue;if (props.containsKey(key)){value = CastUtil.castInt(props.getProperty(key));}return value;}/*** 获取布尔型属性(默认值为false)* @param props* @param key* @return*/public static boolean getBoolean(Properties props,String key){return getBoolean(props,key,false);}/*** 获取布尔型属性(可指定默认值)* @param props* @param key* @param defaultValue* @return*/public static boolean getBoolean(Properties props,String key,Boolean defaultValue){boolean value = defaultValue;if (props.containsKey(key)){value = CastUtil.castBoolean(props.getProperty(key));}return value;}}⽤到的maven坐标<!--slf4j--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.9</version></dependency>常⽤流操作⼯具类StreamUtil.javapublic class StreamUtil {private static final Logger LOGGER = LoggerFactory.getLogger(StreamUtil.class);/*** 从输⼊流中获取字符串* @param is* @return*/public static String getString(InputStream is){StringBuilder sb = new StringBuilder();try {BufferedReader reader = new BufferedReader(new InputStreamReader(is)); String line;while((line=reader.readLine())!=null){sb.append(line);}} catch (IOException e) {LOGGER.error("get string failure",e);throw new RuntimeException(e);}return sb.toString();}}编码⼯具类public class CodecUtil {private static final Logger LOGGER = LoggerFactory.getLogger(CodecUtil.class);/*** 将URL编码*/public static String encodeURL(String source){String target;try {target = URLEncoder.encode(source,"utf-8");} catch (UnsupportedEncodingException e) {LOGGER.error("encode url failure",e);throw new RuntimeException(e);//e.printStackTrace();}return target;}/*** 将URL解码*/public static String dencodeURL(String source){String target;try {target = URLDecoder.decode(source,"utf-8");} catch (UnsupportedEncodingException e) {LOGGER.error("encode url failure",e);throw new RuntimeException(e);//e.printStackTrace();}return target;}}Json⼯具类package org.smart4j.framework.util;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.IOException;/*** @program: JsonUtil* @description: JSON⼯具类* @author: Created by QiuYu* @create: 2018-10-24 15:55*/public class JsonUtil {private static final Logger LOGGER = LoggerFactory.getLogger(JsonUtil.class);private static final ObjectMapper OBJECT_MAPPER =new ObjectMapper();/*** 将POJO转换为JSON*/public static <T> String toJson(T obj){String json;try {json = OBJECT_MAPPER.writeValueAsString(obj);} catch (JsonProcessingException e) {LOGGER.error("convert POJO to JSON failure",e);throw new RuntimeException(e);//e.printStackTrace();}return json;}/*** 将JSON转为POJO*/public static <T> T fromJson(String json,Class<T> type){T pojo;try {pojo = OBJECT_MAPPER.readValue(json,type);} catch (IOException e) {LOGGER.error("convert JSON to POJO failure",e);throw new RuntimeException(e);//e.printStackTrace();}return pojo;}}⽇期⼯具类DataUtil.java/*** 根据年⽉获取当⽉最后⼀天* @param yearmonth yyyy-MM* @return yyyy-MM-dd* @throws ParseException*/public static String getLastDayOfMonth(String yearmonth) {try {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");Date dd = format.parse(yearmonth);Calendar cal = Calendar.getInstance();cal.setTime(dd);int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);String result = yearmonth+"-"+cc;return result;} catch (ParseException e) {e.printStackTrace();}return null;}时间戳⼯具类/*** 时间戳转换成⽇期格式字符串* @param seconds 精确到秒的字符串* @param formatStr 为null时默认yyyy-MM-dd HH:mm:ss* @return返回⽇期字符串*/public static String timeStamp2Date(String seconds,String format) {if(seconds == null || seconds.isEmpty() || seconds.equals("null")){return "";}if(format == null || format.isEmpty()){format = "yyyy-MM-dd HH:mm:ss";}SimpleDateFormat sdf = new SimpleDateFormat(format);//Date是精确到毫秒的13位时间戳,所以秒要*1000Date date = new Date(Long.valueOf(seconds+"000"));String dateString = sdf.format(date);return dateString;}/*** ⽇期格式字符串转换成时间戳* @param date 字符串⽇期* @param format 默认:yyyy-MM-dd HH:mm:ss* @return精确到秒的时间戳*/public static String date2TimeStamp(String date_str,String format){if(format == null || format.isEmpty()){format = "yyyy-MM-dd HH:mm:ss";}try {SimpleDateFormat sdf = new SimpleDateFormat(format);return String.valueOf(sdf.parse(date_str).getTime()/1000);} catch (Exception e) {e.printStackTrace();}return "";}/*** 取得当前时间戳(精确到秒)* @return*/public static String getNowTimeStamp(){long time = System.currentTimeMillis();String timestamp = String.valueOf(time/1000);return timestamp;}精度计算⼯具类DoubleTool.javapackage com.gmtx.system.tools;import java.io.Serializable;import java.math.BigDecimal;import java.math.RoundingMode;/*** @ClassName: DoubleTool* @Description: java类精确计算⼩数* double的计算不精确,会有类似0.0000000000000002的误差,正确的⽅法是使⽤BigDecimal或者⽤整型,整型地⽅法适合于货币精度已知的情况,⽐如12.11+1.10转成1211+110计算,最后再/100即可 * @author秋⾬* 修改历史* 序号------原因------修改⼈---⽇期---* 1.* 2.*/public class DoubleTool implements Serializable {private static final long serialVersionUID = -3345205828566485102L;//默认除法运算精度private static final Integer DEF_DIV_SCALE = 2;/*** 提供精确的加法运算。
Java培训之BeanUtils的使用案例详解
Java培训之BeanUtils的使⽤案例详解
1.案例创建步骤
(1)创建web应⽤,Example5;
(2)在该应⽤下新建⼀个Class类,名称为Person,主要内容见代码;
(3)在该应⽤下新建⼀个Class类,名称为Demo,然后在该类中定义两个单元测试⽅法fun1,fun2,这些⽅法的主要作⽤是为了测试BeanUtils类的某些⽅法,主要内容见代码;
(4)在该应⽤下再新建⼀个Class类,名称为User,主要内容见代码;
(5)在该应⽤下新建⼀个Class类,名称为CommonUtils,该类是⼀个⼯具类,在该类中定义两个静态⽅法,主要内容见代码;
(6)在Demo类中再定义⼀个单元测试⽅法fun3,⽤来测试CommonUtils类中的⽅法,主要内容见代码;
(7)对Demo类中的三个单元测试⽅法进⾏测试。
2.具体代码
Example5/Person详细代码如下所⽰:
Example5/User详细代码如下所⽰:
Example5/Demo详细代码如下所⽰:
Example5/CommonUtils详细代码如下所⽰:
3.运⾏结果
Demo类中的fun1()⽅法运⾏结果如下:
Person [name=张三, age=23, gender=男]
23
fun2()⽅法的运⾏结果如下:
User [username=zhangSan, password=123]
Fun3()⽅法的运⾏结果如下:
User [username=lisi, password=123]。
Java语言中的时间和日期处理相关的代码实现
java.util包 java.util包是Java语⾔提供的⼯具类包,该包中包含了如⽇期、随机数和数据结构实现类等⼀系列的⼯具类实现,是学习Java语⾔的基础包之⼀。
本部分就以Java语⾔中常⽤的时间和⽇期处理、随机数处理以及集合框架为基础进⾏介绍。
时间和⽇期处理 使⽤程序进⾏时间和⽇期处理,是程序员必须的⼀种常⽤技能,在不同的程序设计语⾔中提供了不同的格式进⾏实现,现在就介绍⼀下Java语⾔中的实现⽅式,以及基本的应⽤,使得对于Java语⾔的时间和⽇期处理技术有⽐较全⾯的认识。
在程序中,某个固定的时间代表的都是⼀个时间点,也就是⼀个时间的瞬间,例如2009年3⽉8⽇15点50分0秒,在实际的应⽤中,经常需要对于两个时间进⾏⽐较或计算时间之间的差值,这些功能在Java语⾔中都可以很⽅便的实现。
在Java语⾔中,时间的表达单位是毫秒。
也就是说,Java语⾔中的时间处理可以精确到毫秒。
在Java语⾔中,表达时间的⽅式有两种: a、绝对时间。
以直观的形式来表达某个时间点,例如2009年10⽉10号0点0分0秒。
使⽤这种形式表达时间,使⽤起来⽐较直观,但是不⽅便进⾏时间之间的计算。
例如⽆法很直观的计算2020年1⽉1号0点0分0秒和上⾯这个时间之间相差多少天。
绝对时间以对象的形式进⾏表达,Java API中提供了java.util包中的Date类和Calendar类的对象进⾏表达。
b、相对时间。
以⼀个long型的数字表达某个时间点。
例如102847423468。
使⽤这种⽅式的优缺点和绝对时间刚好相反。
这种⽅式很⽅便时间之间的计算,但是阅读起来很不直观。
在Java API中以需要表达的时间点,例如2009年10⽉10号0点0分0秒,和GMT(格林威治时间,也就是伦敦时间)1970年1⽉1号0点0分0秒之间相差的毫秒数作为相对时间的数值,如果该时间在这个时间只好,则相对时间为正数,否则相对时间为负数。
《Java程序设计》辅导资料9
Java程序设计辅导资料九主题:第四章Java.util包中的工具类库(课件)学习时间:2014年11月24日—11月30日内容:我们这周主要学习《Java程序设计》这门课程的第4章第4节关于Java.util 包中的工具类库的详细介绍以及依次相关内容。
希望通过下面的内容能使同学们对Java语言的Java.util包有进一步的了解。
知识要点:1、Java.util介绍2、日期类3、Arrays数组类4、Map集合类5、各个类的特点重点与难点:重点:Arrays数组类的功能、Java.util包含的类难点:Map集合类的功能一、Java.util中的工具类库及日期类软件包 java.util包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
日期类java.util包的日期类包括Date、Calendar和GregorianCalendar,他们描述日期和时间,提供对日期值的许多操作方法,如获得当前日期,比较两个日期,判断日期的先后等。
Java以一个长整形表示一个日期,该长整形表示从格林威治时间1970-1-1 00:00:00开始至某时刻的累计毫秒数。
System.currentTimeMillis()方法返回表示当前日期和时间的长整数。
Date类Date日期类部分声明如下:public class Date extends Object implementsjava.io.Serializable,Cloneable,Comparable<Date>{public Date(){this(System.currentTimeMillis());}public Date(long date)public void setTime(long time)public long getTime()public int compare(Date date)}Calendar类Calendar日期类部分声明如下:public abstract class Calendar implementsSerializable,Cloneable,Comparable<Calendar>{public static final int YEARpublic static final int MONTHpublic static final int DATEpublic static final int HOURpublic static final int MINUTEpublic static final int SECONDpublic static final int DAY_OF_WEEKpublic static Calendar getInstance()public int get(int field)public final Date getTime()public final void setTime(Date date)public final void set(int year,int month,int date)public final void set(int year,int month,int date,int hour,int minute)public long getTimeInMillis()public void setTimeInMillis(long millis)}Calendar类通常用于需要将日期值分解时,Calendar类声明了YEAR等多个常量,分别表示年、月、日、星期等日期的一部分。
util包的用法
util包的用法util包是Java中十分重要的一个工具类集合,其中所涵盖的内容非常广泛,如日期、数学计算、随机数、正则表达式、文件读写等等,可以方便我们在编写Java程序时进行复杂的操作。
随着开源社区的不断发展及Java语言自身的迭代更新,util包所提供的功能也得到了不断地扩充和优化。
本文将从多个方面详细介绍util包的用法。
1. 日期类Java.util包中的日期类能够方便地表示各种日期和时间格式。
可以使用`java.util.Date`和`java.util.Calendar`来处理日期和时间。
其中,Date类提供了一些方法,可以获取当前的系统时间,也可以将日期和毫秒数进行相互转换;Calendar类则可以获取当前日期的年份、月份、日期、小时、分钟和秒等信息。
2. 数字类Java.math包中提供的数字类可以实现任意精度的计算,这对于一些需要高精度计算的场景非常有效。
其中,BigDecimal类和BigInteger类是比较常用的两个类,可以分别实现大浮点数和大整数的计算。
3. 随机数类Java.util包中提供的随机数类能够快速方便地生成伪随机数。
其中,`java.util.Random`类可以用来生成一系列的随机数。
例如,下面的代码可以生成0-99之间的一个随机数:```javaRandom rand = new Random();int n = rand.nextInt(100);```4. 字符串类Java.util包提供了一些非常方便的字符串函数。
例如,`java.util.StringTokenizer`类可以用来切分字符串,其构造函数所需的参数最常为被要切分的字符串和分隔符。
Java.util.regex包中提供了正则表达式的支持,可以用来完成字符串匹配、替换等操作。
5. 集合类Java.util包提供了各种类型的集合类,例如,ArrayList、HashMap、TreeSet等。
java 例子程序
java 例子程序Java是一种广泛应用于开发各种类型应用程序的计算机编程语言。
它具有跨平台性、面向对象的特点,广泛应用于企业级应用开发、移动应用开发、嵌入式系统开发等领域。
下面将列举10个Java例子程序,以展示Java语言的一些常见用法和功能。
1. 计算两个数的和```javapublic class Sum {public static void main(String[] args) {int num1 = 10;int num2 = 20;int sum = num1 + num2;System.out.println("两个数的和为:" + sum);}}```这个例子程序演示了如何在Java中进行基本的数学运算,并通过标准输出打印结果。
2. 判断一个数是否为偶数```javapublic class EvenNumber {public static void main(String[] args) {int num = 6;if (num % 2 == 0) {System.out.println("该数是偶数");} else {System.out.println("该数不是偶数");}}}```这个例子程序展示了如何使用条件语句判断一个数是否为偶数,并根据判断结果输出相应的信息。
3. 求一个数组的平均值```javapublic class Average {public static void main(String[] args) {int[] arr = {5, 10, 15, 20, 25};int sum = 0;for (int i = 0; i < arr.length; i++) {sum += arr[i];}double average = (double) sum / arr.length;System.out.println("数组的平均值为:" + average);}}```这个例子程序演示了如何使用循环结构计算一个数组的平均值,并将结果打印出来。
工具篇-Java中一些utils
⼯具篇-Java中⼀些utils下边是整理的⼀些Java开发的utils,顺便吐槽下新浪博客的编辑器排版跟我写的博客⼀样烂,所以改⽤博客园⼀、字符串1. Java中String与其他类型之间的转换String与⽇期对象1public static SimpleDateFormat df1 = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", );2public static SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", );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 = str.replaceAll("^(0+)", "");3 System.out.println(newStr);这⾥说明下replace和replaceAll的区别:replace的参数是char和CharSequence,即可以⽀持字符的替换,也⽀持字符串的替换;replaceAll的参数是regex,即基于正则表达式的替换。
Javajava.util.Objects的用法以及案例
Javajava.util.Objects的用法以及案例Java java.util.Objects的用法以及案例文档修订摘要目录Java java.util.Objects的用法以及案例 (1)1. 概述 (3)1.1. 概述 (4)1.2. 代码实例 (4)1.概述来源网站1.1.概述JDK1.7,新增的一个工具类java.util.Objects类。
其封装了一些简单的方法,分别是:hashCode()、equals()、toString()和compare()等方法。
1.2.代码实例package com.what21;import parator;import java.util.Objects;public class ObjectsMain {/*** @param args*/public static void main(String[] args) {//====equals()System.out.println(Objects.equals(1, 1));System.out.println(Objects.equals(new Object(), new Object())) ;//====hash()System.out.println(Objects.hash(1));System.out.println(Objects.hash(new Object()));//====toString()System.out.println(Objects.toString(1));System.out.println(Objects.toString(new Object()));System.out.println(Objects.toString(null, "nullDefault"));//====compare()System.out.println(pare(1, 2, new Comparator() { @Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}}));System.out.println(pare(new Object(), new Object(), new Comparator@Overridepublic int compare(Object o1, Object o2) {return o1.hashCode() - o2.hashCode();}}));//====isNull()System.out.println(Objects.isNull(new Object())); System.out.println(Objects.isNull(null));System.out.println(Objects.isNull(1));//====nonNull()System.out.println(Objects.nonNull(new Object())); System.out.println(Objects.nonNull(null));System.out.println(Objects.nonNull(1));//====requireNonNull()System.out.println(Objects.requireNonNull(new Object())); try{System.out.println(Objects.requireNonNull(null));}catch(NullPointerException e) {e.printStackTrace();}try{System.out.println(Objects.requireNonNull(null, "123")); }catch(NullPointerException e) {e.printStackTrace();}System.out.println(Objects.requireNonNull(1));//====deepEquals()Object o1 = new Object();Object o2 = o1;System.out.println(Objects.deepEquals(o1, o2)); System.out.println(Objects.deepEquals("123", "123"));}}。
java中util包中用来干什么的
java中util包中⽤来⼲什么的
util 是utiliy的缩写,意为多⽤途,⼯具性质的包。
这个包中主要放了:集合类(如ArrayList、HashMap等)、随机数产⽣类、
属性⽂件读取类、定时器类、翻页⼯具类等,包含了⽇期转换、字符串处理、获取编译环境等信息。
这些类极⼤地⽅便了Java编程,⽇常开发中,经常要⽤来这些类。
import java.util.* 和 import java.util.Scanner的区别:
1、import java.util.*表⽰把util包下的所有类都导⼊到程序中去,⽽import java.util.Scanner表⽰将util包下特定的类Scanner导⼊⾄程序中
2、*表⽰的是通配符,这⾥表⽰代指util包下的所有类,⽽Scanner是具体的类
注意:实际开发总,都采⽤import java.util.Scanner的形式导⼊特定的包,只有⽤到的时候才import,不然会影响程序执⾏的效率。
Java实现的JSONUtil工具类与用法示例
Java实现的JSONUtil⼯具类与⽤法⽰例本⽂实例讲述了Java实现的JSONUtil⼯具类与⽤法。
分享给⼤家供⼤家参考,具体如下:import java.util.HashMap;import java.util.Map;import com.alibaba.druid.util.StringUtils;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;public class JSONUtils {/*** Bean对象转JSON** @param object* @param dataFormatString* @return*/public static String beanToJson(Object object, String dataFormatString) {if (object != null) {if (StringUtils.isEmpty(dataFormatString)) {return JSONObject.toJSONString(object);}return JSON.toJSONStringWithDateFormat(object, dataFormatString);} else {return null;}}/*** Bean对象转JSON** @param object* @return*/public static String beanToJson(Object object) {if (object != null) {return JSON.toJSONString(object);} else {return null;}}/*** String转JSON字符串** @param key* @param value* @return*/public static String stringToJsonByFastjson(String key, String value) {if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {return null;}Map<String, String> map = new HashMap<String, String>();map.put(key, value);return beanToJson(map, null);}/*** 将json字符串转换成对象** @param json* @param clazz* @return*/public static Object jsonToBean(String json, Object clazz) {if (StringUtils.isEmpty(json) || clazz == null) {return null;}return JSON.parseObject(json, clazz.getClass());}/*** json字符串转map** @param json* @return*/@SuppressWarnings("unchecked")public static Map<String, Object> jsonToMap(String json) {if (StringUtils.isEmpty(json)) {return null;}return JSON.parseObject(json, Map.class);}}测试:JSON字符串转mappublic static void main(String[] args) {String jsonStr = "{'userName':'huangbaokang','password':'123456'}";Map<String, Object> map = JSONUtils.jsonToMap(jsonStr);System.out.println(map.get("userName"));}输出:huangbaokangJSON字符串转对象:新建User类public class User {private String userName;private String password;public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}public static void main(String[] args) {String jsonStr = "{'userName':'huangbaokang','password':'123456'}";User user = (User) JSONUtils.jsonToBean(jsonStr, new User());System.out.println("⽤户名="+user.getUserName()+" 密码="+user.getPassword());}测试输出:输出⽤户名=huangbaokang 密码=123456对象转JSONpublic static void main(String[] args) {User user = new User();user.setUserName("huangbaokang");user.setPassword("123456");String result = JSONUtils.beanToJson(user);System.out.println(result);}测试输出:{"password":"123456","userName":"huangbaokang"}在这⾥⼯具类应⽤的jar为阿⾥巴巴的fastjson,在lib中加⼊相关jar。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.1util程序包中典型类的应用实例1、BigDecimal是Java提供的一个不变的、任意精度的有符号十进制数对象(1)应用BigDecimal可以提高计算的精度在商业应用开发中,涉及金额等浮点数计算的数据,全部定义为String,数据库中可定义为字符型字段,在需要使用这些数据进行运算的时候,使用BigDecimal(String)构造BigDecimal对象进行运算,保证数据的精确计算。
下面为一个工具类,定义浮点数的加、减、乘、除和四舍五入等运算方法:import java.math.BigDecimal;public class MathExtend{ //默认除法运算精度private static final int DEFAULT_DIV_SCALE = 10;public static double add(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doublue();}public static String add(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.add(b2).toString();}public static double subtract(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doublue();}public static String subtract(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.subtract(b2).toString();}public static double multiply(double v1, double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doublue();}public static String multiply(String v1, String v2){BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.multiply(b2).toString();}public static double divide(double v1, double v2){return divide(v1, v2, DEFAULT_DIV_SCALE);}public static double divide(double v1,double v2, int scale){return divide(v1, v2, scale, BigDecimal.ROUND_HALF_EVEN);}public static double divide(double v1,double v2,int scale, int round_mode){if(scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2, scale, round_mode).doublue();}public static String divide(String v1, String v2){return divide(v1, v2, DEFAULT_DIV_SCALE);}public static String divide(String v1, String v2, int scale){return divide(v1, v2, DEFAULT_DIV_SCALE, BigDecimal.ROUND_HALF_EVEN); }public static String divide(String v1, String v2, int scale, int round_mode){if(scale < 0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(v1);BigDecimal b2 = new BigDecimal(v2);return b1.divide(b2, scale, round_mode).toString();}public static double round(double v,int scale){return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}public static double round(double v, int scale, int round_mode){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(Double.toString(v));return b.setScale(scale, round_mode).doublue();}public static String round(String v, int scale){return round(v, scale, BigDecimal.ROUND_HALF_EVEN);}public static String round(String v, int scale, int round_mode){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(v);return b.setScale(scale, round_mode).toString();}}(2)控制四舍五入1)ROUND_HALF_UP:遇到.5的情况时往上近似,例:1.5 ->;22)ROUND_HALF_DOWN:遇到.5的情况时往下近似,例: 1.5 ->;13)ROUND_CEILING:如果BigDecimal是正的,则做ROUND_UP操作;而如果为负,则做ROUND_DOWN操作。
4)ROUND_DOWN:从不在舍弃(即截断)的小数之前增加数字。
5)ROUND_FLOOR:如果BigDecimal为正,则作ROUND_UP;如果为负,则作ROUND_DOWN。
6)ROUND_HALF_DOWN:若舍弃部分> .5,则作ROUND_UP;否则将作ROUND_DOWN。
7)ROUND_HALF_EVEN:如果舍弃部分左边的数字为奇数,则作ROUND_HALF_UP;如果它为偶数,则作为ROUND_HALF_DOWN8)ROUND_HALF_UP:若舍弃部分>=.5,则作ROUND_UP;否则将作ROUND_DOWN9)ROUND_UNNECESSARY:该“伪舍入模式”实际是指明所要求的操作必须是精确的,因此不需要舍入操作。
10)ROUND_UP:总是在非0舍弃小数(即截断)之前增加数字。
2、JDK 5中的java.util.concurrent.locks.Lock锁(1)synchronized是独占锁尽管synchronized在语法上已经足够简单了,在JDK 5之前只能借助此实现,但是由于是独占锁,性能却不高,因此JDK 5以后就开始借助于JNI来完成更高级的锁实现。
独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。
而另一个更加有效的锁就是乐观锁。
所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
(2)JDK 5中的锁是接口java.util.concurrent.locks.Lock另外java.util.concurrent.locks.ReadWriteLock提供了一对可供读写并发的锁。
(3)synchronized和java.util.concurrent.locks.Lock的异同1)主要相同点:Lock能完成synchronized所实现的所有功能2)主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。
synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
尽管synchronized实现Lock的相同语义,并且在语法上比Lock要简单多,但是前者却比后者的开销要大得多。
(4)lock()和unlock()方法1)void lock(); 获取锁,如果锁不可用,出于线程调度目的,将禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态。
2)void unlock(); 释放锁,对应于lock()、tryLock()、tryLock(xx)、lockInterruptibly()等操作,如果成功的话应该对应着一个unlock(),这样可以避免死锁或者资源浪费。