JavaSE-18 常用工具类

学习要点

  • Object类
  • 枚举
  • 包装类
  • Math类
  • Random类
  • 字符串处理
  • 日期时间

  

Object类

1  什么是Object类

  • Object类存储在java.lang包中,是所有java类(Object类除外)的终极父类。
  • 数组也继承了Object类。
  • 接口是不继承Object类的,Java语言规范Section 9.6.3.4——“Object类不作为接口的父类”。
  • Java是单继承的。如果一个类没有显式继承某个类,则默认继承Object类。

2  Object类常用方法

方法

说明

public Object()

Object类构造方法。为子类默认提供无参构造函数。

private static native void

 registerNatives()

用native关键字修饰的函数表明该方法的实现不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。

protected native Object

clone() throws

CloneNotSupportedException

clone函数返回的是一个引用,指向的是新的clone出来的对象,此对象与原对象分别占用不同的堆空间。

public final native

Class<?> getClass()

getClass()也是一个native方法,返回的是此Object对象的类对象/运行时类对象Class<?>。效果与Object.class相同。

public Boolean

 equals(Object obj)

equals用来判断对象的内容完全相同,此处的内容多指对象的特征/属性。==表示用来判断是否指向同一内存地址。

public native int

 hashCode()

返回一个整形数值,表示该对象的哈希码值。一般重写equals方法的同时需要重写hashCode方法。相同哈希码值的对象,是两个相等的对象。

public String toString()

返回该对象的字符串表示。对象的反射信息。

protected void finalize()

Java垃圾回收机制方法。JVM准备对此对形象所占用的内存空间进行垃圾回收前,此方法将被调用。类似C++的析构函数。

wait()

notify()

notifyAll()

和多线程相关的方法。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对象克隆clone()方法使用示例代码:

package com.etc.base;

/*
 * 对象克隆
 * 1.自定义类实现Cloneable接口
 * 2.自定义类实现自己的clone()方法
 * 3.实现clone()方法时通过super.clone(),通过调用Object实现的clone()方法得到对象的副本,并返回该副本。
 */

/** 地址信息类 */
class Address {
	String detail;

	public Address(String detail) {
		this.detail = detail;
	}
}

/** 用户信息类:实现了克隆接口 */
class User implements Cloneable {
	int age;
	Address address;

	public User(int age) {
		this.age = age;
		address = new Address("北京东城");
	}

	/** 重写克隆方法 */
	public User clone() throws CloneNotSupportedException {
		return (User) super.clone();

	}

}

public class ObjectTest {

	public static void main(String[] args) throws CloneNotSupportedException {
		User u1 = new User(30);
		User u2 = u1.clone();//实现了浅克隆:User对象中的Address没有实现克隆(如果实现,则为深度克隆)
		// 判断u1和u2是否相同
		System.out.println(u1 == u2);//结果为false
		// 判断u1和u2的address对象是否一致
		System.out.println(u1.address == u2.address);//结果为true(未实现深度克隆)

	}

}

  

枚举

1  语法

[Modifier] enum enumName{

    enumContantName1[,enumConstantName2...[;]]

    //[field,method]

}

枚举指由一组固定的常量组成的类型

2  使用枚举的好处

类型安全、易于输入、代码清晰

3  示例代码

/**性别枚举*/

public enum Gender {

   Male, Female

}

 

/**枚举测试类*/

public class Person {

   private Gender sex;

   public Gender getSex() {

       return sex;

   }

   public void setSex(Gender sex) {

       this.sex = sex;

   }

}

 

/**测试类*/

public class Test {

   public static void main(String[] args) {

       Person p = new Person();

       p.setSex("男");//类型安全

       p.setSex(Gender.Male);

   }

}

  

包装类

1  概念

包装类是将基本类型封装到一个类中。该类包含属性和方法,方便对象操作。

包装类位于java.lang包中。

2  包装类类图

 

3  基本数据类型转换为包装类

Integer intValue = new Integer(21);

或Integer intValue = new Integer("21");

Integer intValue = Integer.valueOf("21");

  

4  包装类转换成基本类型

Integer integerId=new Integer(25);

int intId=integerId.intValue();

  

5  基本类型和包装类的自动转换

Integer intObject = 5;

int intValue = intObject;

  

注意:包装类并不是用来取代基本类型的。

 

Math类

1  类说明

java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数) 和PI(圆周率)

2  示例代码

Math.abs(-3.5); //返回3.5 

Math.max(2.5, 90.5);//返回90.5

int random = (int) (Math.random() * 10); //生成一个0-9之间的随机数

3  上机练习

需求说明

编码实现双色球功能。

分析

双色球规则红球33选6,蓝球16选1,不允许重复。

使用Math类的random()方法在1到33内随机产生6个红球号码,每产生一个判断是否已经在数组中存在 ,不存在则保存于数组,否则重选。

从1到16间随机产生一个蓝球号码。

效果示意图

 

 

 

Random类

1  Java生成随机数的几种方式

  • Math. random()方法产生随机数。
  • Random类产生随机数。
  • System.currentTimeMillis(),返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,通过毫秒数对一些数进行取模,获得相应随机数。Random类默认构造方法就是采用这种方式获得随机数。

2  Random类产生随机数

Random rand=new Random(); //创建一个Random对象

for(int i=0;i<20;i++){//随机生成20个随机整数,并显示

int num=rand.nextInt(10);//返回下一个伪随机数(0-10之间),整型的

   System.out.println("第"+(i+1)+"个随机数是:"+num);

}

  

注意:用同一个种子值来初始化两个Random 对象,然后用每个对象调用相同的方法,得到的随机数也是相同的。

Random random1 = new Random(100);

Random random2 = new Random(100);

 

ThreadLocalRandom类

用于并发环境下生成随机数,可以减少线程间的竞争,提高系统线程安全性。

示例代码:

// 获取ThreadLocalRandom实例
ThreadLocalRandom random = ThreadLocalRandom.current();
// 生成一个2-99之间的随机整数
int number1 = random.nextInt(2, 99);
// 生成一个2.0-99.0之间的随机浮点数。根据某个种子数值计算出来的伪随机数。
double number2 = random.nextDouble(2.0, 99.0);

  

 

字符串处理

1  String类

基本概念

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量:它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

String对象存储字符串

String str1 = "Hello World";

String str2 = new String();//str1==str2?

String str3 = new String("Hello World");//str3==str1?

  

String类常用操作

1.字符串比较

equals()方法:检查组成字符串内容的字符是否完全一致。

 

“==”:判断两个字符串在内存中的首地址,即判断是否是同一个字符串对象。

        

2.字符串连接

“+”连接:

System.out.println("金立高级手机:"+888+"元/部");

concat()方法连接:

String s = new String("你好,");
String name = new String("詹姆斯·高斯林!");
String sentence = s.concat(name);
System.out.println(sentence);

  

3.字符串提取

方法名

说明

public int indexOf(int ch)

搜索第一个出现的字符ch(或字符串value),返回索引号

public int indexOf(String value)

public int lastIndexOf(int ch)

搜索最后一个出现的字符ch(或字符串value),返回索引号

public int lastIndexOf(String value)

public String substring(int index)

提取从位置索引开始的字符串部分

public String substring

(int beginindex, int endindex)

提取beginindex和endindex之间的字符串部分

public String trim()

返回一个前后不含任何空格的调用字符串的副本

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注意:字符串首字符位置索引为0。

 

上机练习

需求描述:判断.java文件名是否正确,判断邮箱格式是否正确

 

分析:

l  合法的文件名应该以.java结尾

l  合法的邮箱名中至少要包含“@”和“.”, 并检查“@”是否在“.”之前。

 

字符串拆分

String类提供了split()方法,将一个字符串分割为子字符串,结果作为字符串数组返回。

同时,concat()方法支持把指定字符附加到字符串末尾。

 

上机练习

把每句话中间带空格的这段话“如果爱太荒凉  我陪你梦一场 赎回你所有泪光 这一路有多远 这三世有多长 执手到地老天荒”拆分成一句一行输出。

再把这句话按照如下格式输出:“如果爱太荒凉-我陪你梦一场-赎回你所有泪光-这一路有多远-这三世有多长-执手到地老天荒”

 

2  StringBuffer类

定义

带缓冲区的String类,支持动态调整字符串长度,是String的增强版。线程安全类。

语法格式

StringBuffer sb = new StringBuffer();

StringBuffer sb = new StringBuffer("cnetc");

  

 如何使用

sb.toString();        //转化为String类型

sb.append ("**");   //追加字符串,支持任何类型的值

  

示例代码

/* 将一个数字字符串转换成逗号分隔的数字串,

即从右边开始每三个数字用逗号分隔 */

        Scanner input = new Scanner(System.in);

        // 接收数字串,存放于StringBuffer类型的对象中

        System.out.print("请输入一串数字: ");

        String nums = input.next();

        StringBuffer str = new StringBuffer(nums);

        // 从后往前每隔三位添加逗号

        for (int i = str.length() - 3; i > 0; i = i - 3) {

            str.insert(i, ',');

        }

        System.out.print(str);

  

3  StringBuilder类

该类被设计用作 StringBuffer 的一个简易替换,非线程安全类,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

 

 

日期时间

1  Date类

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

时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

Date类的gettime()获得时间戳:

Date date = new Date();
long times=date.getTime();

  

SimpleDateFormat日期格式化:把时间戳转换成指定格式的日期输出

Date date = new Date();
long times = date.getTime();
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 定制日期格式
String now = formater.format(times); // 日期转换成日期字符串输出
System.out.println(now);

  

2  Timestamp

常用构造方法:Timestamp(long time)

使用毫秒时间值构造 Timestamp 对象。

Date date = new Date();
long times = date.getTime();
Timestamp tst=new Timestamp(times);
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 定制日期格式
String now = formater.format(tst); // 日期转换成日期字符串输出
System.out.println(now);

  

3  Calendar类

Calendar 类是一个抽象类,用于设置和获取日期/时间数据的特定部分。

示例代码:

Calendar t = Calendar.getInstance();
System.out.println("今天是" + t.get(Calendar.YEAR) + "年" + (t.get(Calendar.MONTH) + 1) + "月" + t.get(Calendar.DAY_OF_MONTH) + "日");
System.out.println("今天是星期" + (t.get(Calendar.DAY_OF_WEEK) - 1));

  

4  上机练习

需求

计算2017年5月6日是一年中的第几星期。

分析

使用set方法设置Calendar的日期。

使用Calendar类的get()方法获得WEEK_OF_YEAR字段。

posted @ 2018-01-09 22:40  rask  阅读(319)  评论(0编辑  收藏  举报