7.1 运行Java程序参数
Main方法中args[ ] 数组通过运行的时候传入指定的值
例如:
运行Test类,在后面加上字符串:
java Test abc2 354
那么字符串数组 args[0] = abc2; args[1] =354;
Ps:该处参数包含空格的话,需要用” ”括起来,否则JVM会把空格当成参数分隔符。
7.2 使用Scanner获取键盘输入
- Scanner 提供的两个扫面输入方法
[1] hasNextXxx(); 是否还有下一个输入项,其中Xxx可以是Int 、Long等代表基本类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext();
[2] nextXxx(); 获取下一个输入项。
next(); //遇到”\n””\t””\b”结束录入
nextLine(); //遇到”\n”结束录入
例子:
public static void main(String[] args){
Scanner sc = new Scanner( System.in );
sc.useDelimiter(",");
//将录入的字符串方到sc中,而回值是boolean型
//boolean s = sc.hasNext();
while( sc.hasNext() ){
//输出返回值
System.out.println("还有下一个:" );
//输出录入的字符串
System.out.println("键盘输入的内容是:" + sc.next() );
}
}
- Scanner读取文件输入
class Txt{
public static void main( String[] args ) throws Exception{
//将一个File文件对象作为Scanner的构造器参数,Scanner读取文件内容
Scanner sc = new Scanner(new File("ScannerFileTest.java"));
//判断输入源中是否还有下一行
while(sc.hasNextLine()){
//输出文件中的下一行
System.out.println(sc.nextLine());
}
}
}
7.3 System类
- System.getenv( );
- System.currentTimeMillis( ); //当前日期离1970-1-1的毫秒数
- System.in( ); //输入
- System.out( ); //输出
- System.err( ); //错误输出(红色)
(6)特殊输出方法:
System.out.printf( “第%d次是:%s”, ++time, str );
-----> %d ----- ++time
-----> %s ----- str
7.4 Runtime类
Runtime r = Runtime .getRuntime();
//查看本机可用CPU
r.availableProcessors();
//空闲内存
r.freeMemory();
//总内存
r.totallMemory();
//最大内存
r.MaxMemory();
//打开画图工具
r.exec(“mspaint”);
7.5 Object类
7.5.1 clone();
对象克隆( 拷贝一个对象副本,给另一个地方使用,克隆分深浅两种 )。保护方法,实现对象的浅复制。只有实现Cloneable接口才可用调用该方法,否则抛出CloneNotSupportedException异常。
7.5.2 equals(Object obj);
指示其他某个对象是否与此对象“相等”(比较一级引用内容)。
7.5.3 finalize();
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
7.5.4 getClass();
返回此 Object 的运行时类。
7.5.5 hashCode();
返回该对象的哈希码值。
7.5.6 toString();
返回该对象的字符串表示。
7.5.7 notify();
唤醒在此对象监视器上等待的单个线程。
notifyAll();
唤醒在此对象监视器上等待的所有线程。
7.5.8 wait();
wait(long timeout); //设置时间间隔
调用该方法后当前线程睡眠,直到以下事件发生:
- 其他线程调用了该线程的notify() 或notifyAll()方法
- 其他线程调用了该线程的interrupt该线程
- 时间间隔到了
7.6 String、StringBuffer、StringBuilder类
7.6.1 String类
(1)String是一个类,是一个引用类型,常用的字符串类型有3个
String 定义的字符串,不能做插入、修改等动作
StringBuffer 定义的字符串,能做插入、修改等动作,线程安全,效率较低
StringBuilder 定义的字符串,能做插入、修改等动作,线程不安全,效率较高
(2)String的定义方法
①String s1=“我是第一种定义方法”;
②String s2=new String(“我是第二种定义方法”);
③String s3=new String();
s3=“我是第三种定义方法”;
④StringBuffer s4=new StringBuffer();
(3)常用的String类方法
字符串.length(); //获取字符串的长度,返回int
字符串1.equals(字符串2); //返回boolean型值
字符串1.compareTo(字符串2); //相同则返回0,不相同时,从两个字符 //串第0个字符开始比较,返回第一个不相等的字符差(字符串1中字符-字符//串2中字符差);如果长字符串前面部分跟短字符串相同,则返回它们长度的差值。
字符串.toLowerCase(); //将字符串的字母全部改为小写
字符串.toUpperCase(); //将字符串的字母全部改为大写
字符串1.concat(字符串2).concat(字符串3); //字符串拼接,返回String。和s1+s2+s3效果一样
字符串.indexOf(字符/字符串); //获取字符/字符串对应字符第一次出现的下标
字符串.indexOf(字符/字符串,start); //获取字符/字符串从start开始第一次 //出现的位置,找到返回索引,否则返回-1
字符串.lastIndexOf(字符/字符串); //获取字符串对应字符最后出现的下标
字符串.charAt(int下标); //通过下标找字符串里对应字符,返回char
字符串.split(“拆分字符”); //得到若干字符串,用数组承接。拆分字符不保留
str.split(“拆分符”,int 个数n); //将字符串str按照拆分符拆分成n个, //返回字符串数组
字符串1=字符串2.substring(开始下标); //将字符串2从指定下标开始,赋值给字符串1
字符串1=字符串2.substring(开始下标,结束下标); //将字符串2从指定下标开始到结束下标,赋值给字符串1
str.replace(str1, str2) ; //将字符串str中的字符/字符串str1替换成str2
- 替换字符串指定下标的一个字符:
//调用该方法,传入要参数(替换字符串,替换位置(下标),换成的"字符/字符串")
public String replaceChar(String oldStr, int replaceIndex, String ch){
//输出替换前字符串
System.out.println("替换前字符串:" + oldStr);
//获取输入下标的字符
String str = oldStr.valueOf(oldStr.charAt( replaceIndex ));
//替换oldStr中的第一个str为ch
String newStr = oldStr.replaceFirst( str, ch );
//返回替换后的字符串
return newStr;
}
- 根据编码生成字符串
String(byte[] bytes, int offset, int length, String charsetName)
通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。
7.6.2 StringBuffer
(1)StringBuffer的使用
StringBuffer sb=new StringBuffer(); //初始化为16个字符长度
[1]追加:
sb.append(“abcdef”);
sb.append(“GHI”); //缓冲字符串可以append追加字符串
sb.append( 6600 ); //append也可以追加其他基本类型(详细见API)
sb.append(“iacqafw”, offset,len); //从“iacqafw”的第offset个位置开始,到“iacqafw”的第len个位置的字符都追加到缓冲区字符串的后面
[2]插入:
sb.insert( start, “Jeff” ); //从缓冲区字符串的第start个位置开始,插入Jeff
[3]删除:
sb.delete( start, end ); //删除指定范围的字符串,从start删到end位置
[4]替换:
sb.replace(0, 2, “yan”); //将缓冲区字符串从0到2替换成yan
[5]setLength()改变字符串大小,删除末尾字符串:
sb.setLength( 2 ); //删除缓冲区字符串末尾2个字符
[6]字符串倒置:
sb.reverse(); //将缓冲区内容倒置
[7]清除所有字符串
sb.clear(); //将缓冲区字符串都清除
[8]转为String:
String s=sb.toString(); //再使用.toString()转化为String
7.6.3 String、StringBuffer、StringBuilder区别
(1)区别于StringBuilder
StringBuffer :JDK 1.0后有的
StringBuilder :JDK 1.5后有的 , 为了提高效率而设计的
StringBuffer 是一个古老的String处理类,它适合应用在多线程的操作环境中,主要是为了线程同步访问时线程安全而设计的,里面加入相关的同步控制语句
StringBuilder 是后期产生的,主要是应用在单线程的操作环境
如果代码不太涉及到多线程操作,你应该选用StringBuilder ,因其不需要进行线程同步操作,所以性能好;但如果为了实现线程安全,我们需要牺牲一定的性能
(2)三者性能比较:
String 性能最差
StringBuffer 性能与StringBuilder相差较少
StringBuilder 性能最好
7.6.3 toString方法
输出时,如果不是String类型,会默认增加.toString()
①在java中,所有对象都有toString()这个方法。
②创建类时,新的类里什么都没的情况下,又没有重写toString方法输出对象时会 输出对象的哈希码值(内存地址)
③他通常只是为了方便输出,比如:System.out.println(xx);括号里面的”xx”如 果不是String类型的话,就自动调用xx的toString()方法。
④它只是sum公司开发java的时候为了方便所有类的字符串操作而特意加入的方法
如:int age=new int();
System.out.println(name); //这时age已经代表了age.toString()
如:自定义的类,我们也重写了toString()方法,那么,我们输出的时候,就会 默认调用我们定义的.toString()输出
7.6.4 Math类
- 使用:
Math类构造器被定义为private的,无法创建Math对象。但Math类的方法都是类方法;还提供了两个类变量:PI ( π )、E ( e ) 。这些类方法、类变量都可以直接通过类名调用。
(2)常用Math类的类方法:
[三角运算]
Math.toDegrees( 弧度角 ); //弧度转为角度
Math.toRadians( 角度角 ); //角度转为弧度
Math.sin( 弧度角 ); //返回该弧度角对应的正弦
Math.asin( 弧度角 ); //返回该弧度角对应的反正弦
[取整运算]
Math.floor( -1.2 ); //返回小于参数的最大整数
Math.ceil( 1.2 ); //返回大于参数的最小整数
Math.round( 4.235 ); //返回参数的四舍五入值
[乘方、开方、指数运算]
Math.sqrt( 3.2 ); //返回参数的平方根
Math.cbrt( 9.0 ); //返回参数的立方根
Math.hypot( 3.2 ,9.0 ); //返回两参数的平方和再开方
Math.pow( 3 , 2 ); //返回3的2次方
Math.log( 12 ); //返回参数12的自然对数
Math.log10( 9 ); //返回参数9,底数为10的自然对数
[符号相关运算]
Math.abs( -1.2 ); //返回参数的绝对值
Math.signum( 5 ); //参数=0返回0,参数>0,返回1.0,参数<0,返回-1.0
[大小相关运算]
Math.max( 2.3, 4.5 ); //返回两参数中的最大值
Math.min( 2.3, 4.5 ); //返回两参数中的最小值
Math.random( ); //返回一个伪随机数,0.0<值<1.0
7.6.5 ThreadLocalRandom与Random类
(1) Random类
[1]定义:Random 专门用于生成伪随机数,通过new获取对象,之后调用各种nextXxx( )方法来获取随机数。
[2]构造器:① Random rand = new Random ( ); //默认以当前时间作为种子
② Random rand = new Random ( long整型 ); //以long参数为种子
[3]只要两个Random对象的种子相同( 默认的种子时,它们属于同一种子 ),而且方法的调用顺序也相同,它们会产生相同的数组序列,因此Random生成的不是真正的随机数列,而是一种伪随机。
[4]通常推荐使用当前时间作为Random对象的种子,如:
Random rand = new Random ( System.currentTimeMillis( ) );
(2) ThreadLocalRandom类
[1]定义:与Random 相似,但其需要通过静态的current( )方法来获取ThreadLocalRandom对象,之后调用各种nextXxx( )方法来获取随机数。
[2]区别于Random :使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。
[3]在多线程环境下用法:
ThreadLocalRandom rand = ThreadLocalRandom.current();
//生成一个4~10之间的伪随机整数
int val1 = rand.nextInt(4, 20);
//生成一个4.0~10.0之间的伪随机浮点数
double val2 = rand.nextDouble(4.0, 20.0 ;
7.6.6 BigDecimal类
- 用处:
Float、double两种基本浮点类型在运算时,容易发生精度丢失。因此需要用到BigDecimal类来处理浮点数的运算问题。
- 构造器:
//传入字符串
BigDecimal f1 = new BigDecimal(“0.05”);
// 通过valueOf (double )方法
BigDecimal f2 = BigDecimal.valueOf(0.01);
//传入double
BigDecimal f3 = new BigDecimal(0.05);
Ps:通常建议优先使用 传入String 或者通过valueOf (double )方法 创建实例
- 常用方法:
add( ) //加f1.add( f2 ) ----> 0.06 f3.add( f2 ) ----> 0.06056...
subtract( ) //减 f1.subtract( f2 ) ----> 0.04 f3.subtract( f2 ) ----> 0.0402...
multiply( ) //乘 f1.multiply( f2 ) ----> 0.0005 f3.multiply( f2 ) ---->0.000502...
divide( ) //除f1.divide( f2 ) ----> 0.5 f3.divide( f2 ) ---->0.500000000132...
pow( ) //乘方
- 如果程序要求传入double 浮点数运算,那么我们可自定义
public static double add(double d1, double d2){
BigDecimal b1 = BigDecimal.valueOf (d1);
BigDecimal b2 = BigDecimal.valueOf (d2);
return b1.add(b2).doubleValue() ;
}
7.7 正则表达式
String str = new String(“abc”);
//matches --->equals(“ab”);
Str.matches(“ab”);