7.1 与用户互动
7.1.1 运行Java程序的参数
7.1.2 使用Scanner获取键盘输入
//1. Scanner:扫描仪。System.in代表标准输入,也就是键盘输入
//2. useDelimiter:设置分隔符,默认使用空格
//3. hasNext:判断是否有数据进来,无数据时阻塞
//4. next:返回进来的数据
Scanner sc = new Scanner(System.in);
//使用回车(\n)作为分隔符:输入"aaa bbb ccc ddd"后回车,由于该字符串之间没有回车符,所以next()方法返回整个字符串
//使用空格做份分隔符:输入"aaa bbb ccc ddd"后回车,第一次next获取aaa,第二次获取bbb,依此类推
sc.useDelimiter("\n");
while(sc.hasNext()){
System.out.println(sc.next());
}
//扫描文本中的内容
Scanner sc = new Scanner(new File("C:\\Users\\ThinkPad\\Desktop\\java复习.txt"));
//是否有一行进来
while(sc.hasNextLine()){
//读取整行,可以理解为使用回车作为分隔符
System.out.println(sc.nextLine());
}
7.2 系统相关
7.2.1 System类
7.2.2 Runtime类
- 直接单独启动一个进程来运行操作系统命令
Runtime rt = Runtime.getRuntime();
rt.exec("notepad.exe");
7.3 常用类
7.3.1 Object类
- 方法
//Obejct的equals与==功能一样,判断对象地址是否相同
boolean equals(Object obj)
//当系统没有引用变量指向该引用时,垃圾回收器调用该方法清理该对象所占用资源
protected void finalize()
//返回该对象的运行时类
Class<?> getClass()
//返回该对象hashCode值,该值是使用对象的地址来计算的
int hashCode()
//运行时类名@十六进制hashCode值
String toString()
- 自定义类实现克隆
package com;
class Address {
String detail;
public Address(String detail){
this.detail=detail;
}
}
//1.必须实现Cloneable接口,正常对象虽然都继承Object类,也拥有clone()方法,但是如果不实现该接口,执行报java.lang.CloneNotSupportedException
class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("广州天河");
}
//2.重写Object的clone()方法
@Override
public User clone(){
try {
//3.调用Object类的clone方法
return (User)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}
public class CloneTest{
public static void main(String[] args) {
User u1 = new User(29);
User u2 = u1.clone();
//clone方法相当于在栈中复制了一个引用,在堆中新建了一个对象,但新建的对象的成员变量所指向的引用不会新建,所以下面语句执行结果分别为false和true
System.out.println(u1==u2);
System.out.println(u1.address==u2.address);
}
}
7.3.2 java7新增Objects类
7.3.3 String、StringBuffer和StringBuilder类
String为不可变类:可以参照之前的不可变类的条件
StringBuffer、StringBuilder可变,且StringBuilder线程不安全,但效率高
- String构造方法
Stirng()
String(byte[] bytes,String charsetName)
//根据指定字符集,将bytes解码成新String对象
String(byte[] bytes,Charset charset)
//使用平台默认字符集将bytes数组从offset索引开始,长度为length的子数组解码成新String对象
String(byte[] bytes,int offset,int length)
String(byte[] bytes,int offset,int length,String chasetName)
//offset为起始索引,count为截取长度
String(char[] value,int offset,int count)
//根据字符串直接量创建一个新String对象
String(String original)
String(StringBuffer buffer)
String(StringBuilder builder)
- String方法
//获取索引为index的元素
char charAt(int index)
//两字符串的字符序列相等返回0,不相等时,从两个字符串0索引处开始比较,返回第一个不相等的字符的差,如果较长字符串前面部分恰好等同于较短字符串,返回长度差,所谓差都是前面-后面
int compareTo(String anotherString)
//连接字符串,与+功能相同
String concat(String str)
//将字符数组连接成String对象,与构造方法String(char[] content)功能相同
static String copyValueOf(char[] data)
static String copyValueOf(char[] data,int offset,int count)
//该String对象以suffix结尾返回true
boolean endsWith(String suffix)
//该String对象以prefix开始返回true
boolean startWith(String prefix)
//String对象从toffset索引出算起,是否以prefix开始
boolean startWith(String prefix,int toffset)
//如果String对象与anObject字符序列相等,返回true
boolean equals(Object anObject)
//与上同,忽略字符大小写
boolean equalsIgnoreCase(String str)
//String对象与sb的字符序列相同返回true。注意有这个方法是因为,String直接equals同样的StringBuffer对象时,会返回false
boolean contentEquals(StringBuffer sb)
//将String对象转为byte数组
byte[] getBytes()
//将String对象转为char数组
char[] toCharArray()
//复制String对象从srcBegin索引到srcEnd索引(不包含)的所有元素到dst数组中,其中dst起始位置为dstBegin索引处
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin)
//返回Unicode值为ch的字符在字符串中第一次出现的索引
int indexOf(int ch)
//从fromIndex开始,第一次出现的索引
int indexOf(int ch,int fromIndex)
int indexOf(String str)
int indexOf(String str,int fromIndex)
//返回最后一次出现的索引
int lastIndexOf(int ch)
//"asd".lastIndexOf("d")值为2
int lastIndexOf(int ch,int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String str,int fromIndex)
int length()
//字符串中所有oldChar替换为newChar
String replace(char oldChar,char newChar)
//获取从beginIndex索引开始到结束的子字符串
String subString(int beginIndex)
//不包含endIndex
String subString(int beginIndex,int endIndex)
//转为小写
String toLowerCase()
//转为大写
String toUpperCase()
//将基本类型值转为String对象,一般可以直接用+“”。valueOf与toString不同点在于它可以接收null,打印时会打印null,而不会报空指针
static String valueOf(X x)
- StringBuilder与StringBuffer示例
package com;
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
//追加字符串
sb.append("java");//sb = "java"
//插入
sb.insert(0, "Hello ");//sb = "Hello java"
//使用逗号,替换第5位到第6位(不包括)的字符串
sb.replace(5, 6, ",");//sb = "Hello,java"
//删除
sb.delete(5, 6);//sb = "Hellojava"
System.out.println(sb);
//反转
sb.reverse();//sb = "avajolleH"
//值为9
System.out.println(sb.length());
//初始16,new StringBuilder("123")时,该值就变为16+3=19,即对于StringBuilder对象capacity可能比length大
System.out.println(sb.capacity());
//改变长度
sb.setLength(5);//sb = "avajo"
System.out.println(sb);
}
}
7.3.4 Math类
Math为工具类,提供的方法全是静态方法,同时提供了两个类变量PI和E
7.3.5 java7的ThreadLocalRandom与Random
7.3.6 BigDecimal类
- float与double的计算容易引起精度丢失
- 创建BigDecimal对象时,如果使用构造器BigDecimal(double val)还是会引起精度丢失,一般使用构造器BigDecimal(String val)或静态方法BigDecimal.valueOf(double value)
- BigDecimal方法
//相加
BigDecimal add(BigDecimal augend)
//相减
BigDecimal subtract(BigDecimal subtrahend)
//相乘
BigDecimal multiply(BigDecimal multiplicand)
//相除
BigDecimal divide(BigDecimal divisor)
double doubleValue():BigDecimal转double
//1.ROUND_DOWN:直接去掉舍弃位。例:2.225667->2.22
//2.ROUND_UP:直接对舍弃位进位。例:2.224667->2.23
//3.ROUND_HALF_UP:舍弃部分>=5,进位。例:2.225->2.23,即传统的四舍五入
//4.ROUND_HALF_DOWN:舍弃部分总体>5,进位。例:2.2251->2.23,因为5.1>5
//设定BigDecimal对象的小数位数(newScale)和进位方式(roundingMode)
BigDecimal setScale(int newScale,int roundingMode)
7.4 Java8的日期、时间类
Date类设计不科学,大部分构造器与方法已经过时,Calendar类过于负责,Java8之前处理日期与时间通常使用Joda-Time库
7.4.1 Date类
7.4.2 Calendar类
7.4.3 Java8新增的日期、时间包
7.4.4 Joda-Time类库
7.5 正则表达式
7.6 国际化与格式化
7.6.4 MessageFormat
将消息字符串,按一定的方式转为字符串
String a = new String("Hello {0}!Today is {1}");
//Hello wsh!Today is 星期三
System.out.println(MessageFormat.format(a, "wsh","星期三"));
7.6.6 NumberFormat
用于将数字按要求的格式转为字符串
//返回中国的数值格式器
NumberFormat nm1 = NumberFormat.getNumberInstance(Locale.CHINA);
//返回中国的百分数格式器
NumberFormat nm2 = NumberFormat.getPercentInstance(Locale.CHINA);
//返回中国的货币格式器
NumberFormat nm3 = NumberFormat.getCurrencyInstance(Locale.CHINA);
NumberFormat nm4 = NumberFormat.getNumberInstance();
NumberFormat nm5 = NumberFormat.getPercentInstance();
NumberFormat nm6 = NumberFormat.getCurrencyInstance();
//56
System.out.println(nm1.format(56));
//5,600%
System.out.println(nm2.format(56));
//¥56.00
System.out.println(nm3.format(56));
System.out.println(nm4.format(56));
System.out.println(nm5.format(56));
System.out.println(nm6.format(56));
7.6.8 SimpleDateFormat
将日期按要求的格式转为字符串
将字符串以特定的格式转为日期
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatTest {
public static void main(String[] args) throws ParseException {
Date d = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日"); //Date转String,使用format
String dateStr = sdf1.format(d);
System.out.println(dateStr);
String str = "14###三月##21";
SimpleDateFormat sdf2 = new SimpleDateFormat("y###MMM##d");
//String转Date使用parse
Date d1 = sdf2.parse(str);
System.out.println(d1);
}
}