数据工具类
//Arrays.sort(arrs);// 对整个数组进行升序排列
//Arrays.sort(arrs,2,5); // 对数组中下标2开始,到5结束的数组进行升序排列
System.out.println(Arrays.toString(arrs));
类和对象的关系
类是对象的类型,对象是类的实例
类是对象的抽象化,对象是类的具象化
类是一个抽象的概念,不能表示出个体来;对象是个体存在的概念,可以指定到某一个上面
面试题:方法重写和方法重载的区别
方法重载:在同一个类中,方法名相同,方法的参数个数不同,顺序不同,类型不同,和访问修饰符无关,和返回值类型无关的多个方法叫做方法重载
方法重写:在两个有继承关系的类中,子类和父类的方法名相同,方法参数项(个数,顺序,类型)相同,子类访问修饰符不小于父类访问修饰符,子类的返回值类型是父类的返回值类型或是其子类类型,这种关系就叫做方法重写。
Exception 和 Error 的区别
Exception(异常):在程序运行中出现的不正常事件,遇到异常,会终止程序运行,为避免程序被终止,可以通过一些代码来规避这种问题,遇到异常后,处理这种异常,以达到程序正常运行的目的
Error(错误):在程序运行当中,遇到没办法处理的软件错误或硬件错误,虚拟机会选择终止运行程序。
Bug(漏洞):程序当中的不合理现象
ArrayList的方法
方法 | 含义 |
---|---|
size() | 获取集合的长度 |
get(int index) | 获取指定索引的元素 |
add(Object o) | 在列表末尾增加一个元素 |
add(int index,Object o) | 在列表指定为值增加一个元素 |
remove(int index) | 删除指定索引的元素,超出范围则越界 |
remove(Object o) | 删除指定元素,如果列表中没有该元素,不做操作 |
clone(Collection c) | 复制集合 |
contains(Object o) | 判断是否有该元素 |
toArray(Collection c) | 转换成数组 |
增 add(index, element);
addAll(index, Collection)
删 remove(index)
改 set(inidex, element)
查 get(index)
subList(from , to )
listIterator()
ArrayList和LinkedList
ArrayList 是一个以数组实现的列表,是线程不安全的。在遍历数组时速度比较快
LinkedList是双重链表形式的,是线程不安全的。在遍历数组时比较慢,插入或删除时比较快
ArrayList扩容规则:(原始集合长度*3/2)+1
HashSet集合中存放的数据不可以重复,set中没有索引值,很可能每一次读取set中的元素的顺序不一样。
Map类型用来存储键值对类型的数据
HashMap类型是线程不安全的,HashTable是线程安全的、
总结
List 元素有顺序,可以重复
|--ArrayList 一块连续的空间,线程不安全 如需要线程安全可使用Vector
|--LinkedList 元素分别在不同空间,每个元素通过内存地址链接
Set Set内元素没有顺序,不可以重复,每次读取的顺序可能不一样
|--HashSet
Map
|--HashMap 以键值对形式存在,key不可以重复,value可以重复,key和value可以是任意类型
Date 类
Date代表日期或时间,精确到毫秒(1秒 = 1000毫秒)。
构造函数:
Date()://创建一个代表当前时间的Date对象;
Date(long date)://指定毫秒数创建Date对象;
getTime():获取Date对象的毫秒数;
after(Date when):判断当前Date是否在when之后,如果是就返回true,否则返回false;
before(Date when):判断当前Date是否在when之前,如果是就返回true,否则返回false;
compareTo(Date anotherDate):比较两个日期的大小,如果当前Date等于指定Date,就返回0。如果当前Date小于指定Date,就返回负数;如果当前Date大于指定Date,就返回整数。
DateFormat类
构造函数:
SimpletDateFormat()//创建一个SimpletDateFormat对象,需要调用applePattern方法指定模式;
SimpleDateFormat(String pattern)//创建一个指定模式的SimpleDateFormat对象;
常用方法:
String format(Date d)://把一个Date对象格式化成指定模式的字符串;
Date parse(String source)://把日期的文本解析成指定模式的Date对象;
Calenda类
// 创建Calendar对象
Calendar c = Calendar.getInstance();
// 相当于
Calendar c = new GregorianCalendar();
常用方法
// 创建Calendar对象
Calendar c = Calendar.getInstance();
// 相当于
Calendar c = new GregorianCalendar();
常用方法
void add(int field, int amount)://给指定日期字段添加或减去指定的时间量;
boolean after(Object when)://判断是否在指定时间之后,返回结果;
boolean before(Object when)://判断是否在指定时间之前,返回结果;
Date getTime()://获取日历代表的Date对象;
int get(int field)://获取Calendar日历字段的值;
void set(int field, int value)://设置Calendar指定日历字段的值;
System类
System类提供了一些有用的属性和方法(获取标准输入输出流、数组复制、访问环境变量等等)。System不需要实例化。
-
获取标准输入输出流的属性:
in:获取标准的输入流;
out:获取标准的输出流;
err:获取错误输出流;
常用方法:
void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
//从源数组src的srcPos位置开始,复制length个元素到目标数组dest的destPos位置。
long currentTimeMillis()://获取当前时间的毫秒数;相当于new Date().getTime()
exit(int n)://退出jvm虚拟机。如果n非零,代表不正常关闭jvm虚拟机;
gc()://通知运行垃圾回收器尽快回收没有用的资源;
String getEnv(String name):获取环境变量(了解)
正则表达式
1、匹配
方式一:使用Pattern对象来实现。
// 创建Patther对象
Pattern p = Pattern.compile(规则);
// 创建匹配器
Matcher m = p.matcher(匹配内容);
// 调用matches方法执行匹配,如果匹配成功返回true,否则返回false。
m.matches();
方式二:使用字符串的matches方法。
String regex = "规则";
String content = "匹配内容";
content.matches(regex); // 如果返回true,代表匹配成功,否则失败
2、切割
字符串提供提供了split方法,该方法用于把字符串按照指定规则进行切割,该方法会返回一个字符串的数组。
public class Demo954 {
public static void main(String[] args) {
String ip = "192.168.3.144";
String regex = "\\."; // 匹配.
String[] ips = ip.split(regex);
System.out.println(Arrays.toString(ips));
}
}
3、替换字符串
String replaceAll(String regex, String replacement)//把字符串中指定内容全部替换成新的内容。
4、查找匹配内容
Matcher匹配器提供了查找匹配内容的方法:
boolean find()://查找匹配的内容,如果找到则返回true,否则返回false;
String group()://获取匹配内容;
模式:
字符类:
. 匹配任意一个字符。如果要匹配. ,则需要进行转义。比如: \\.
[abc]或[a-c]或[a|b|c]: 匹配a或b或c中任意一个字符。
[^abc]
:匹配除了a或b或c以外任意一个字符。
边界字符:
^ 以什么开头
$ 以什么结尾
\b 单词的边界 hello world \b[a-z]{5}\b
数量词:
+ :1个或多个
*: 0个或多个
?: 0个或1个
{n}: 至少出现n次
{n,}:
{n,m}
Collections工具类
int binarySearch(List<? extends Comparable<? super T> list , T key)
//使用二分法查找集合中的某个元素。在调用该方法前,必须保证集合元素的自然顺序按照升序排列。
int binarySearch(List<? extends T> list, T key, Comparator<? super T> c):
//使用二分法查找集合中的某个元素。在嗲用该方法前,必须要根据指定比较器(第三个参数)对集合进行升序排列。
void reverse(List list)://对List集合的元素进行翻转;
void shuffle(List list)://把集合元素的位置随机进行重新分配;
void sort(List list)://按照集合元素的自然顺序进行升序排列;
void sort(List list, Comparator c)://按照指定比较器对集合元素进行排序;
File类
构造函数:
new File(String pathname)://按照给定的文件或目录路径创建File对象。
常用方法:
//创建的方法:
createNewFile()://创建一个新的文件;
mkdir()://创建一个空目录;
mkdirs()://创建多级目录;
//删除的方法:
delete()://删除一个文件或空目录。如果目录中有其他内容,必须要先清空目录,然后才能够删除该目录。
deleteOnExit()://执行该方法时候不会马上删除文件,只有虚拟机退出前才会删除该文件;
//判断的方法:
exists()://判断文件或目录是否存在;
isDirectory()://判断是否是目录,如果是就返回true,否则返回false;
isHidden()://判断该文件是否是隐藏文件;
//查看的方法:
getName()://获取文件名;
getPath()://获取文件或目录的路径;
getAbsolutePath()://获取文件或目录的绝对路径;
length()://获取文件的长度,以字节为单位,如果文件为空,则返回0L。
lastModified()://获取文件的最后修改时间,以毫秒为单位;
File[] listFiles()//:获取该目录下所有文件或目录的File对象;
File[] listFiles(FileFilter filter)//指定过滤器把目录下文件或子目录获取出来;
FileInputStream
InpuStream:所有输入字节流的父类
|- FileInputStream: 读文件的输入字节流
构造函数:
FileInputStream(File file)://使用File对象创建一个FileInputStream对象;
FileInputStream(String name)://指定文件名创建一个FileInputStream对象
相关方法:
close()://关闭流;
read()://每次读取一个字节数据;
read(byte[] buf)://每次可以读取多个数据,读取数据的长度取决于数组的大小;
read(byte[] buf, int offset, int length)://指定从offset位置开始读取length个数据到数组中;
FileOutputStream
OutputStream:所有输出字节流的父类。
|- FileOutputStream:写文件的输出字节流。
构造函数:
FileOutputStream(File file):
FileOutputStream(File file , boolean append)://如果append为true,那么每次把数据写入文件的末尾。
FileOutputStream(String name):
FileOutputStream(String name , boolean append)://如果append为true,那么每次把数据写入文件的末尾。
主要方法:
close()://关闭流
write(byte[] buf)://把一个字节数组的数据全部写入输出流中;
write(byte[] buf, int offset, int length)://把字节数组指定offset位置开始的length个字节数据写入输出流中;
write(int b)://每次写入一个字节数据;
BufferedInputStream
构造函数:
BufferedInputStream(InputStream in)://创建BufferedInputStream对象的时候需要传入另外一个InputStream对象。BufferedInputStream需要借助传进来InputStream对象读取数据,它本身不具备读数据的能力。
常用方法:
read()://每次从缓存中读取一个字节数据;
read(byte[] buf, int offset, int length)://每次从缓存中的offset位置开始读取length个数据到buf数组中;
BufferedOutputStream
构造函数:
BufferedOutputStream(OutputStream out)://BufferedOutputStream本身并不具备写数据的能力。他需要借助传进来的OutputStream对象写数据。
主要方法:
flush()://把缓存数组中的数据写入磁盘。
write(int b)://每次把一个字节数据写入缓存数组中;
write(byte[] buf, int offset, int length)://每次从字节数组buf的offset位置开始写入length个字节到缓存数组中。
FileReader
Reader:所有输入字符流的父类。
|- FileReader:读文件的输入字符流。
构造函数:
FileReader(File file)://创建一个FileReader对象;
FileReader(String name):
常用方法:
close()://关闭流
read()://每次读取一个字符;
read(char[] buf)://每次读取一个数组长度的多个字符,并保存在数组中;
read(char[] buf, int offset, int length)://每次从offset位置开始读取length个字符到数组buf中;
FileWriter
Writer:所有输出字符流的父类。
|- FileWriter:写文件的输出字符流。
构造函数:
FileWriter(File f):
FileWriter(File f, boolean append)://如果append为true,就是在文件的末尾追加新的内容;
FileWriter(String name):
FileWriter(String name, boolean append)://如果append为true,就是在文件的末尾追加新的内容;
主要方法:
write(String str)://把字符串写入字符输出流中;
close()://关闭流;
flush()://清空流中的缓冲;
转换字符流
InputStreamReader:把输入字节流转换成输入字符流;
OutputStreamWriter:把输出字节流转换成输出字符流;
对象流
作用:实现对象的序列化和反序列。
序列化:把一个对象保存在文件中的过程。
反序列化,把一个文件的对象的数据读取出来的过程。
ObjectInputStream:对象输入字节流,实现反序列化。
ObjectOutputStream:对象输出字节流,可以实现把一个对象输出到文件中(序列化)。
序列化的对象必须要实现Serializable接口。该接口的主要作用用来标识这个类是可序列化的。
Properties
主要方法:
load(InputStream in)://从输入流中加载配置文件;
getProperty(String key)://根据key获取值。
setProperty(String key, String value)://向Properties中添加一个键值。
store(OutputStream out, String comment)://把Properties对象中的数据写入到配置文件中;
线程
方式一: 继承Thread
方式二:使用new创建Thread对象,并传入Runnable对象
线程的不同状态
准备状态:创建线程的时候。
可运行状态:调用线程的start方法,线程并不会马上执行,只有获得cpu的执行权才会执行;
运行状态:线程获得cpu的执行权,线程开始执行。
阻塞状态:线程的执行权被其他线程抢去了,或者调用了线程wait或sleep方法(线程放弃它的cpu执行权)。
如果其他线程调用notify或notifyAll的时候,线程重新进入可运行状态;
消亡状态:线程执行完毕;
同步代码块
synchronize(锁对象) {
// 可能出现线程安全问题的代码
...
}
线程通讯的方法
Object类提供了线程通讯的方法:
wait()://让当前线程进入锁对象监听器对象的线程池中等待,释放锁对象,直到被其他线程唤醒为止。
notifyAll()://唤醒锁对象监听器对象的线程池中的所有线程。
notify()://唤醒锁对象监听器对象的线程池中的其中一个线程。
Lock和Condition
jdk1.5提供用于线程通讯两个类。
Lock:锁对象;
lock():获取锁;
unlock():释放锁;
newCondifition():获取锁对象的监听器;
Condition:锁对象的监听器;
await():相当于wait方法;
signal():相当于notify方法;
signalAll():相当于notifyAll方法;
Lock和Synchronized实现线程通讯之间的区别?
1)Lock手动获取锁和释放锁,而Synchronized自动获取锁和释放锁;
2)Lock的监听器可以看得见,而Synchronized的锁对象的监听器是看不见;
3)Lock使用await、signal、signAll方法实现线程的通讯,而synchronized使用Object类的wait、notify、notifyAll方法实现线程通讯;
线程其他方法
interrupt方法
一个线程调用了wait、join、sleep方法进入阻塞状态后,如果调用了interrupt方法,该方法会把现成的阻塞状态清除,并抛出InterrupteException异常。
join方法
该方法用于实现线程让步。当前线程可以让其他线程先执行,然后让执行当前线程。
Timer和TimerTask
Timer:代表定时器;
TimerTask:代表定时任务;
UDP协议
UDP协议的特点:
1)不安全,可能会发生丢包;2)传输的数量限制在64kb以内;3)传输速度快,效率高;4)UDP是分为发送端和接收端,进行点对点的数据传输;
发送端:DatagramSocket对象
接收端:DatagramSocket,对外暴露一个端口;
TCP协议
UDP: 1)不安全,可能会发生丢包;2)传输的数量限制在64kb以内;3)传输速度快,效率高;4)UDP是分为发送端和接收端,进行点对点的数据传输;
TCP:1)安全的,不会发生丢包;2)传输数据大小没有限制,通过IO流进行数据传输;3)数据传输速度比UDP慢;4)TCP分客户端和服务端;
TCP协议传输之前要经过三次握手:
1)第一次握手:客户端发送一个数据给服务端,确认服务端是否在线;
2)第二次握手:服务端给客户端返回一个响应;
3)第三次握手:客户端再次发送一个确认给服务端,完成三次握手;
服务端:ServerSocket
客户端:Socket
反射
Class对象:
方式一:使用Class.forName(“包名+类名”)来获取指定类的Class对象;
方式二:通过调用一个对象的getClass方法来获取该对象所在类的Class对象;
方式三:通过“类名.class”来获取一个类的Class对象;
Constructor对象
Constructor代表构造器。
-
Class对象提供的方法:
Constructor[] getConstructors():获取一个类的所有公共构造函数;
Constructor getConstructors(Class... parameterType):根据参数获取指定公共的构造函数;
-
Constructor对象提供的方法:
T newInstance(Object... args):创建实例,实例的类型就是Constructor的泛型类型;
Field对象
ield代表类的成员属性。
-
获取Field的方法:
Field[] getFields():获取一个类或接口中所有公共的字段;
Field getField(String name):获取一个类或接口指定的公共字段;
Field[] getDeclaredFields():获取一个类或接口所有声明所有字段;
Field getDeclaredField(String name):获取一个类或接口所声明的指定字段;
-
操作Field的方法:
void set(Object obj, Object value):设置Field的值。如果该Field是非静态的成员属性,那么第一个参数就是该成员属性所在对象。如果该Field是静态的,那么第一个参数为null;第二参数要设置字段的值。
void setAccessible(boolean flag):设置是否取消java的语法检查。true代表取消,false代表不取消;(暴力反射)
Object get(Object obj):获取该Field对象所代表的值。如果该Field是非静态的,那么第一个参数就是该Field所在对象。如果是静态的,第一个参数可以为null;
Method对象
Object invoke(Object obj, Object... parameterType):调用方法,如果该方法是非静态的,那么第一个参数就是该方法的调用者对象;如果该方法是静态的,那么第一个参数可以为null;