1.Object
是所有类的基类
public String toString()
在打印输出类或者字符串连接时会自动调用该方法
2.包装类
java为int、byte、boolean、short、long、float、double、char等基本数据类型提供了包装类,除了int的是Integer
,char的是Character
,其他都是把开头字母改成大写,其功能就是将这些基本数据类型转储成对象
2.1 Integer
int的包装类
定义
可以直接实例化,或者用valueOf()
,举例:
Integer i = new Integer(100);
Integer i1 = new Integer("100");
Integer i2 = Integer.valueOf(100); //比较推荐的方法
Integer i3 = Integer.valueOf("100");
intValue()
类对象转基本数据类型,举例:
Integer i = new Integer(100);
int j = i.intValue();
同样的还可以转byte、double等的对应方法,举例:
Integer i = new Integer(100);
double j = i.doubleValue();
parseInt()
将字符串转int,里面参数必须是字符串,上面的定义方式的参数则是字符串或者数字都可,举例:
int j = Integer.parseInt("100");
toString()
转字符串,举例:
Integer i = new Integer(100);
System.out.println(i.toString());
MAX_VALUE/MIN_VALUE
int的最大值和最小值,即2^31-1 和(-2)^31
自动装箱/拆箱
java1.5之后,有了自动装箱/拆箱功能,即在某些时候会自动把基本数据类型转包装类或包装类转基本数据类型,举例:
Integer x = 100; //自动装箱
Integer i = new Integer(100);
int j = i; //自动拆箱
但要注意的是拆箱时要防止数据为空,否则会报错,举例:
Integer i = null;
int j = i; //i为空,自动拆箱失败
2.2 Character
isLowerCase()/isUpperCase()
判断是否char字符为大/小写,举例:
String a = "asdf";
for (int i=0; i<a.length(); i++)
{
char b = a.charAt(i);
if (Character.isLowerCase(b))
System.out.println("1");
}
isDigit()
是否为数字
isSpaceChar()/isWhitespace()
是否为空格
binarySearch()
二分查找,查找到返回索引值,查找失败返回-1,举例:
int[] array = {1,2,3};
Arrays.sort(array);
System.out.println(Arrays.binarySearch(array, 2)); //索引值为2的,结果为1
3.字符串相关
3.1 StringBuffer
可变字符串,类似python的列表和字符串的结合,和原来传统的String不同,String是不可变的,比如两个字符串:
String a = "1";
String b = "2";
a += b;
那么在String中不是把b字符串加到a的后面,而是开启一个新的内存存放a和b的相加,然后再赋值给a,因此也就不能执行类似删除某个字符那种操作,只能够通过拼接来实现结果,而且原来那个对象也一直存在,会造成内存浪费。
而在StringBuffer的机制中则是直接把b加到a的后面,因此也可以实现append、delete等操作,并且从始到终都是在对原来的对象进行操作。对比两者:
###String###
String s1 = "";
for (int i = 0; i < 100000; i++)
s1 += i; //创建100000个对象,会发现耗内存远比StringBuffer要多得多
while (true)
;
###StringBuffer###
StringBuffer s2 = new StringBuffer("a");
for (int i = 0; i < 100000; i++)
s2.append('i'); //只有在原来那个对象上运行
while (true)
;
把两个分别运行,可以看见系统的内存前者加了一大堆,而后者几乎没变
注:
还有个 StringBuilder
和StringBuffer
一样是可变字符串,使用方法也都差不多,效率比StringBuffer要高,但是线程的安全性较低(没有用synchronized
修饰符)
常用方法如下:
append()
添加字符,举例:
StringBuffer a = new StringBuffer("asd");
a.append('1').append(2); //asd12
System.out.println(a);
length()
计算长度
insert(index, str)
在第几个位置插入字符
setCharAt(index, char)
修改索引位置字符,举例:
StringBuffer s = new StringBuffer("abc");
System.out.println(s.hashCode());
s.setCharAt(2, 'a'); //变成aba
System.out.println(s.hashCode()); //会发现hashcode值没变,即还是同一个对象
reverse()
逆序字符
delete(int, int)
删除第几位到第几位的字符
replace(int, int, str)
将第几到第几位置的字符替换,举例:
StringBuffer a = new StringBuffer("1asd");
a.append('1').append(2);
System.out.println(""+a.replace(1,3, "b"));
equals()
比较
indexOf(str[,int])
从第几个位置开始找某个字符,返回位置,举例:
StringBuffer a = new StringBuffer("1asd");
a.append('1').append(2);
int b = a.indexOf("1", 1);
结果为:
4
subString(start[, end])
截取字符串
4.工具类相关
4.1 Arrays
在java.util
下的一个类,里面包含各种操作数组的方法,如输出、排序和搜索等,里面还包含一个静态工厂,可以将数据视为列表
注:
eclipse和java1.8有些不兼容,因此可能会无法使用该类,此时只需要换别的版本的jdk使用即可
常用方法如下:
toString()
将数组转成字符串返回,举例:
String[] a = {"1","2","3"};
System.out.println(a); //[Ljava.lang.String;@7852e922
System.out.println(Arrays.toString(a)); //[1, 2, 3]
sort()
给数组排序,举例:
int[] a = {2,1,3,5,7};
Arrays.sort(a);
System.out.println(Arrays.toString(a)); //[1, 2, 3, 5, 7]
如果是引用类型的数组排序,需要给该类继承Comparable
接口,并且重写public int compareTo(Object o) {}
方法,自定义排序规则,举例:
import java.util.*;
import java.io.*;
public class aaa {
public static void main(String[] args){
Stu stu1 = new Stu(1, "aaa");
Stu stu2 = new Stu(2, "bbb");
Stu[] stus = {stu1, stu2};
Arrays.sort(stus); //通过重写的compareTo方法规则排序
System.out.println(Arrays.toString(stus)); //[aaa, bbb]
}
}
class Stu implements Comparable {
int id;
String name;
Stu(int id, String name) {
this.id = id;
this.name = name;
}
public int compareTo(Object o) {
Stu s = (Stu)o;
if (s.id < this.id) { //自定义排序,id小排前面
return 1;
} else if (s.id > this.id) {
return -1;
} else {
return 0;
}
}
public String toString(){
return this.name;
}
}
4.2 Collections
在java.util
下提供了Collections
工具类,提供了对List、Set、Map等容器排序、填充、查找元素的辅助方法,相当于Arrays
类对于数组的作用一样
常用方法如下:
sort(Collection)
对容器内元素进行升序排序
shuffle(Collection)
对容器内元素进行随机排列,举例:
List<Integer> list = new ArrayList<Integer>();
for(int i=1; i<10; i++)
list.add(i);
Collections.shuffle(list);
System.out.println(list);
reverse(Collection)
对容器内元素进行逆序排列
fill(Collection, Object)
用特定对象重写该容器
binarySearch(Collection, Object)
对于排好序的容器进行二分查找
5.日期相关
5.1 Date
java.util
下的,表示日期和时间,实例化时如果不加参数,则会获得当前时间,如果加参数(毫秒),则会计算1970年1月1日 00:00:00加上对应毫秒数后的时间,举例:
Date date = new Date();
System.out.println(date); //Thu Dec 13 21:18:56 CST 2018
Date date1 = new Date(10000);
System.out.println(date1); //Thu Jan 01 08:00:10 CST 1970
常用方法如下:
getTime()
获取时间戳
after()/before()
是否更晚/更早,举例:
Date date = new Date();
Date date1 = new Date(10000);
System.out.println(date.after(date1)); //true,date时间比date1晚
其他很多方法,特别是和日期操作相关的目前都已经被废弃了,因此日期相关的操作一般使用Calender
类
5.2 DateFormat
在java.text
下,时间格式化相关,但是设置格式时一般实例其子类SimpleDateFormat
format()
时间类型转成字符串,举例:
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");
String dfTime = df.format(new Date());
System.out.println(dfTime);
上面的字符转换参考:
y 年
M 月
d 日
h 时
M 分
s 秒
S 毫秒
G 公元
D 年里的第几天
w 年里的第几周
W 月里的第几周
F 星期
a am/pm
z 英文时区
Z 数字时区
parse()
把字符串解析成时间,需要捕捉或者抛出异常,举例:
public static void main(String[] args) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:MM:ss");
String dfTime = "2018-12-12 20:20:10";
System.out.println(df.parseObject(dfTime)); // Mon Aug 12 20:00:10 CST 2019
}
5.3 GregorianCalender
是Calender
的一个子类(Calender
是抽象类),提供了公历日期计算等相关功能,举例:
Calendar cal = new GregorianCalendar();
System.out.println(cal); //输出一堆日期相关内容
get()
获取日期属性,举例:
Calendar cal = new GregorianCalendar(2000, 10, 5);
System.out.println(cal.get(Calendar.YEAR)); //2000
System.out.println(cal.get(Calendar.DAY_OF_MONTH)); //5
set()
设置日期属性,举例:
Calendar cal = new GregorianCalendar(2000, 10, 5);
cal.set(Calendar.YEAR, 2018); //设置年份
System.out.println(cal.get(Calendar.YEAR)); //2018
add()
加日期,举例:
Calendar cal = new GregorianCalendar(2000, 10, 5);
cal.add(Calendar.YEAR, 18); //增加年份
//cal.add(Calendar.YEAR, -18); //减少年份就用负数
System.out.println(cal.get(Calendar.YEAR)); //2018
setTime()
设置日期,举例:
Calendar cal = new GregorianCalendar(2000, 10, 5);
cal.setTime(new Date());
System.out.println(cal.get(Calendar.YEAR)); //2018
getTime()
获取日期,举例:
Calendar cal = new GregorianCalendar(2000, 10, 5);
System.out.println(cal.getTime()); //Sun Nov 05 00:00:00 CST 2000
6.数学相关
6.1 Math
大部分数学运算的类
abs()
绝对值
sqrt()
平方根
ceil()/floor()
向上/向下取整
round()
四舍五入
sin()/cos()/tan()/acos()/...
正余弦/反正余弦
pow(double a, double b)
a的b次幂
log()
对数
exp()
以e为底的指数
max()
最大值
min()
最小值
random()
[0,1)的随机数
E/PI
e和π
toDegress(double)
弧度转成角度
toRadians(double)
角度转弧度
6.2 Random
伪随机数类,在java.util
下,效率高但线程不够安全,线程安全使用ThrealLocalRandom
类
构造方法
如果实例化时不传参数,则使用默认种子(当前时间戳),如果传参数则会将参数作为种子数传入,相同种子数生成的随机数相同
nextBoolean()
生成一个boolean随机数,举例:
System.out.println(new Random().nextBoolean());
nextInt()
生成一个int随机数,如果给了整型参数,就会生成在0到该范围内的随机数,举例:
Random r = new Random();
System.out.println(r.nextInt());
System.out.println(r.nextInt(1)); //0到100
nextBytes()
nextDouble()
生成一个[0,1)之间的double型数
setSeed(long seed)
设置随机数种子
6.3 BigDecimal
实现任意精度小数运算类(任意长度整数用BigInteger
),实例化举例:
BigDecimal bd = new BigDecimal(1.11111111111111);
//1.1111111111111100502313320248504169285297393798828125
可以看到结果也并不是精确的,原因是因为调用该构造器时传入的double
类型数本身就是不精确的,因此会造成结果也无法精确,为此建议调用传入String
类型的构造器参数,举例:
BigDecimal bd1 = new BigDecimal("1.11111111111111");
//1.11111111111111
运算操作
因为这些数现在并非基本数据类型,而都是属于一个个类,所以无法直接进行基本的加减乘除操作,此时可以使用其下实现的算术操作方法来完成操作
add()
实现该运算类数的加法,举例:
BigDecimal bd1 = new BigDecimal("1.11111111111111");
BigDecimal bd2 = new BigDecimal("1.11111111111111");
System.out.println(bd1.add(bd2));
subtract()
减法
multiply()
乘法
divide()
除法
7.枚举类
7.1 enum
枚举类,主要用来定义一组常量(默认都是public static final
),举例:
enum pets {
dog, cat, pig
};
public static void main(String[] args) {
System.out.println(pets.dog);
}
8.文件操作
8.1 File
在java.io
下,在文件操作当中常用
createNewFile()
创建文件,需要抛出IOException
异常,如果不加路径默认在当前项目目录下创建,举例:
File f = new File("F:/a/1.txt");
f.createNewFile();
renameTo()
修改文件名称,举例:
File f = new File("F:/a/1.txt");
System.out.println(f); //F:\a\1.txt
f.renameTo(new File("F:/a/3.txt")); //修改文件名
delete()
删除文件
deleteOnExit()
在JVM停止时删除文件
mkdir()/mkdirs()
创建目录,前者如果目录有部分路径丢失则创建失败,后者则会将丢失部分一起创建
list()
返回所有文件名,举例:
File f = new File("F:/a");
String[] files = f.list();
for (String file : files)
System.out.println(file);
结果:
1.txt
2.txt
3.txt
b
listFiles()
返回所有文件对象,举例:
File f = new File("F:/a");
File[] files = f.listFiles();
for (File file : files)
System.out.println(file);
结果:
F:\a\1.txt
F:\a\2.txt
F:\a\3.txt
F:\a\b
listRoots()
File
类下提供的静态方法,返回所有盘符,举例:
for (File file : File.listRoots())
System.out.println(file);
结果:
C:\
D:\
E:\
F:\
exists()
判断文件是否存在
isDirectory()
判断是否为目录文件
isFile()
判断是否为文件
length()
文件大小
getName()
获取文件名
getPath()
获取文件路径,如果要获得绝对路径则用getAbsolutePath()
lastModified()
获取最后修改时间,得到的是时间戳
separatorChar/separator
File
类中提供的静态变量,根据当前系统获取路径分隔符(windows是\
,Linux是/
),举例:
char c = File.separatorChar;
String s = File.separator;
System.out.println(c); //输出\,在Linux输出/
System.out.println(s); //输出\,在Linux输出/
pathSeparatorChar/pathSeparator
File
类中提供的静态变量,根据当前系统获取属性分隔符(windows是;
,Linux是:
),举例:
char c = File.pathSeparatorChar;
String s = File.pathSeparator;
System.out.println(c); //输出;,在Linux输出:
System.out.println(s); //输出;,在Linux输出:
8.2 RandomAccessFile
随机访问文件类,可以通过游标来对文件读写进行操作,这个类常用来进行大文件的多线程断点下载
8.3 Properties
用于对.properties
的资源文件进行配置和管理,文件内的记录方式为:key=value
,其中等于号两边可以加空格,但是其他地方不要加,并且也不要加引号,到时候操作时则会将所有内容按照键值方式来操作。因为其继承了HashTable
类,所以该类下方法基本都有
load(inputStream)
导入资源文件数据,举例:
Properties p = new Properties();
InputStream in = new FileInputStream("f:/a/1.properties");
p.load(in);
System.out.println(p); //{password=bbb, name=aaa}
getProperty(key)
获取某个键的值
setProperty(key)
修改某个键的值
store(outputStream, comment)
将文件保存到新文件当中,举例:
Properties p = new Properties();
InputStream in = new FileInputStream("f:/a/1.properties");
OutputStream out = new FileOutputStream("f:/a/2.properties");
p.load(in);
System.out.println(p.setProperty("name", "aaaaa"));
System.out.println(p.put("sex", "1"));
p.store(out, "version1");
9.系统相关
9.1 System
系统相关类
arraycopy()
数组拷贝
currentTimeMillis()
返回以毫秒为单位的当前时间(long型)
exit()
退出当前JVM
gc()
强制运行垃圾回收器
getProperties();
获取系统所有信息,举例:
Properties pro = System.getProperties();
Set<Entry<Object, Object>> es = pro.entrySet();
for(Entry<Object, Object> e: es)
System.out.println(e.getKey() + ":" + e.getValue());
in/out
输入/输出流,相当于input()
和print()
,举例:
String b = null;
try{
InputStreamReader in = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(in);
b = br.readLine();
System.out.println(b+"");
br.close();
}catch...
err
错误打印输出流,会输出红色的错误信息,举例:
System.err.println("wrong!"); //控制台输出红色字体的wrong!
10.JVM相关
10.1 RunTime
与当前程序运行时相关
getRuntime()
返回当前java运行对象
freeMemory()
获得JVM的剩余内存,举例:
System.out.println(Runtime.getRuntime().freeMemory());
exec()
执行命令行命令,需要抛出异常,返回Process
对象,举例:
public static void main(String[] args) throws Exception {
Runtime r = Runtime.getRuntime();
r.exec("notepad"); //打开记事本
}
还可以用ProcessBuilder
来实现,举例:
ProcessBuilder pb = new ProcessBuilder("notepad");
pb.start();
gc()
强制运行垃圾回收器,底层是调用了Runtime
类下的gc()
方法
exit()
终止当前正在运行的虚拟机
10.2 Timer
在java.util
下的Timer
类提供了定时器的功能,实例化时默认是普通线程,如果传入参数true
,则会被设置为守护线程,举例:
Timer timer = new Timer(true); //守护线程
schedule(task, time[, interval])
设置一定时间后执行任务,任务的对象类需要继承于TimerTask
类,并实现里面的run()
方法,第三个参数可选,如果设置后,那么任务将以该时间间隔执行,举例:
import java.util.Timer;
import java.util.TimerTask;
public class test {
public static void main(String[] args) throws Exception {
System.out.println("aaa");
Timer timer = new Timer();
timer.schedule(new TimeTest(), 2000, 1000); //2秒后执行,以后每秒执行一次
System.out.println("bbb");
}
}
class TimeTest extends TimerTask{
public void run(){
System.out.println("ccc");
}
}
结果:
aaa
bbb
ccc
ccc
ccc
...
cancel()
终止定时器
10.3 Process
控制进程用的抽象类
destory()
杀死子进程
getInputStream()
获取子进程输入流
getOutputStream()
获取子进程输出流
getErrorStream()
获取子进程错误流
11.正则表达式相关
11.1 Pattern
在java.util.regex
下提供的正则表达式规范类
\d 数字
\D 非数字
\w 数字、字母和下划线
\W 非数字、字母和下划线
\s 所有空白字符
\S 所有非空白字符
\数字 匹配到的字符分组
^ 行的开头
$ 行的结尾
. 除换行符外的任意字符
[^ab] 除a、b外的任意字符
[ab] a或b字符
[a-zA-Z] 所有字母
+ 1次或多次
* 0次、1次或多次
? 0次或1次
{n} n次
{n,} n次或n次以上
{n,m} n到m次
注意在使用时里面的反斜杠需要转义,所以像\d
就要写成\\d
compile()
定义一个正则规则
11.2 Matcher
用来包装正则表达式匹配类
matches()
当前字符串整个是否刚好匹配,返回boolean
find()
查找当前字符串中是否存在匹配项,返回boolean,当存在多个匹配项时,每执行一次指针移动到下一个匹配项
group()
返回当前匹配项,举例:
Pattern p = Pattern.compile("\\d{2}");
Matcher m = p.matcher("a1b22c333");
while (m.find()) { //当存在匹配项
System.out.println(m.group()); //输出当前匹配项
}
结果:
22
33
12.日志相关
12.1 Logger
日志处理类
12.2 Hanlder
日志处理控制类
12.3 Format
日志处理格式化类
13.图像相关
13.1 BufferedImage
创建图像类,实例化时需要传入宽、高和色调参数,举例:
BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
getGraphics()
获取画笔对象,后面的图像操作都是在画笔对象下进行的
setColor(color)
设置背景色,在Color
类下有颜色常量
drawRect(x,y,width,length)/fillRect()
画一个四边形边框/填充一个四边形,前两个参数为左上角坐标,后两个参数为宽和高
drawLine(x1,y1,x2,y2)
画一条线,四个参数分别为两点的坐标
setFont(Font)
设置字体,里面传入Font
对象,举例:
Graphics g = img.getGraphics();
g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15)); //15号加粗斜体宋体
drawString(string,x,y)
添加文本,依次传入文本字符、在图像里距左上角的坐标
举例
画一个验证码给网页:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int width = 100;
int height = 50;
BufferedImage img = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setColor(Color.ORANGE);
g.fillRect(0, 0, 100, 50); // 橙色的框
g.setColor(Color.BLUE);
g.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 36));
g.drawString("dasd", 10, 40); // 图片里写下dasd
g.setColor(Color.GREEN);
for (int i = 0; i < 10; i++) { // 随机10条干扰线
g.drawLine(new Random().nextInt(width),
new Random().nextInt(height), new Random().nextInt(width),
new Random().nextInt(height));
}
ImageIO.write(img, "png", response.getOutputStream()); // 在网页中输出图像
}
13.2 ImageIO
输出图像流
write(img, format, outputStream)
依次传入图像、格式和输出流即可,举例:
BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
ImageIO.write(img, "jpg", response.getOutputStream());
其他
UUID
全局唯一标识符
randomUUID()
生成随机的16进制字符串
AnnotatedElement
java.lang.reflect
下的反射注解接口,Class
/Method
/Field
/Constructor
等类实现了该接口
getAnnotation(annotationClass)
得到指定类型的注解引用,没有则返回null
getAnnotations()
获得包含父类继承的所有注解
getDeclaredAnnotations()
得到自身的注解
isAnnotationPresent(annotationClass)
判断是否有指定注解,举例:
Class c = Test.class;
System.out.println(c.isAnnotationPresent(AnnotationTest.class)); //判断Test类里是否有AnnotationTest注解
Method m = c.getMethod("test", int.class); //通过反射获取类方法
System.out.println(m.isAnnotationPresent(AnnotationTest.class)); //该方法是否有AnnotationTest注解