系统常用类
一、Object类
万类之祖Object类,Java中的所有类都直接或间接的继续自Object。
1、toString()方法
用于打印对象地址,可以重写此方法
public class TestObject {
public static void main(String[] args) {
Object ob1 = new Object();
Object ob2 = new Object();
System.out.println(ob1.toString());
System.out.println(ob2.toString());
}
}
2、equals()方法
直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,所谓同一对象就是指内存中同一块存储单元,如果this和obj指向同一块内存对象,则返回true,如果this和obj指向的不是同一块内存,则返回false,即便是内容完全相等的两块不同的内存对象,也返回false
public class TestObject {
public static void main(String[] args) {
Object ob1 = new Object();
Object ob2 = new Object();
System.out.println(ob1.toString());
System.out.println(ob2.toString());
System.out.println(ob1.equals(ob2));
}
}
二、String类
1、字符串
字符串是字符的序列,它是组织字符的基本数据结构,从某种程度上来说有些类似于字符的数组。
在Java中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类:
一类是创建之后不会再做修改和变动的字符串常量–String;对于字符串常量,由于程序中经常需要对它做比较,搜索之类的操作,所以通常把它放在一个具有一定名称的对象之中,由程序对该对象完成上述操作。在Java中,存放字符串常量的对象用String类。
一类是创建之后允许再做更改和变化的字符串变—StringBuffer / StringBuilder;对于字符串变量,由于程序中经常需要对它做添加,插入,修改等操作,一般存放在StringBuffer/ StringBuilder类的对象中。 StringBuffer是线程安全;StringBuilder没有实现线程同步,但速度更快建议使用。
①String
public class TestString {
public static void main(String[] args) {
/*
Java.lang.String类是一个特殊的类,可以不用new创建对象;
如:String str1=“Hello world!”; Java编译器自动为字符串常量生成一个String类的实例,
因此可以用字符串常量直接初始化一个String对象;
程序对字符串处理最多,因此String提供了很多字符串操作方法。
*/
String str1 = "GOK";
String str2 = "GOK";
String str3 = new String("GOK");
String str4 = new String("GOK");
System.out.println(str1 == str2);
System.out.println(str3 == str4);
System.out.println(str1.equals(str2));
System.out.println(str3.equals(str4));
}
}
System.out.println(str1 == str2);//true
System.out.println(str3 == str4);//flase
System.out.println(str1.equals(str2));//true
System.out.println(str3.equals(str4));//true
//String类中重写了equals()方法,只要值一样就返回true
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
②StringBuffer
StringBuffer是线程同步,是安全的;
public class StringBufferAndStringBuilder {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(1);
stringBuffer.append("中国");
System.out.println(stringBuffer);
}
}
//常用方法
public class Demo01 {
public static void main(String[] args) {
StringBuffer str = new StringBuffer("goktech");
str.append("GOK");//追加
System.out.println(str);
str.insert(3, "GOK");//添加
System.out.println(str);
str.replace(0, 3, "GOK");//修改
System.out.println(str);
str.delete(0, 3);//删除
System.out.println(str);
}
}
③StringBuilder
StringBuilder没有实现线程同步,但速度更快建议使用。
public class StringBufferAndStringBuilder {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("猴子");
stringBuilder.append("八戒");
System.out.println(stringBuilder);
stringBuilder.reverse();
System.out.println(stringBuilder);
}
}
2、构造函数
①将字符数组转化成字符串
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
②将字符数组转化成字符串(从offset位开始的count位)
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
③将数字数组转化成字符串(将ASCll值转化成 字符输出)
3、常用的方法
public class TestString {
public static void main(String[] args) {
String str1 = "goktechg";
String str2 = "GOKTECHG";
String str3 = "gok,GOK";
String str4 = "gok,GOK";
// 1. int length ();获取字符串长度
System.out.println("1:" + str1.length());
// 2. char charAt ( int index);获取字符串相应位置上的字符
System.out.println("2:" + str1.charAt(0));
// 3. int indexOf (String sub); 获取字符在字符串上的位置,有重载方法
System.out.println("3:" + str1.indexOf('g'));//从开头开始索引
// 4. int lastIndexOf (String sub);//有重载方法
System.out.println("4:" + str1.lastIndexOf('g'));//从末尾开始索引
// 5. int compareTo (String oth);
// 6. String concat (String oth) 在字符串末尾添加字符串
System.out.println("6:" + str1.concat("GOK"));
// 7. byte[] getBytes (); 将字符串中每一个字符转化成ASCLL码,再存入数组中,有重载方法
byte[] by1 = str1.getBytes();
System.out.print("7:");
for (int i : by1
) {
System.out.print(i + " ");
}
System.out.println();
// 8. char[] toCharArry ();将字符串中每一个字符存入数组中
char[] ch1 = str1.toCharArray();
System.out.print("8:");
for (char i : ch1
) {
System.out.print(i + " ");
}
System.out.println();
// 9. String toLowerCase ()将字符串全部变成小写
System.out.println("9:" + str2.toLowerCase());
// 10. String toUpperCase ()将字符串全部变成大写
System.out.println("10:" + str1.toUpperCase());
// 11. String replace(char ochar,char nchar);将指定的字符变成新的字符
System.out.println("11:" + str1.replace("g", "G"));
// 12. String replaceAll(String regex,String nchar);多个字符的转化
System.out.println("12:" + str1.replaceAll("gok", "GOK"));
// 13. String[] split(String regex);将字符串以","分割成新的字符串,若要以"."分割,则需要转义字符"\\. "
String[] ch2 = str3.split(",");
System.out.print("13:");
for (String str : ch2
) {
System.out.print(str + " ");
}
System.out.println();
// 14. substring(int start,int end);截取字符串,有重载方法(注意)
System.out.println("14:" + str2.substring(1, 3));//包含头不包含尾
// 15. startsWith(String str);判断字符串是否“gok”开头,用于查找“gok”开头的文件
System.out.println("15:" + str1.startsWith("gok"));
// 16. endsWith(String str);判断字符串是否“ch”结尾,用于查找相应后缀名的文件
System.out.println("16:" + str1.endsWith("chg"));
// 17. equals(); 判段字符串是否相等,String重写了equals方法,因此只需要值相等
System.out.println("17:" + str3.equals(str4));
// 18. equalsIgnoreCase();判段字符串是否相等,且不区分大小写
System.out.println("18:" + str1.equalsIgnoreCase(str2));
// 19. trim()去除字符串中的左右空格
String trim = " aa ".trim();
System.out.println("19:" + trim);
}
}
4、正则表达式
正则表达式是通过模式匹配实现对字符的查询,提取,替换,分割;从而简化操作对字符的处理
主要功能如下:
①测试字符串的某个模式。例如,可以对一个输入字符串进行测试,看在该字符串是否是一个电话号码或一个身份证号码。这称为数据有效性验证。
②替换文本。可以在文档中使用一个正则表达式来标识特定文字,然后替换为其他文字。
③根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。
如果原来没有使用过正则表达式,那么请想一下在硬盘上是如何查找文件的?
用 ? 和 * 字符来帮助查找您正寻找的文件: ? 字符匹配文件名中的单个字符,而 * 则匹配一个或多个字符。
一个如 ‘data?.dat’ 的模式可以找到下述文件:data1.dat ; data2.dat ; datax.dat ; dataN.dat
如果使用 * 字符代替 ? 字符,则将扩大找到的文件数量。‘data*.dat’ 可以匹配下述所有文件名:data.dat ; data1.dat ; data2.dat ; data12.dat ; datax.dat ; dataXYZ.dat
而正则表达式的功能更强大,也更灵活
①定位符
两个特殊的符号“^”和“$”。他们的作用是分别指出一个字符串的开始和结束。
\b匹配一个单词边界,也就是指单词和空格间的位置。
\B匹配非单词边界。例如:
1、 “^sato”:表示所有以“s”开始的字符串 后面是ato的字符串,
2、 “sato$”:表示所有以“o”结尾的字符串 前面是sat
这两个都表示sato字符串
3、 “^sato$”:表示开始和结尾都是"sato"的字符串,就是"sato"字符串本身。
4、 “sato”:表示“sato“字符串
“\bcha”:匹配”chapter” “ese\b”:匹配”chinese”
②普通字符
普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。
最简单的正则表达式是一个单独的普通字符,可以匹配所搜索字符串中的该字符本身。例如,单字符模式 ‘A’ 可以匹配所搜索字符串中任何位置出现的字母 ‘A’。
比如a-z A-Z 0-9任意字符
“abc” “110” “aBc110”
③转义字符
空格符、制表符、换行符、回车符、 单引号符、双引号符、反斜线、百分符、下划线符等,要用到转义序列。所有的转义序列都用反斜杠()打头。
制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以用这个模式:^\t ;
类似的,用\n表示“新行符”;\r表示回车符;\b表示退格符;\‘表示单引号符; \“表示双引号符;%表示百分号符;_表示下划线符;-表示中线; 反斜杠本身用\表示;句号.用.表示。
④限定字符
特殊字符:“*”、“+”和“?”。表示一个或一序列字符重复出现的次数。
"*“ 没有或更多(与{0, }作用相同)
"+“ 一次或更多(与{1, }作用相同)
“?” 没有或一次(与{0,1}作用相同)
例:
1、“ab*”:表示在字符串中有一个a后面跟着零个或若干个b。如:“a”,“ab”,"abbb"等
2、 “ab+”:表示在字符串中有一个a后面跟着至少一个b或者更多
3、 “ab?”:表示在字符串中有一个a后面跟着零个或者一个b
4、 “a?b+$”:表示在字符串的末尾有零个或一个a跟着一个或几个b
5、 “^ [0-9]+$”:表示所有的正数
6、 “^-?[0-9]+$”:表示所有的整数
7、 “^-?[0-9].?[0-9]$”:表示所有的数字(整数,小数)
也可以使用范围,用大括号括起,用以表示重复次数的范围。
1、“ab{2}”:表示一个字符串有一个a跟着2个b(“abb”)
2、“ab{2,}”:表示一个字符串有一个a跟着至少2个b
3、“ab{3,5}”:表示一个字符串有一个a跟着3到5个b
注意:
1、要匹配下限,必须指定范围的下限(如:"{0,2}“而不是”{,2}")
2、"*"、"+“和”’?“相当于”{0,}"、"{1,}“和”{0,1}"。
⑤特殊字符-|
特殊字符:“|”,表示“或”操作:
例:
1、“hi|hello”:表示一个字符串里有"hi"或者"hello"
2、"(b|cd)ef":表示"bef"或"cdef"
3、"(a|b)*c":表示一串"a"、“b"混合的字符串后面跟一个"c”
⑥特殊字符-.
特殊字符:“.”,匹配除换行符 \n之外的任何单字符,要匹配.请使用.
例:
1、“a.[0-9]”:表示一个字符串有一个"a"后面跟着一个任意字符和一个数字
2、"^.{3}$":表示有任意三个字符的字符串(长度为3个字符)
⑦方括号
方括号“[]”,表示某些字符允许在一个字符串中的某一特定位置出现:
例:
1、"[ab]":表示一个字符串有一个"a"或"b"(相当于"a|b")
2、"[a-d]":表示一个字符串包含小写的’a’到’d’中的一个(相当于"a|b|c|d"或者"[abcd]")
3、"^ [a-zA-Z]":表示一个以字母开头的字符串
4、"[0-9]%":表示一个百分号前有一位的数字
5、",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束
6、[a-z]:匹配所有的小写字母中的一个
7、[A-Z]:匹配所有的大写字母中的一个
8、[\f\r\t\n]:匹配所有的空白字符
9、[0-9]:匹配所有的数字中的一个
⑧否定符号
不允许出现的字符的表示方法:在方括号里用‘’表示不希望出现的字符,‘’应在方括号里的第一位即[^]。
例:
"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。
⑨简写符号
其它一些简捷正则表达式写法:
例:
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]’。
\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
注:详细可参考本章对应文档:
正则表达式基本语法.html
⑩特殊符号-()
( )标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
例子:
“^([0-9]|[a-z])+$”:表示任意数字和字母的组合
“(\d){1,12}”:表示1位到12位数字
示例1电话号码
public class TestRe {
public static void main(String[] args) {
String tel = "13670000001";
String rex = "1[0-9]{10}";
if (tel.matches(rex)) {
System.out.println("是手机号");
} else {
System.out.println("不是手机号");
}
}
}
正则表达式自动生成
https://www.sojson.com/regex/generate
三、基本类型 包装类型
在Java中,一切都是对象,但基本的数据类型不是对象。因此在JDK中提供了基本数据类型的封装类对象。
建议后期代码均用包装类型
八个基本数据类型对应的封装类(wrapper class):
boolean --> Boolean
char --> Character
byte --> Byte
short ---> Short
int --> Integer
long --> Long
float --> Float
double --> Double
八个基本数据类型都重写了Object中的hashCode(), equals(), toString()方法。
编译环境在JDK1.5之后支持基本数据类型与对应的封装类型的自动转换:例如:int 转换成Integer 自动转换;double 与Double 都是自动转换……
1、类型转化
①基本类型—>封装类型
public static void main(String[] args) {
Integer num1 = new Integer("10");
System.out.println(num1);
}
②封装类型—>基本类型
public static void main(String[] args) {
Integer num1 = new Integer("10");
int num2 = num1.intValue();
System.out.println(num2);
}
③基本类型—>字符串
public static void main(String[] args) {
Integer num1 = new Integer("10");
String str = String.valueOf(num1);
System.out.println(str);
}
④字符串—>基本类型
public static void main(String[] args) {
int num3 = Integer.parseInt("100");
System.out.println(num3);
}
2、常用方法
static boolean isDigit(char ch) //是否是数字
static boolean isLetter(char ch) //是否是字母
static boolean isLetterOrDigit(char ch)// 是否是字母或数字
static boolean isLowerCase(char ch) 小写
static boolean isUpperCase(char ch) 大写
static char toLowerCase(char ch) 转换成小写
static char toUpperCase(char ch) 转换成大写
static boolean isSpaceChar(char ch)
String toString()
四、数学函数类
Math 类包含基本的数字操作,如指数、对数、平方根和三角函数;Math中方法和常量都是静态的,因此可以通过类名直接调用。
1、Math常用方法
static double abs(double a); //有重载方法 绝对值
static double ceil(double a); //有重载方法 大于等于
static double floor(double a); //有重载方法 小于等于
static long round(double a); //有重载方法 四舍五入
static double pow(double a, double b); //次方
static double random();//随机数
static double max(double a,double b);//求更大值
static double min(double a,double b);//求更小值
2、Math(Random)
Math中的random方法返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
获取0到10之间的随机整数的方法是:
double d1 = Math.random() * 10;
int in1 = Math.round(d1);
或用下面的方法:
double d2 = Math.random() * 11;
int in2 = (int)d2;
//Random 随机流工具类
Random random = new Random();
//随机整数 范围 0-参数 0<= rr < 9
int rr = random.nextInt(9);
五、系统时间
1、系统时间获取
long System.currentTimeMillis();
返回以毫秒为单位的当前时间,返回当前时间与 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。
public class Demo {
public static void main(String[] args) {
Long currentTimeMillis = System.currentTimeMillis();
System.out.println(currentTimeMillis);
}
}
2、Date类
类Date 表示特定的瞬间,精确到毫秒 ,用于表示日期时间。
public class Demo {
public static void main(String[] args) {
Date date = new Date();
System.out.println(date);
}
}
3、日期格式化
DateFormat抽象类提供了格式化日期的方法, SimpleDateFormat是它的简单实现类。可以将日期格式化成指定格式的字符串;也可将指定格式字符串格式化为日期;
public class Demo {
public static void main(String[] args) {
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//日期转字符串
String dateString = dateFormat.format(date);
System.out.println(dateString);
}
}
SimpleDateFormat类中模式字符:
y 年 Year 1996; 96
M 年中的月份 Month July; Jul; 07
d 月份中的天数 Number 10
E 星期中的天数 Text Tuesday; Tue
H 一天中的小时数(0-23) Number 0
h am/pm 中的小时数(1-12) Number 12
m 小时中的分钟数 Number 30
s 分钟中的秒数 Number 55
S 毫秒数
例:日期转化为指定格式字符串
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = dateFormat.format(date);
System.out.println(dateString);
例:指定格式字符串转化为日期
String str = "2009-02-18 23:23:32";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date1 = sdf.parse(str, new ParsePosition(0));
System.out.println(date1);
4、Calendar类
Calendar 类是一个抽象类,用于描述一个日历。这个类不能直接初始化,但有个类方法getInstance() 用于创建Calendar对象。
public class Demo {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
System.out.println(calendar);
}
}
六、精度计算
1、BigDecimal类
double d1 = 0.3 * 3; 结果不是0.9,浮点数表示的字长是有限的且是离散的,并且存在舍入误差,结果只能是一个大约数。最好不要使用浮点数进行比较
BigDecimal类可以实现精度计算
BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换 ;
public class Demo {
public static void main(String[] args) {
double num1 = 0.3;
System.out.println(num1 * 3);
BigDecimal num2 = new BigDecimal("0.3");//一定要为字符串
BigDecimal num3 = new BigDecimal("3");
BigDecimal num4 = num2.multiply(num3);
System.out.println(num4);
}
}
常用方法
BigDecimal add(BigDecimal augend); // +
BigDecimal subtract(BigDecimal subtrahend); // -
BigDecimal multiply(BigDecimal multiplicand); // *
BigDecimal divide(BigDecimal divisor); // /
BigDecimal setScale(int newScale, int roundingMode);
2、数字格式化
NumberFormat 是所有数字格式的抽象基类。此类提供了格式化和分析数字的接口
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能;
public class Demo {
public static void main(String[] args) {
NumberFormat format = new DecimalFormat();
format.setMinimumIntegerDigits(4);//设置整数部分最小位数
double num1 = 123.0;
String str1 = format.format(num1);
System.out.println(str1);
format.setMaximumIntegerDigits(4);//设置整数部分最大位数
double num2 = 12345.0;
String str2 = format.format(num2);
System.out.println(str2);
format.setMinimumFractionDigits(3);//设置小数部分最小位数
double num3 = 12345.0;
String str3 = format.format(num3);
System.out.println(str3);
format.setMaximumFractionDigits(3);//设置小数部分最小位数
double num4 = 12345.0000;
String str4 = format.format(num4);
System.out.println(str4);
}
}
public class Demo {
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat("###,###");//设置按位数分割
double num1 = 123456789.00;
String format = df.format(num1);
System.out.println(format);
DecimalFormat df1 = new DecimalFormat("###,###.00");//设置小数位数
format = df1.format(num1);
System.out.println(format);
DecimalFormat df2 = new DecimalFormat("###,###.00%");//设置百分比
format = df2.format(num1);
System.out.println(format);
}
}