基础类库
一、用户相关
1.1 Java程序入口:main()方法
public static void main(String[]args){…}
public修饰符:Java类由JVM调用,为了让JVM可以自由调用main()方法,用public修饰符把这个方法暴露出来。
.
static修饰符:JVM调用这个主方法时,JVM直接通过该类来调用主方法,因此使用static修饰该主方法。
.
void返回值:因为主方法被JVM调用,该方法的返回值将返回给JVM,这没有任何意义,因此main()方法没有返回值。
1.2 Scanner
Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可以接收件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。
Scanner主要提供了两个方法来扫描输入
hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()。
nextXxx():获取下一个输入项。在默认情况下,Scanner使用空白(包括空格、Tab空白、回车)作为多个输入项之间的分隔符。
二、系统相关
2.1 System类
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类变量和类方法,允许直接通过System类来调用这些类变量和类方法。
public class SystemTest {
public static void main(String[] args) throws IOException {
//获取系统所有环境变量
Map<String,String> env = System.getenv();
for (String name: env.keySet()){
System.out.println(name+"-->"+env.get(name));
}
//获取系统指定环境变量的值
System.out.println("获取系统指定环境变量的值:"+System.getenv("JAVA_HOME"));//获取系统指定环境变量的值:D:\Java\jdk1.8.0_202
//获取所有系统属性,并将属性保存到props.txt中
Properties props = System.getProperties();
props.store(new FileOutputStream("props.txt")," System Properties");
System.out.println("输出特定系统属性:"+System.getProperty("os.name")); //输出特定系统属性:Windows 10
}
}
2.2 Runtime类
Runtime类代表Java程序的运行时环境,每个Java程序都有一个与之对应的Runtime实例,应用程序通过该对象与其运行时环境相连。应用程序不能创建自己的Runtime实例,但可以通过getRuntime()方法获取与之关联的Runtime对象。
与System类似的是,Runtime类也提供了gc()方法和runFinalization()方法来通知系统进行垃圾回收、清理系统资源,并提供了load(String filename)和loadLibrary(String libname)方法来加载文件和动态链接库。
public class RuntimeTest {
public static void main(String[] args) throws IOException {
//获取Java程序关联的运行时对象
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量:"+rt.availableProcessors());
System.out.println("空闲内存量:"+rt.freeMemory());
System.out.println("总内存量:"+rt.totalMemory());
System.out.println("最大内存:"+rt.maxMemory());
//直接单独启动一个进程来运行操作系统的命令
rt.exec("postman.exe");
}
}
三、常用类
3.1 Object类
Object类是所有类、数组、枚举类的父类,也就是说,Java允许把任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类。
“自我克隆”就是得到一个当前对象的副本,而且二者之间完全隔离。由于Object类提供的clone()方法使用了protected修饰,因此该方法只能被子类重写或调用。
class Address{
String detail;
public Address(String detail){
this.detail = detail;
}
}
//实现Cloneable接口
public class User implements Cloneable{
int age;
Address address;
public User(int age){
this.age = age;
address = new Address("江苏苏州");
}
// 调用super.clone()实现clone()方法
public User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
}
public class CloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User(29);
User u2 = u1.clone();
//判断u1、u2是否相同
System.out.println(u1 == u2); //false
//判断u1、u2中address是否相同
System.out.println(u1.address == u2.address); //true
}
}
Object类提供的Clone机制只对对象里各实例变量进行“简单复制”,如果实例变量的类型是引用类型,Object的Clone机制也只是简单地复制这个引用变量,这样原有对象的引用类型的实例变量与克隆对象
的引用类型的实例变量依然指向内存中的同一个实例
3.2 String、StringBuffer和StringBuilder类
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
StringBuilder类是JDKl.5新增的类,它也代表可变字符串对象。实际上,StringBuilder和StringBuffer
基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder
则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对
象,则应该优先考虑使用StringBuilder类。
public class StringTest {
public static void main(String[] args) {
String a = new String("www.baidu.com");
String b = new String("www.google.com");
String c = new String("www.firefox.com");
System.out.println("a.charAt(5):"+a.charAt(5)); //a 从0-len-1
System.out.println(a.compareTo(b)); //-5 返回第一个不相等差 bcdefg b-g的差 -5
System.out.println(a.compareTo(c)); //-4
System.out.println(a.endsWith(b)); //false a和b是否结尾相同
System.out.println(a.indexOf('c')); //10 a字符串中第一次出现c的位置
System.out.println(a.indexOf('c',11)); //-1 从下标11开始找c出现的位置
System.out.println(a.indexOf(b)); //-1 找b第一次在a出现的位置
System.out.println(a.startsWith(b)); //false 该对象是否以b开始
System.out.println(a.toUpperCase()); //转换为大写
}
}
3.3 Math类
public class MathTest {
public static void main(String[] args) {
System.out.println("平方根:"+Math.sqrt(2.3));
System.out.println("立方根:"+Math.cbrt(3));
System.out.println("e的n次幂:"+Math.exp(2));
System.out.println("乘方:"+Math.pow(3,2));
System.out.println("自然对数:"+Math.log(12));
System.out.println("10d自然对数:"+Math.log10(12));
System.out.println("绝对值:"+Math.abs(-4.5));
System.out.println("最大值:"+Math.max(2,3));
System.out.println("最小值:"+Math.min(2,3));
System.out.println("余弦:"+Math.cos(1.2));
System.out.println("正弦:"+Math.sin(0.8));
System.out.println("正切:"+Math.tan(2.3));
}
}
3.4 Random类
Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。
public class RandomTest {
public static void main(String[] args) {
Random r = new Random(50);
byte[] b = new byte[10];
r.nextBytes(b);
System.out.println(r.nextBoolean()); //true
System.out.println(Arrays.toString(b)); //[9, -52, 44, -46, 105, -120, -56, 49, -62, -102]
System.out.println(r.nextDouble()); //0.9731544041723736
System.out.println(r.nextInt()); //2029541121
System.out.println(r.nextLong()); //-6261620488680096175
}
}
四、正则表达式
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。
一旦在程序中定义了正则表达式,就可以使用Pattern和Matcher来使用正则表达式。
Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。