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字段。
本博客文章未经许可,禁止转载和商业用途!
如有疑问,请联系: 2083967667@qq.com