常用JavaAPI(封装在包里)
- Java.lang
- Enum、包装类、Math、String、StringBuffer、System……
- java.util :工具类
- java.io :输入输出操作
- java.sql : 数据库的操作
- ……
解决不合理的赋值操作,用枚举数据类型,强制规定输入值的类型。
【定义】枚举是指由一组固定的常量组成的类
【使用枚举的好处】:
类型安全(保证了属性的正确赋值)
易于输入
代码清晰
public enum Weekend {
Mon,Tus,Wen,Th,Fir,Su
}
以每个包装类对应的基本数据类型作为为参数
int iNum = 0;
Integer i = new Integer(iNum);
//此时的i就是Integer类型,就可以调用Integer的方法
注意
Boolean类构造方法参数为String类型的,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
当给Number包装类构造方法参数为string时,字符串不能为null,则该字符串必须可解析为相应的基本数据类型的数据。否则编译不通过,运行是会抛出NumberFormatException异常。
public type(String value)
如:Integer i = new Integer("123");
xxxValue()
:包装类转换成基本类型 Integer i1 = new Integer(100);
int ivalue = i.intValue();
System.out.println(i1.equals(ivalue)); //false
Boolean b3 = new Boolean(true);
boolean bvalue = b3.booleanValue();
System.out.println(b3.equals(bvalue)); //true
Double d3 = new Double(100.2);
double dvalue = d3.doubleValue();
System.out.println(d3.equals(dvalue)); //true
Float f3 = new Float(10.2F);
float fvalue = f3.floatValue();
System.out.println(f3.equals(fvalue)); //true
Character c3 = new Character('哈');
char cvalue = c3.charValue();
System.out.println(c3.equals(cvalue)); //true
toString()
:将包装类转化成字符串 //toString()方法是将基本数据类型转化
boolean b4 = true;
String s = Boolean.toString(b4);
System.out.println(s); //true
int num =3;
String s1 = Integer.toString(num);
System.out.println(s1); //3
String sex = Character.toString('男');
System.out.println(sex);
String d5 = Integer.toString(25);
System.out.println(d5);
parseXXX()
:把字符串转化成相应的基本数据类型(Character除外)****字符串->基本类型
//parseXXX()作用:见字符串转化成基本数据类型
int num4 = Integer.parseInt("36");
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
String score = sc.next();
double d6 = Double.parseDouble(score);
System.out.println(d6 + 10);
valueOf()
:(字符串)->包装类,除Character以外int i = 90;
Integer j1 = Integer.valueOf(i);
char sex = '男';
Character cSex = Character.valueOf(sex);
如果传入的是String类型的参数,必须要与对应的包装类类型一致,否则会报NumberFormatException异常
String m = "123";
Integer m1 = Integer.valueOf(m);
//编译报错,因为Character不存在valueOf()方法,
String gender = "男";
Character gender2 = Character.valueOf(gender);
装箱:将基本数据类型转化成对应的包装类的对象(JDK自动完成)
1、valueOf
2、构造方法
拆箱:包装类对象转化成基本数据类型的值(JDK自动完成)
注意:
包装类型并不是替换基本数据类型,在基本数据类型要用对象类型表示的时候(比如对集合添加int类型的时候)
Math类提供了常用的数学运算方法和两个静态常量E(自然对数的底数)和PI(圆周率)
常用方法
方法返回值 | 方法的描述 |
---|---|
static double |
random() 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 。 |
static double |
pow(double a,double b) 返回第一个参数的第二个参数次幂的值。 |
static double |
abs(参数1) 返回参数类型的数的绝对值 |
static double |
min(参数1,参数2) 返回参数1与参数2中较小的数 |
static double |
max(参数1,参数2) 返回参数1与参数2中较大的数 |
static double |
floor(double a) 返回小于该参数的最大整数 |
static double |
ceil(double a) 返回大于该参数的最小整数 |
注意
Random方法使用:
double random = Math.random(); random*=10; random = (int) random+1; System.out.println(random);
在API里是这样描述的:
此类的实例用于生成伪随机数流。此类使用 48 位的种子。
java.util.lang
注:
种子就把他看作是一个数列的序列,在这个序列中生成随机数,使用nextInt(int bound)生成在bound范围内的随机数
用同一个种子值初始两个Random对象,然后用每个对象调用相同的方法,得到的随机数一定是相同的。
import java.util.*;
class TestRandom {
public static void main(String[] args) {
//步骤一:创建raandom对象
Random random1 = new Random(100);
//步骤二: 调用方法
System.out.println(random1.nextInt());
System.out.println(random1.nextFloat());
System.out.println(random1.nextBoolean());
Random random2 = new Random(100);
System.out.println(random2.nextInt());
System.out.println(random2.nextFloat());
System.out.println(random2.nextBoolean());
}
}
【在API中是这样描述】:
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
java.lang.String:
直接赋值方式创建对象是在方法区的常量池
String str="hello";//直接赋值的方式
通过构造方法创建字符串对象是在堆内存
String str=new String("hello");//实例化的方式
1)编写代码比较
public class TestString {
public static void main(String[] args) {
String str1 = "Lance";
String str2 = new String("Lance");
String str3 = str2; //引用传递,str3直接指向st2的堆内存地址
String str4 = "Lance";
/**
* ==:
* 基本数据类型:比较的是基本数据类型的值是否相同
* 引用数据类型:比较的是引用数据类型的地址值是否相同
* 所以在这里的话:String类对象==比较,比较的是地址,而不是内容
*/
System.out.println(str1==str2);//false
System.out.println(str1==str3);//false
System.out.println(str3==str2);//true
System.out.println(str1==str4);//true
}
}
可能这里还是不够明显,构造方法实例化方式的内存图:String str = new String(“Hello”);
首先:
当我们再一次的new一个String对象时:
3)字符串常量池
在字符串中,如果采用直接赋值的方式(String str=“Lance”)进行对象的实例化,则会将匿名对象“Lance”放入对象池,每当下一次对不同的对象进行直接赋值的时候会直接利用池中原有的匿名对象,
这样,所有直接赋值的String对象,如果利用相同的“Lance”,则String对象==返回true;
比如:对象手工入池
public class TestString {
public static void main(String args[]){
String str =new String("Lance").intern();//对匿名对象"hello"进行手工入池操作
String str1="Lance";
System.out.println(str==str1);//true
}
}
总结:两种实例化方式的区别
1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public String intern();方法进行手工入池。
在开发的过程中不会采用构造方法进行字符串的实例化。
避免空指向
首先了解: == 和public boolean equals()比较字符串的区别
==在对字符串比较的时候,对比的是内存地址,
equals比较的是字符串内容,在开发的过程中,equals()通过接受参数,可以避免空指向。
举例:
String str = null; if(str.equals("hello")){//此时会出现空指向异常 ... } if("hello".equals(str)){//此时equals会处理null值,可以避免空指向异常 ... }
6)String类对象一旦声明则不可以改变;而改变的只是地址,原来的字符串还是存在的,并且产生垃圾(GC)
【API给出的定义是】:
线程安全的可变字符序列。
说明:
使用String类型的缺点:我们如果对字符串进行拼接操作,每次拼接都会构成一个新的String对象,既耗时,又浪费空间
相同点:都是用来引用字符串的
Stringbuffer与StringBuilder区别:
区别 | StringBuffer | StingBuilder |
---|---|---|
线程是否安全 | 线程安全 | 线程不安全 |
StringBuffer与String的区别:
区别 | StringBuffer | String |
---|---|---|
内容长度是否可变 | 可变,且初始容量16,增加容量在同一个容器中 | 不可变,每次都生成新的对象 |
方法返回值 | 方法的描述 |
---|---|
static long |
currentTimeMills() 返回以毫秒为单位的当前时间。 |
static void |
exit() 终止当前正在运行的 Java 虚拟机。非 0 的状态码表示异常终止 |
static void |
gc 运行垃圾回收器。 |
java.util.Date类:表示日期和时间
java.util.SimpleDateFormat类
【示例】
//创建日期对象
Date date = new Date();
//定制日期时间格式
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = format.format(date);
System.out.println(now);
在美国语言环境中解释日期和时间模式
日期和时间模式 | 结果 |
---|---|
"yyyy.MM.dd G 'at' HH:mm:ss z" |
2001.07.04 AD at 12:08:56 PDT |
"EEE, MMM d, ''yy" |
Wed, Jul 4, '01 |
"h:mm a" |
12:08 PM |
"hh 'o''clock' a, zzzz" |
12 o'clock PM, Pacific Daylight Time |
"K:mm a, z" |
0:08 PM, PDT |
"yyyyy.MMMMM.dd GGG hh:mm aaa" |
02001.July.04 AD 12:08 PM |
"EEE, d MMM yyyy HH:mm:ss Z" |
Wed, 4 Jul 2001 12:08:56 -0700 |
"yyMMddHHmmssZ" |
010704120856-0700 |
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" |
2001-07-04T12:08:56.235-0700 |
简单的转义字符
正则表达式 | 含义 |
---|---|
\n | 代表换行 |
\t | 制表符 |
\ | 代表\本身 |
^,$,\. ,\(,\) ,{, \} ,…… |
匹配这些字符本身 |
\d |
匹配一个数字(区分大小写) |
\D |
匹配非数字(取反的意思) |
\w |
任意一个字母或者数字或者下划线,也就是A-Z,a-z,0-9中任意一个 |
\s |
``匹配空白符(包括空格,制表符,换行符等空白符任意一个)` |
. |
小数点可以匹配任意一个字符,除了换行符 |
[]
:方括号匹配括号中的任意一个字符
正则表达式 | 含义 |
---|---|
[ab5@] | 匹配 a或b或c或@ |
[^abc] | 匹配"a",“b”,"c"之外 的任意个字符 |
[f-k] | 匹配"f"~"k"之间的任意一个字符 |
[^A-F0-3] | 匹配“A”-“F”,“0”-“3”之外的任意个字符 |
量词描述了一个模式匹配文本的方式,包含:
正则表达式 | 含义 |
---|---|
{n} | 表示重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? |
匹配表达式0次或者1次,相当于{0,1} |
+ |
表达式至少出现1次,相当于{1,} |
* |
表达式不出现或者出现任意次,相当于{0,} |
注意:
- 匹配次数中的贪婪模式(匹配的字符越多越好,默认!)
- 匹配的次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?号)
组合一个或多个表达式,通过逻辑操作符实现。
正则表达式 | 含义 |
---|---|
XY | Y跟在X后面,并且XY同时满足 |
X|Y | X或者Y |
(X) | ()表示捕获组(group),可以对组group进行处理,尤其是获取其中的内容 |
正则表达式 | 含义 |
---|---|
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
IGNORECASE 忽略大小写
SINGLELINE 单行模式
MULTILINE 多行模式
\Aa b\Z
测试文本
aguhub
agihujb
aikb
an>。表达式中的普通的字符,在匹配一个字符的时候,匹配与之相同的一个字符
简单的转义字符
正则表达式 | 含义 |
---|---|
\n | 代表换行 |
\t | 制表符 |
\ | 代表\本身 |
^,$,\. ,\(,\) ,{, \} ,…… |
匹配这些字符本身 |
\d |
匹配一个数字(区分大小写) |
\D |
匹配非数字(取反的意思) |
\w |
任意一个字母或者数字或者下划线,也就是A-Z,a-z,0-9中任意一个 |
\s |
``匹配空白符(包括空格,制表符,换行符等空白符任意一个)` |
. |
小数点可以匹配任意一个字符,除了换行符 |
[]
:方括号匹配括号中的任意一个字符
正则表达式 | 含义 |
---|---|
[ab5@] | 匹配 a或b或c或@ |
[^abc] | 匹配"a",“b”,"c"之外 的任意个字符 |
[f-k] | 匹配"f"~"k"之间的任意一个字符 |
[^A-F0-3] | 匹配“A”-“F”,“0”-“3”之外的任意个字符 |
量词描述了一个模式匹配文本的方式,包含:
正则表达式 | 含义 |
---|---|
{n} | 表示重复n次 |
{m,n} | 表达式至少重复m次,最多重复n次 |
{m,} | 表达式至少重复m次 |
? |
匹配表达式0次或者1次,相当于{0,1} |
+ |
表达式至少出现1次,相当于{1,} |
* |
表达式不出现或者出现任意次,相当于{0,} |
注意:
- 匹配次数中的贪婪模式(匹配的字符越多越好,默认!)
- 匹配的次数中的非贪婪模式(匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?号)
组合一个或多个表达式,通过逻辑操作符实现。
正则表达式 | 含义 |
---|---|
XY | Y跟在X后面,并且XY同时满足 |
X|Y | X或者Y |
(X) | ()表示捕获组(group),可以对组group进行处理,尤其是获取其中的内容 |
正则表达式 | 含义 |
---|---|
^ | 与字符串开始的地方匹配 |
$ | 与字符串结束的地方匹配 |
\b | 匹配一个单词边界 |
IGNORECASE 忽略大小写
SINGLELINE 单行模式
MULTILINE 多行模式
\Aa b\Z
测试文本
aguhub
agihujb
aikb
PS:笔记先记这么多,日后补充。