与运行环境交互(上)
提纲
- Java程序的参数
- 获取键盘的输入
- System类与Runtime类
- 使用字符串
- Math、Random、BigDecimal、Date等工具类的用法
- 正则表达式
- 国际化支持
Java程序的参数
- 如果运行Java程序时在类名后紧跟一个或多个字符串(多个字符串之间以空格隔开),JVM就会把这些字符串依次赋给args元素。
- 如果某参数本身也包含了空格,则应该将该参数用双引号 “ 括起来,否则JVM会把这个空格当成参数分隔符,而不是当成参数本身
使用Scaaner获取键盘的输入
-
使用Scanner类可以很方便的获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可接收文件、输入流、字符串等作为数据源,用于从文件、输入流、字符串中解析数据
-
Scanner主要提供了两个方法来扫描输入:
—hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果需要判断是否包含下一个字符串,则可以省略Xxx
—nextXxx():获取下一个输入项。Xxx的含义与前一个方法中Xxx相同
使用BufferedReader读取键盘
- BufferedReader是Java IO流中的一个字符、包装流,它必须建立在另一个字符流的基础之上。但标准收入:System.in是字节流,程序需要使用转换流InputStreamReader将其包装字符流
- 使用BufferedReader可以逐行读取用户的键盘输入,每次用户的键盘输入都被BufferedReader当成String对象,与Scaaner不同的是,BufferedReader不能读取基本类型输入项,它总是读取String对象
System类
- System类代表当前Java程序的运行平台,程序不能创建System类的对象,所以它提供了一些属性和类方法,允许直接通过System类名来调用这些属性和方法
- System类提供了代表标准的输入、标准的输出和错误输出的类属性;并提供了一些静态方法用于访问环境变量、系统属性的方法;还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作的环境变量和系统属性
Runtime类与ProcessHandle
- Runtime类代表Java程序的运行时的环境,每个程序员都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时的环境相连。
- 应用程序不能创建自己的Runtiem实例,但是可以通过getRuntime()方法获取与之相关两的Runtime对象
- Runtime类代表Java程序的运行时的环境,可以访问JVM的相关信息,如处理器数量,内存信息等。
- 除此之外,Runtime还有一个功能:它可以直接单独启动一条进程来运行操作系统的命令。运行后得到一个Process对象
- Java9 新增了ProcessHandle的接口,通过该接口可以获取进程的ID、父进程和后代进程;通过该接口的onEit()方法可以在进程结束时完成某些行为
Object类
- Object类是所有类、数组、枚举类的父亲,也就是说,Java允许把所有任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类
对象的克隆
- Object还提供了一个protected修饰的clone()方法,程序员可重写该方法来实现“浅克隆”
- 自定义类实现“浅克隆”的步骤:
- 自定义类实现Cloneable接口
- 自定义类实现clone()方法
- 在clone()方法中通过super.clone()调用Object的clone()方法来实现“浅克隆”
Java 7新增的Objects类
- Objects提供了一些工具方法来操纵对象
- 比如:
- —hashCode():返回指定对象的hashCode值
- —toString:返回指定对象的“描述性”字符串
- —requiredNonNull:检查对象是否是null
String、StringBuffer和StringBuilder
- 字符串就是一连串的字符串序列,Java提供了String和StringBuffer两个类来封装对字符串,并提供了系列方法来操作字符串对象
- String类是不可变类的
- StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append、insert,reverse、setCharAt、setLength等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString方法将其转换为一个String对象
- JDK 1.5又新增了一个StringBuilder类,它也代表了字符串对象。StringBuilder是线程不安全的
无数不在的字符串
-
使用String对象存储字符串
-
String s=“有志者事竟成”;
-
String s=new String(“有志者事竟成”);
-
String类位于java.lang包中,具有丰富的方法
—计算字符串的长度
—连接字符串
—比较字符串
—提取字符串
字符串比较
-
equals()方法原理
:Object里边的equals方法是 比较两个对象的内存地址 是否是一致的,如果一致,即意味着这两个对象在内存中其实是一个对象,则返回true,否则返回false;
-
输入的“java"和”java"代表同一课程,如何解决?
-
使用equalsIgoreCase()方法
-
结合toUpperCase()或toLowerCase()
字符串比较
使用equalsIgnoreCase()方法解决
if(favCourse1.equalslgnoreCase(favCourse2))
{
System.out.println("最喜欢的课程相同");
}else{
System.out.println("最喜欢的课程不相同");
}
结合toUpperCase()方法
if(favCourse1.toUpperCase().equals(favCourse2.toUpperCase))
{
System.out.println("最喜欢的课程相同");
}else{
System.out.printlb("最喜欢的课程不同");
}
字符串连接2-2
- 方法1:使用“+”
- 方法:使用String类的concat()方法
String s=new String("你好,");
String name=new String("张三!");
String sentence=s.concat(name);
//A.concat(B): B字符串将被连接到A字符串后面
System.out.println(sentence);
字符串提取方法
-
常用的提取方法举例
-
public int indexOf(int ch)
-
public int indexOf(String value)
说明:搜索第一个出现的字符串ch(或者字符串value) -
public int lastIndexOf(int ch)
-
public intlastIndexOf(String value)
说明:搜索最后一个出现的字符ch(或字符串value)
方法 | 说明 |
---|---|
public String substring(int index) | 提取从位置索引开始的字符串部分 |
public String substring(int beginindex,int endindex) | 提取beginindex和endindex之间的字符串部分 |
public String trim() | 放回一个前后不含任何空格的调用字符串的副本 |
- beginindex:字符串的位置从0开始算;
- endindex:字符串的位置从1开始算;
StringBuffer
- StringBuffer:String增强版
- StringBuffer声明
stringBuffer sb=new StringBuffer();
StringBuffer sb-new StringBuffer("aaa");
- StringBuffer的使用
sb.toString(); //转化为String类型
sb.append("*");//追加字符串
StringBuffer的用武之地
- 从控制台接受课程信息,不断累加知道输入‘#’键结束,并输出全部课程信息
//声明课程信息字符串
StringBuffer course=new StringBuffer();
System.out.println("请输入课程信息");
Scanner sc=new Scanner(System.in);
//循环从键盘接受字符串
String input;
while(!(input=sc.next()).equals("#"))
{
course.append(input);
course.append("\n");
}
System.out.println("课程信息是:"+course)