Java基础之常用类

Object类

  • 类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。

常用方法

getClass()

//Class<?> getClass() 返回此 Object 的运行时类。
public final native Class<?> getClass();

haseCode()

// int hashCode() 返回该对象的哈希码值。
public native int hashCode();

toString()

默认返回"对象所属的类名+@+对象的哈希值(十六进制)

//String toString() 返回该对象的字符串表示。
public String toString() {
    return getClass().getName() + "@" + Integer.toHexStrin(hashCode());
}
  • 复写示例:
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}

equals()

// boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
public boolean equals(Object obj) {
  return (this == obj);
}

equals() 方法与 “==” 区别

  • 共同点: 均用来做比较,返回类型均为boolean类型

  • 区别:

    1. “==“为基本运算符,即可比较基本类型数据(值比较),也可比较引用数据类型(地址比较);
    2. “equals()“只能比较引用数据类型(地址值),底层依赖”==“运算符,一般将其复写来比较对象中的属性值.
  • 复写示例:

public boolean equals(Object obj) {
if(!(obj instanceof Student))
	throw new ClassCastException("类型错误");

Student s = (Student)obj;
return this.name.equals(s.name) && this.age == s.age;
}

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,**该协定声明相等对象必须具有相等的哈希码。

String类

构造方法:重载形式

  • String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
  • String(char[] value) 分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
  • String(char[] value, int offset, int count) 分配一个新的String,它包含取自字符数组参数一个子数组的字符。

常用方法:

获取:

  • 长度:

    • int length() 返回此字符串的长度。
  • 根据位置获取位置上某个字符

    • char charAt(int index) 根据位置获取字符。
  • 根据字符获取该字符在字符串中的位置

    • int indexOf(int ch): 返回ch在字符串中第一次出现的位置

      ch * 一个字符(Unicode 代码点)。

    • int indexOf(int ch,int fromIndex): 从fromIndex指定位置开始,获取ch在字符串中出现的位置
    • int indexOf(String str): 返回str在字符串中第一次出现的位置
    • int indexOf(String str,int fromIndex): 从fromIndex指定位置开始,获取str在字符串中出现的位置
    • int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
  • 子串:

    • String substring(begin)
    • String substring(begin,end)

判断:

  • 包含:
    • boolean contains(str)

      特殊之处:int indexOf(String str):返回str在字符串中第一次出现的位置,如果返回*1,表示该str不在字符串中存在;所以,也可以用于对指定判断是否包含。if(str.indexOf("aa")!=*1)而且该方法既可以又可以获取出现的位置。

    • 开头:boolean startsWith(str)

    • 结尾:boolean endsWith(str) str.endsWith(".java")

    • 是否有内容:

      • boolean ifEmpty(): 原理就是判断长度是否为0
    • 内容是否相同:

      • boolean equals(Object anObject) 将此字符串与指定的对象比较。
      • boolean equalsIgnoreCase() 判断内容是否相同,并忽略大小写
      String s1 = "abc";//字符串常量池中创建对象
      String s2 = "abc";//s2直接指向已存在的对象
      String s3 = new String("abc");//堆内存中创建对象
      System.out.println("s1==s2");//true
      System.out.println("s1==s3");//false
      System.out.println(s1.equals(s2));//true(复写了Object方法,用于比较字符串内容)
      
    • 自然顺序比较:实现了Comparable接口

      • int compareTo(String): 相等返回0;调用>参,返回正;调用<参,返回负

转换:

  • 将字符串转换成大写或者小写。
    • String toUpperCase();
    • String toLowerCase();
  • 字符串两端的多个空格去除
    • String trim()
  • 字符数组–>字符串
    • String(char[])

    • String(char[],ofset,count):将字符数组中的一部分转换成字符串。

      String( )初始化一个新创建的 String 对象,使其表示一个空字符序列。String s = new String();//等效与String s ="";

    • static String copyValueOf(char[]data): 返回指定数组中表示该字符序列的 String

    • static String copyValueOf(char[]data,int offset,int count);

    • static String valueOf(char[])

  • 字符串**>字符数组
    • byte[] toCharArray()
  • 字节数组**>字符串
    • String(byte[])
    • String(byte[],ofset,count):将字节数组中的一部分转换成字符串。
  • 字符串**>字节数组
    • char[] getBytes(): 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
  • 基本数据类型–>字符串
    • static String ValueOf(int) 3+"";//String.valueOf(3);
    • static String ValueOf(double)

替换:

  • String replace(oldchar,newchar) 若没有找到,则返回原字符串

连接

  • String contact(String str)

切割

  • String[] split(regex)

    concat效果与”+“连接符效果一致,但是效果更高一些

其他

  • String intern() 返回字符串对象的规范化表示形式。
String s1 = "abc";
String s2 = new String("abc");
String s3 = s1.intern(); //true
String s4 = s2.intern(); //false

StringBuffer和StringBuilder类

StringBuffer

  • 字符串缓冲区,用于存储数据的容器,字符串缓冲区初始容量为16个字符,其实质还是数组

特点:

  • 长度是可变的。
  • 可以存储不同类型数据。
  • 最终要转成字符串进行使用。

常用方法:

  • 添加

    • StringBuffer append(data):将指定数据作为参数添加到已有数据结尾处
    • StringBuffer insert(index,data):可以将数据插入到指定index位置
  • 删除

    • StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end.
    • StringBuffer deleteCharAt(index):删除指定位置的字符
      //清空缓冲区:
      //sb=new StringBuffer();
      sb.delete(0,sb.length());
      
  • 修改

    • StringBuffer replace(start,end,string)
    • void setCharAt(int index,char ch)
  • 查找

    • char charAt(int index)
    • int indexOf(String str)
    • int lastIndexOf(String str)
    • int length()
    • String substring(int start,int end)
  • 反转

    • StringBuffer reverse();
  • 将缓冲区中指定数据存储到指定字符数组中。

    • void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)
  • 其他方法

    • void setLength(int newLength);设置字符序列的长度

      如果小于已有字符序列的长度,相当于清除缓冲区中的一部分内容。
      如果大于已有字符序列的长度,相当于扩充缓冲区,扩充部门内容用空格字符填充。

  • 说明:当创建的StringBuffer内容长度大于16,将会新创建一个新数组,长度比旧数组要长。然后把就数组的内容拷贝到新的数组,超出旧数组长度范围的内容将会放在新数组现在内容的后面,也可以通过StringBuffer(int capacity)构造函数指定

StringBuilder

概述

  • JDK1.5版本之后出现, 与StringBuffer功能一模一样
  • 两者区别
    • StringBuffer是线程同步的,通常用于多线程。
    • StringBuilder是线程不同步的,通常用于单线程,它的出现能够提高程序效率。
  • 小结:故StringBuilder多用于多个线程是不安全的,如果需要这样的同步,则建议使用StringBuffer。

升级三个因素:

  • 提高效率
  • 简化书写
  • 提高安全性

Arrays类

基本类型包装类

  • 将基本数据类型封装成了对象,在对象中定义属性和方法
基本数据类型byteshortintlongcharfloatdoubleboolean
包装类ByteShortIntegerLongCharacterFloatDoubleBoolean

基本数据类型和包装类相互转换

基本数据类型 –> 包装类

  • 除了Character外,其他包装类都可以传入一个字符串参数构建包装类对象

包装类 –> 基本数据类型

  • 包装类的实例方法 xxx xxxValue( ); // xxx表示包装类对应的基本数据类型

基本类型和String之间的相互转换

String –> 基本类型

  • 除了Character外所有的包装类提供 xxx parseXxx(String str) 静态方法,用于把一个特定的字符串转换成基本类型变量

    int i = Integer.parseInt(“16”);

基本类型 –> String

  • String 类有静态方法 valueOf(),用于将基本类型的变量转换成String类型

    String s1 = String.valueOf(16);

进制转换方法

十进制 –> 其他进制方法:

  • String toBinaryString(int i) 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
  • String toOctalString(int i) 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
  • String toHexString(int i) 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
  • String toString(int i,int radix) 返回用第二个参数指定基数表示的第一个参数的字符串表示形式。

其他进制 –> 十进制方法:

  • static int parseInt(String s,int radix) 使用第二个参数指定的基数,将字符串参数解析为有符号的整数。

Scanner类

概述:

  • 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器,位于java.util包,被final修饰,该类不可以被继承

构造方法

  • Scanner(InputStream source)

    Scanner sc = new Scanner(System.in)

一般方法

  • hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx
  • xxx nextXxx() 获取下一个输入项。Xxx的含义和上个方法中的Xxx相同,默认情况下,Scanner使用空格,回车等作为分隔符
  • String nextLine():获取一个String类型的值。可以接收任意类型,只要遇到\r\n就证明一行结束;建议使用该方法

枚举类

概述

  • 实例固定且有限的类就在Java中称作枚举类,Java从JDK1.5以后增加了对枚举类(关键字enum 与class、interface关键字的地位相同)的支持。

特点:

  • 非抽象的枚举默认会使用fianl修饰,因此枚举不能派生子类
  • 枚举类的构造器只能使用private访问控制,若省略默认为private
  • 其所有实例必须在第一行显示列出,最后一个枚举项后的分号是可以省略的,但是如果枚举类有其他的东西,这个分号就不能省略。建议不要省略
  • 在在switch语句中的可以使用
  • 枚举类型成员默认被public static final修饰

手动实现方式

  • 思路:
    • 通过private将构造器隐藏起来;
    • 把这个类的所有可能实例都使用public static final 修饰的类变量来保存;
    • 如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的实例
  • 代码示例:
public abstract class Week {

	public static final Week MON = new Week("星期一") {
		public void show() {
			System.out.println("星期一");
		}
	};
	public static final Week TUE = new Week("星期二"){
		public void show() {
			System.out.println("星期二");
		}
	};
	public static final Week WED = new Week("星期三"){
		public void show() {
			System.out.println("星期三");
		}
	};

	private String name;
	private Week(String name){
		this.name = name;
	}						//私有构造,不让其他类创建本类对象
	public String getName() {
		return name;
	}

	public abstract void show();
}

枚举类的常见方法

  • int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。
  • int compareTo(E o) 比较此枚举与指定对象的顺序。
  • String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。
  • String toString()返回枚举常量的名称,它包含在声明中。
  • static T valueOf(Class type,String name)返回带指定名称的指定枚举类型的枚举常量。
  • values() 此方法虽然在JDK文档中查找不到,但每个枚举类都具有该方法,它遍历枚举类的所有枚举值非常方便

代码示例

enum Week {
	MON("星期一"){
		public void show() {
			System.out.println("星期一");
		}
	},TUE("星期二"){
		public void show() {
			System.out.println("星期二");
		}
	},WED("星期三"){
		public void show() {
			System.out.println("星期三");
		}
	};

	private String name;
	private Week(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}

	public String toString() {
	return name;
	}

	public abstract void show();				
	}

public class EnumDemo {
	public static void main(String[] args) {
		Week mon = Week.MON;
		mon.show();

		//遍历枚举类的所有枚举值
		Week[] arr = Week.values();
		for (Week week : arr) {
			System.out.println(week);
		}
	}
}

System类

  • System类中的字段和方法都是静态的

常见方法

  • 有关IO流的方法

    • static InputStream in “标准”输入流。
    • static PrintStream out “标准”输出流。
    • static void setIn(InputStream in) 重新分配“标准”输入流。
    • static void setOut(PrintStream out) 重新分配“标准”输出流。
    System.setIn(new FileInputStream("1.txt")); //将源改成文件1.txt
    System.setOut(new PrintStream("2.txt")); //将目的改成文件2.txt
    
  • long currentTimeMillis();获取当前时间的毫秒值,可以通过此方法检测程序的执行时间。

  • Properties getProperties();确定当前的系统属性。

    Properties集合中存储的都是String类型的键和值。

  • Set stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,如果在主属性列表中未找到同名的键,则还包括默认属性列表中不同的键。

Runtimie类

每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。应用程序不能创建自己的 Runtime 类实例。

特点

  • 没有构造方法摘要,说明该类不可以创建对象。又发现还有非静态的方法,说明该类应该提供静态的返回该类对象的方法。而且只有一个,说明Runtime类使用了单例设计模式。

常用方法

  • static Runtime getRuntime() 返回与当前 Java 应用程序相关的运行时对象。

    Process类:ProcessBuilder.start() 和 Runtime.exec 方法创建一个本机进程,并返回 Process 子类的一个实例,该实例可用来控制进程并获得相关信息。

  • Process exec(String command) 在单独的进程中执行指定的字符串命令。

    //用记事本打开SystemDemo.java Runtime r = Runtime.getRuntime(); Process p = r.exec(“notepad.exe SystemDemo.java”);

Math类

提供了操作数学运算的方法,都是静态的。

常用方法:

  • ceil():返回大于参数的最小整数。
  • floor():返回小于参数的最大整数。
  • round():返回四舍五入的整数。
  • pow(a,b):a的b次方。
  • static double random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。

Radom类(位于java.util)int nextInt(int n) 返回一个伪随机数,它是取自此随机数生成器序列的,在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

//打印1到10的随机数
Random r = new Random();
for(int x=0; x<10; x++) {
//int d = (int)(Math.random()*10+1);
int d = r.nextInt(10)+1;
System.out.println(d);
}

Date、DateForm类

  • 类 Date 表示特定的瞬间,精确到毫秒。

日期对象和毫秒值之间的转换

  • 毫秒值**>日期对象:
    • 通过Date对象的构造方法 new Date(timeMillis);
    • 还可以通过setTime设置。因为可以通过Date对象的方法对该日期中的各个字段(年月日等)进行操作。
  • 日期对象–>毫秒值:
    • long getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

对日期对象进行格式化:

  • 将日期对象–>日期格式的字符串。

    • 使用的是DateFormat类(位于java.text包)中的format方法。
    Date d =new Date();
    //将模式封装到SimpleDateformat对象中。
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 E hh:mm:ss");
    //调用format方法让模式格式化指定Date对象
    String time = sdf.format(d);
    System.out.println("time="+time);
    
  • 将日期格式的字符串–>日期对象:

    • 使用DateFormat类中的prase方法。

Calendar类

该类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

基本方法

  • static Calendar getInstance() 使用默认时区和语言环境获得一个日历。
  • int get(int field) 返回给定日历字段的值。
  • void set(int year, int month, int date) 设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
  • abstract void add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。

    例如,要从当前日历时间减去 5 天:add(Calendar.DAY_OF_MONTH, *5);