1:Scanner类
主要作用:
获取输入,Scanner是一个基于正则的文本扫描器;
Scanner有多个构造方法,用于实现从输入流、文件、字符串中解析数据;
Scanner是1.5有了的,1.5之前使用的是BufferedReader
主要方法:
hasNext():是否还有下一项输入;
hasNextXxx():是否有下一个输入项(Xxx->int,long等基本类型的String形式);
nextXxx():获取下一个Xxx类型的数据;
/**默认情况下每一项输入按照空格、tab、回车分割;
demo_1:键盘数据源
1 package scanner; 2 import java.util.Scanner; 3 public class demo_1 { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); //指定数据源为:键盘输入 6 sc.useDelimiter(" "); //指定(Delimiter-定界符)为:回车 7 while(sc.hasNext()){ 8 String inStr = sc.next(); 9 System.out.println("inStr"); 10 } 11 } 12 }
demo_2:文件数据源
1 package scanner; 2 import java.io.File; 3 import java.io.FileNotFoundException; 4 import java.util.Scanner; 5 public class demo_2 { 6 public static void main(String[] args) throws FileNotFoundException { 7 Scanner sc = new Scanner(new File("a.txt")); //指定数据源:文件 8 while(sc.hasNextLine()){ //是否有下一行 9 String inStr = sc.nextLine(); //获取下一行 10 System.out.println("inStr"); 11 } 12 } 13 }
System类:
作用:
java 是跨品台语言,在程序中可以使用System类和Runtime类和特定的平台交互;
System类代表当前运行的平台,System提供了不少类属性和类方法。
System类提供了:标准输入、标准输出、错误输出的类属性,提供了用于获取系统属性的类方法,提供了加载文件和动态链接库的方法;
垃圾回收方法gc(),系统当前时间currentTimeMillis()和nanoTime();
获取某个对象的精确哈希值identityHashCode(Object x),这个哈希值是按照类的地址计算出来的。(hashCode()方法可以重写但是这个方法不能)
demo_1:
package scanner; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import java.util.Properties; public class demo_1 { public static void main(String[] args) throws FileNotFoundException, IOException{ Map<String,String> env = System.getenv(); //获取系统所有的环境变量 for(String name : env.keySet()){ System.out.println(name+"->"+env.get(name)); } System.out.println("JAVA_HOME="+System.getenv("JAVA_HOME")); //获取指定环境变量 Properties propts = System.getProperties(); //获取所有的系统属性 propts.store(new FileOutputStream("propts.txt"),"System properties"); //将系统属性输出到文件中 System.out.println(System.getProperty("os.name")); //获取指定系统属性 } }
demo_2:
package scanner; public class demo_1 { public static void main(String[] args){ //String类自定义了hashCode方法为:根据字符序列计算hashCode;(字符串相同hashCode就是相同) String s1 = new String("hello"); String s2 = new String("hello"); boolean b1 = s1.hashCode() == s2.hashCode(); //返回true boolean b2 = System.identityHashCode(s1) != System.identityHashCode(s2); //放回true } }
Runtime类
Runtime类表示java程序运行吃的环境,每一个java程序都有一个与之对应的Runtime实例通过getRuntime()方法获得;
作用:
1: 获取jvm信息:处理器数量、内存信息等。也提供了垃圾回收、清理系统资源、加载动态链接库。
2: 单独启动一条进程来运行操作系统的命令。
demo_1:
1 package demo; 2 import java.io.IOException; 3 public class Demo { 4 public static void main(String[] args) throws IOException{ 5 Runtime runtime = Runtime.getRuntime(); 6 System.out.println("处理器数量:"+runtime.availableProcessors()); 7 System.out.println("空闲内存:"+runtime.freeMemory()); 8 System.out.println("总内存:"+runtime.totalMemory()); 9 System.out.println("最大可用内存:"+runtime.maxMemory()); 10 //启动一个线程来执行操作系统命令 11 runtime.exec("notepad.exe"); 12 } 13 }
BigDecimal类:
java中的long,double类会引起精度的丢失,BigDecimal类解决了这个问题。(其他语言也会出现精度丢失的问题)
例如:0.05 + 0.01 = 0.060000000000000005
BigDecimal类有大量的构造器来方便构造各种类型的大小数。
包括:将各种数字类型->BigDecimal。String类型的数字->BigDecimal
new BigDecimal(Doublce dou)会造成精度流失,推荐使用new BigDecimal(String num)来构造。
如果非要用double可以使用BigDecimal.valueOf(Double dou)方法。
1 package demo; 2 import java.math.BigDecimal; 3 public class Demo { 4 public void mian(String[] args){ 5 //String构造 6 BigDecimal b1 = new BigDecimal("0.05"); 7 BigDecimal b2 = new BigDecimal("0.01"); 8 //加,减,乘,除 9 b1.add(b2); //0.06 10 b1.subtract(b2); //.0.4 11 b1.multiply(b2); //0.0005 12 b1.divide(b2); //5 13 //使用double构造 14 BigDecimal b3 = BigDecimal.valueOf(0.05); 15 BigDecimal b4 = BigDecimal.valueOf(0.01); 16 //加,减,乘,除 17 b3.add(b4); //0.06000000000....... 18 b3.subtract(b4); 19 b3.multiply(b4); 20 b3.divide(b4); 21 //*****以后还是用 new BigDecimal(String str) 吧 22 //#####上面运算结果都是BigDecimao类型的。(double->BigDecimal->double) 23 //double->BigDeciaml new BigDecimal(""+double); 24 //BigDecimal->double bigDecimal.doubleValue(); 25 } 26 }
Date类:
Date类的历史悠久,很多方法过时了,不推荐使用。
剩下的几个有用的方法如下:
构造方法:
Date():生成当前时间对应的Date对象。底层调用了System.currentTimeMillis()方法获取的时间long值
Date(Long date):根据时间long值生成Date对象。
普通方法:
Boolean after(Date date)该日期是否在指定日期之后
Boolean before(Date date)改日期是否在指定日期之前
int compareTo(Date date)比较两个日期的大小。返回-1,1
long getTime():返回对应时间的Long值,1970.1.1到现在的毫秒值
void setTime(long time):设置Date对象的时间
Calendar类:
Calendar类是一个抽象类,表示日历,提供了日历相关的公用方法。其子类实现了各种日历(GregorianCalendar类就是我们说的公历,网上也有农历的实现)
getInstance方法:
Calendar抽象类提供了几个getInstance方法,会根据TimeZone,Locale构造Calendar,不指定时按照默认的。
Calendar类和Date类都是日期类型的工具类,他们可以自由的互相转换:
//Calendar -> Date
Calendar calendar = new Calendar.getInstance();
Date date = calendar.getTime();
//Date -> Calendar
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
Calendar提供了大量日期访问修改的方法例如:
void add(int field , int amount):根据日期规则给日期加减指定时间。
void roll(int fidld , int amount):和add方法类似,但是这个方法是有上限的。
int get(int field): 获取指定日历字段的值。(获取年,月,日...)
void set(int field , int value):将给定的日历字段设置为指定的值
void set(int year, int month ,int day):设置年月日,还有个重载的方法可以设置年月日时分秒
上面的int类型的参数都是Calendar类定义的Int类型的常量:例如:Calendar.YEAR,Calendar.MONTH等,(注意:Calendar.MONTH是0-11)
add(int faild , int amount)和roll(int faild , int amount)的区别:
add方法就是我们想象中的加日期,减日期,某天(2017-12-25)加10天就是十天后的日期(2018-01-04)。
roll方法则不同,某天(2017-12-25)加10天则不会进位到月,而是将月循环增加(2017-12-04)
Calendar类的容错性:
Calendar类默认提供了比较好的容错性,例如:calendar.set(Calendar.MONTh,13) 月是不存在13的,这会使年加一。
但是在校验严格的情况下不允许这种容错的存在:可以通过Calendar.setLenient(false)方法关掉容错。
set()方法的延迟修改:
set方法修改了某一日历对象的值后,改日历对象不会立即将其代表的时间修改,而是等到下一下调用get,add,等等方法时计算。
package demo; import java.util.Calendar; public class Demo { public void mian(String[] args){ //Calendar类常用方法 Calendar calendar = Calendar.getInstance(); calendar.get(Calendar.YEAR); calendar.get(Calendar.MONTH); calendar.get(Calendar.DAY_OF_MONTH); calendar.add(Calendar.YEAR,1); calendar.roll(Calendar.YEAR,-8); //Calendar类容错性: Calendar calendar1 = Calendar.getInstance(); calendar.set(Calendar.MONTH,12); //不报错:月份超出后进位到年上 calendar.setLenient(false); calendar.set(Calendar.MONTH,12); //报错:关闭容错后不再进位,超出就报错。 } }
格式化器:
NumberFormat抽象类:
描述:
NumberFormat类是Format抽象类的子类,其作用是:实现字符串和数值的互相转换。
构造:
通过工厂方法获取NumbeFormat的实例:(这些构造方法可以指定Local,不同地区格式化结果不同)
NumberFormat.getInstance()
NumberFormat.getIntegerInstance()
NumberFormat.getPercentInstance()
NumberFormat.getCurrencyInstance()
方法:
String format(数字类型) 数字类型 --> 字符串
Number parse(String) 字符串 --> 数字类型
DateFormat抽象类:
描述:
DateFormat类也是Format类的子类,其作用是:实现字符串和日期的互相转换
构造:(重载方法的一般形式:DateFormat getXXXInstance(int style) DateFormat getXXXInstance(int style, Locale locale)
格式style Date格式化 Time格式化
// DateFormat.SHORT 07-12-20 上午12:24
// DateFormat.MEDIUM 2017-12-20 0:24:33
// DateFormat.FULL 2017年-12月-20日 上午12时24分33秒
// DateFormat.LONG 2017年-12月-20日 星期三 上午12时24分33秒 SCT
)
//格式化为日期
DateFormat.getDateInstance();
//格式化为时间
DateFormat.getTimeInstance();
//格式化为日期加时间
DateFormat.getDateTimeInstance();
方法:
String format(Date)
Date parse(String)
SimpleDateFormat类:
描述:SimpleDateFormat类比SimpleDateFormat易于使用。
构造:
在创建SimpleDateFormat时需要传入一个pattern的字段,该字段不是需要格式化的字符串的一个日期模板。
格式化器Demo:
1 package com.vtstar.sct.desktop.clients.FeedingLine21.swingUI; 2 import java.text.DateFormat; 3 import java.text.NumberFormat; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 public class Demo { 8 public static void main(String[] args) throws ParseException { 9 //格式化数字 10 //获取一个普通的数字格式器 11 String numberFormat01 = NumberFormat.getInstance().format(12.345); //12.345 12 //获取一个整数类型的数字格式化器 13 String numberFormat02 = NumberFormat.getIntegerInstance().format(12.345); //12 14 //获取一个百分比格类型的格式化器 15 String numberFormat03 = NumberFormat.getPercentInstance().format(0.345); //34% 16 //获取一个货币类型的格式化器 17 String numberFormat04 = NumberFormat.getCurrencyInstance().format(12.345); //¥12.35 18 19 //格式化为日期 20 String dateShort = DateFormat.getDateInstance(DateFormat.SHORT).format(new Date()); //18-1-10 21 //格式化为时间 22 String dateMedium = DateFormat.getDateInstance(DateFormat.MEDIUM).format(new Date()); //2018-1-10 23 //格式化为日期加时间 24 String dateLong = DateFormat.getDateInstance(DateFormat.LONG).format(new Date()); //2018年-1月-10日 25 //日期时间和时间的格式化器 26 DateFormat.getDateTimeInstance(); 27 DateFormat.getDateTimeInstance(); 28 29 //SimpleDateFormat 30 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); 31 Date date = simpleDateFormat.parse("2018-09-22"); //Sat Sep 22 00:00:00 CST 2018 32 String dateStr = simpleDateFormat.format(new Date()); //2018-01-10 33 } 34 }