一. l/O集合框架
Collection接口 存储 一组不唯一、无序的数据
List 存储一组不唯一、有序(插入顺序)的数据
Set 存储一组唯一、无序的数据
ArrayList类
存储数据为数组,当前类实现了长度可变的数组操作。特点是随机访问和遍历效率高。
注:默认的数组长度为10,当数组不够存储数组时,将创建新数组。并且将原来数组中的元素复制到新数组,然后添加新元素,
新数组长度为(旧数组长度X3)/2+1;
当数组不够存储数据时,将创建新数组,并且将原来数组中的原素复制
HashSet类(Set接 口的实现类)
特点:
- 存储无序元素
- 允许元素值为空
- 非线程安全
迭代器
作用:实现集合元素的遍历
注:Collection接口的派生接口或类
使用步骤: - 获取迭代器(iterator)
- 判断是否存在下一个元素{hasNext()}
- 如果存在下一个元素就获取下一个元素next();
LinkedList类
存储结构为链表,特点是插入和删除效率比较高。
Map 接口 存储一组键-值映射的元素
注:key是由Set存储
Value是由collection 存储
遍历Map步骤: - 获取key的集合
- 遍历key 的集合,获取每一个key,根据key获取对应的value。
HasMap类
枚举
由一组固定的常量组成的类型
注:
1. 枚举类中常量必须在最前面,常量名之间用逗号分隔,如果只有常量可以不加分号结束。如果还有其他成员就必须用分号结束。
2. 枚举类中有属性、方法、构造方法(本身就是一个特殊的类)
包装类
Java为每一个基本类型都提供了包装类型(对象类型)
JDK1.5引入了自动装箱和自动拆箱。
自动装箱:将基本类型转换成包装类型
自动拆箱:将包装类型转换成自动类型
类型转换
- 将字符串转换成基本类型(Character除外)
包装类.Parse类型(值);
例:
int num = Integer.parseInt(“3”);
double number = Double.parseDouble(“3.3”); - 将基本类型转换成字符串
a) 拼接一个空字符串
b) 调用包装类的tostring()方法
String result =Integer.tostring (num);
==和equals的区别
==:基本类型比较值,引用类型比较地址
Equals:Object类中equals比较2个对象的地址(实际上就是==)
String类重写了Object类的equals方法,先比较地址,地址不等再比较每一个字符。
String类
不可变的字符串
常用的方法
String mess = "hello world";
/获取字符串长度/
System.out.println("字符串长度:"+mess.length());
/返回指定索引位置的值/
System.out.println("索引位置4所对应的值"+mess.charAt(4));
/字符串拼接/
System.out.println("拼接一个字符串:"+mess.concat("xiaobai"));
/判断指定字符串是否存在/
System.out.println("是否存在hello:"+mess.contains("hello"));
/判断2个字符串是否相等/
System.out.println("是否和hello world相等:"+mess.equals("hello world"));
/忽略大小写比较字符串大小/
System.out.println(mess.equalsIgnoreCase("HELLO WORLD"));
/返回指定字符串第一次出现的位置/
System.out.println( mess.indexOf("l"));
System.out.println(mess.indexOf("world"));
/返回指定字符串最后一次出现的位置/
System.out.println(mess.lastIndexOf("l"));
/如果找不到返回-1/
System.out.println(mess.indexOf("a"));
/从索引为5开始查找第一次出现l的索引/
System.out.println(mess.indexOf("l",5));
System.out.println(mess.replace("world", "chengguanxi"));
//将字符串中的world替换为 chengguanxi
System.out.println(mess.startsWith("h"));
//判断字符串是已指定字符串作为前缀
System.out.println(mess.substring(2));
//从指定位置开始(包含)到字符串末尾截取字符串
System.out.println(mess.substring(2, 5));
//截取起始位置到结束位置之间的字符串(包含起始,不包含结束)
System.out.println(mess.toLowerCase());//将字符串转为小写
/将字符串转为大写/
System.out.println(mess.toUpperCase());
/去除字符串的前后空格/
System.out.println(mess.length());
System.out.println(mess.trim().length());
StringBuffer类
可变的字符串对象,通常字符串拼接时使用
StringBuilder类
和SringBuffer类用法基本一致,StringBuffer是线程安全的,StringBuilder非线程安全,所以相对而言速度快
(轻安全,速度快)
Java.util.Date类
日期时间类
New.Date();表示获取当前系统时间
格式化
将日期时间类型转成文本
解析
将文本转成日期时间类型
通过SimpleDateFormat 类实现格式化和解析
流
一连串流动的字符,是以先进先出的方式发送和接收数据的通道
输出(写)
程序(内存) 文件
输入(读)
流的分类
- 按流向分
输入流
输出流 - 按处理数据单元分
字节流
字符流
注:以程序(内存)为参照物,从程序往文件(介质),叫输出流,从文件等(介质)往程序(内存),叫输入流。
输入流对应的操作为读,输出流对应的操作为写。
处理流的步骤: - 创建流的对象(输入流/输出流)
- 操作流(读/写)
- 关闭流
包装类的处理步骤: - 创建流对象(输入流/输出流)
- 创建包装类,包装流对象
- 操作流(读/写)
- 关闭流
序列化
将对象的状态存储到特定介质中的过程
实现序列化
- 将要序列化的对象所属类实现序列化接口(Serializable)
- 创建对象字节输出流(ObjectOutStream),包装输出流
- 调用方法(writeObject()),将对象写入节质中
- 关闭流
反序列化
将存储介质中的对象读取到程序中的过程
实现反序列化
- 创建对象字节输入流(),包装输入流
- 读取节质中的对象信息(read()Object())
- 关闭流
序列化的算法
当我们试图序列化一个对象时,首先会检测当前对象是否已经被序列化
如果没有被序列化,那么分配序列号,并序列化对象
如果已经被序列化,那么就直接输出序列号,不在重新序列化。
注:
- 当某些属性不希望被序列化,可以为属性添加transiant修饰符
- 反序列化无需通过构造器生成对象
- 按照序列化的顺序反序列对象
- 如果反序列化的对象有父类,那么父类应该事先序列化接口,或者有无惨构造,否则会报错
反射
在运行的状态中,动态获取信息以及动态调用对象方法的功能
Field类
Method类
Constructor类
注:getField()方法只能获取public访问权限的属性
getDeclaredField()方法可以获取所有访问权限的属性
获取一个类的class对象
- 类名.class
- 对象.getClass();
- Class.forName(“类的全路径”)
通过反射动态创建对象 - 通过class对象的newInstance()创建(是通过无参构造创建对象)
- 先获取指定的构造函数对象,通过指定的构造函数来创建对象
注解分解 - 内建注解(JDK5.0)
- 元注解(用来修饰其他的注解定义)
- 自定义注解(用户自己定义的注解类型)
程序
是对数据描述与操作的代码的集合
进程
是程序的一次动态执行的过程,它对应了从代码加载、执行至执行结束的完整过程。
线程
线程是进程中执行运算的最小单位,进程在其执行过程中可以产生多个线程,而线程必须在某个进程内执行。
如何实现线程操作
- 编写类继承Thread类
- 编写类实现Runnable接口
注:
- 调用run()和start()是否一样?
答:不一样,调用run()表示调用一个普通方法,调用start()表示启动一个线程,本质上不一样。 - 线程是否可以反复启动?
答: 不可以,线程一旦启动就变成可运行状态,在当前的生命周期中,要么切换到阻塞状态,要么到死亡状态。不可以重写启动(一个线程对应了他的生命周期,生命周期是不可逆的)
如果想再次完成任务,需要重新创建线程对象,启动新的线程
线程的优先级
优先级高的线程可以抢占优先级低的线程资源
优先级最大的为10,最小的为1 ,默认为5
同步
如果多个线程访问同一个资源,那么可能会出现错误的情况,
实现线程同步的方式
- 同步方法
访问修饰符synchronized 返回值类型
方法名(参数){
} - 不同代码块
Synchronized(收益对象){
}
注: - 同步方法本身是互斥的,就是当同步方法被一个线程调用时,其他线程不允许访问。必须等待这个同步方法调用完成才能继续访问。
- 同一个类中的同步方法也是互斥的