手记

Java高级实用技术知识

一. l/O集合框架
Collection接口 存储 一组不唯一、无序的数据
List 存储一组不唯一、有序(插入顺序)的数据
Set 存储一组唯一、无序的数据
ArrayList类
存储数据为数组,当前类实现了长度可变的数组操作。特点是随机访问和遍历效率高。
注:默认的数组长度为10,当数组不够存储数组时,将创建新数组。并且将原来数组中的元素复制到新数组,然后添加新元素,
新数组长度为(旧数组长度X3)/2+1;

当数组不够存储数据时,将创建新数组,并且将原来数组中的原素复制
HashSet类(Set接 口的实现类)
特点:

  1. 存储无序元素
  2. 允许元素值为空
  3. 非线程安全
    迭代器
    作用:实现集合元素的遍历
    注:Collection接口的派生接口或类
    使用步骤:
  4. 获取迭代器(iterator)
  5. 判断是否存在下一个元素{hasNext()}
  6. 如果存在下一个元素就获取下一个元素next();
    LinkedList类
    存储结构为链表,特点是插入和删除效率比较高。
    Map 接口 存储一组键-值映射的元素
    注:key是由Set存储
    Value是由collection 存储
    遍历Map步骤:
  7. 获取key的集合
  8. 遍历key 的集合,获取每一个key,根据key获取对应的value。
    HasMap类

枚举
由一组固定的常量组成的类型
注:
1. 枚举类中常量必须在最前面,常量名之间用逗号分隔,如果只有常量可以不加分号结束。如果还有其他成员就必须用分号结束。
2. 枚举类中有属性、方法、构造方法(本身就是一个特殊的类)
包装类
Java为每一个基本类型都提供了包装类型(对象类型)
JDK1.5引入了自动装箱和自动拆箱。
自动装箱:将基本类型转换成包装类型
自动拆箱:将包装类型转换成自动类型
类型转换

  1. 将字符串转换成基本类型(Character除外)
    包装类.Parse类型(值);
    例:
    int num = Integer.parseInt(“3”);
    double number = Double.parseDouble(“3.3”);
  2. 将基本类型转换成字符串
    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 类实现格式化和解析


一连串流动的字符,是以先进先出的方式发送和接收数据的通道

        输出(写)

程序(内存) 文件
输入(读)

流的分类

  1. 按流向分
    输入流
    输出流
  2. 按处理数据单元分
    字节流
    字符流
    注:以程序(内存)为参照物,从程序往文件(介质),叫输出流,从文件等(介质)往程序(内存),叫输入流。
    输入流对应的操作为读,输出流对应的操作为写。
    处理流的步骤:
  3. 创建流的对象(输入流/输出流)
  4. 操作流(读/写)
  5. 关闭流
    包装类的处理步骤:
  6. 创建流对象(输入流/输出流)
  7. 创建包装类,包装流对象
  8. 操作流(读/写)
  9. 关闭流

序列化
将对象的状态存储到特定介质中的过程
实现序列化

  1. 将要序列化的对象所属类实现序列化接口(Serializable)
  2. 创建对象字节输出流(ObjectOutStream),包装输出流
  3. 调用方法(writeObject()),将对象写入节质中
  4. 关闭流
    反序列化
    将存储介质中的对象读取到程序中的过程

实现反序列化

  1. 创建对象字节输入流(),包装输入流
  2. 读取节质中的对象信息(read()Object())
  3. 关闭流

序列化的算法
当我们试图序列化一个对象时,首先会检测当前对象是否已经被序列化
如果没有被序列化,那么分配序列号,并序列化对象
如果已经被序列化,那么就直接输出序列号,不在重新序列化。
注:

  1. 当某些属性不希望被序列化,可以为属性添加transiant修饰符
  2. 反序列化无需通过构造器生成对象
  3. 按照序列化的顺序反序列对象
  4. 如果反序列化的对象有父类,那么父类应该事先序列化接口,或者有无惨构造,否则会报错

反射
在运行的状态中,动态获取信息以及动态调用对象方法的功能
Field类
Method类
Constructor类

注:getField()方法只能获取public访问权限的属性
getDeclaredField()方法可以获取所有访问权限的属性
获取一个类的class对象

  1. 类名.class
  2. 对象.getClass();
  3. Class.forName(“类的全路径”)
    通过反射动态创建对象
  4. 通过class对象的newInstance()创建(是通过无参构造创建对象)
  5. 先获取指定的构造函数对象,通过指定的构造函数来创建对象
    注解分解
  6. 内建注解(JDK5.0)
  7. 元注解(用来修饰其他的注解定义)
  8. 自定义注解(用户自己定义的注解类型)

程序
是对数据描述与操作的代码的集合
进程
是程序的一次动态执行的过程,它对应了从代码加载、执行至执行结束的完整过程。
线程
线程是进程中执行运算的最小单位,进程在其执行过程中可以产生多个线程,而线程必须在某个进程内执行。

如何实现线程操作

  1. 编写类继承Thread类
  2. 编写类实现Runnable接口

注:

  1. 调用run()和start()是否一样?
    答:不一样,调用run()表示调用一个普通方法,调用start()表示启动一个线程,本质上不一样。
  2. 线程是否可以反复启动?
    答: 不可以,线程一旦启动就变成可运行状态,在当前的生命周期中,要么切换到阻塞状态,要么到死亡状态。不可以重写启动(一个线程对应了他的生命周期,生命周期是不可逆的)
    如果想再次完成任务,需要重新创建线程对象,启动新的线程

线程的优先级
优先级高的线程可以抢占优先级低的线程资源
优先级最大的为10,最小的为1 ,默认为5

同步
如果多个线程访问同一个资源,那么可能会出现错误的情况,
实现线程同步的方式

  1. 同步方法
    访问修饰符synchronized 返回值类型
    方法名(参数){
    }
  2. 不同代码块
    Synchronized(收益对象){
    }
    注:
  3. 同步方法本身是互斥的,就是当同步方法被一个线程调用时,其他线程不允许访问。必须等待这个同步方法调用完成才能继续访问。
  4. 同一个类中的同步方法也是互斥的
24人推荐
随时随地看视频
慕课网APP