第6讲 流、Collection集合、接口、进程、线程、设计模式、反射

本文详细介绍了Java中的流、Collection集合、设计模式和反射。流分为字节流和字符流,有输入流和输出流之分,如InputStream、OutputStream、Reader和Writer。Collection接口及其实现如ArrayList和LinkedList的特点,List接口的操作如添加、删除和查询元素。设计模式是编程中的重要思想,包括单例模式等。反射则提供了运行时访问类信息的能力,包括获取成员变量、构造方法和方法等。
摘要由CSDN通过智能技术生成

1 流的分类

1)按照方向分类:输入流 输出流
2)按照操作的单位分类:字节流 字符流
3)组合情况:字节输入流 字节输出流 字符输入流 字符输出流

2 字节输入流 InputStream

1)抽象父级:InputStream–不能实例化
2)普通子级:

        1、FileInputStream–操作文件的字节输入流
              构造方法参数:File file / String pathname
        2、BufferedInputStream–高效字节输入流
              构造方法参数:InputStream,但无法创建抽象父级对象,所以传的是FileInputStream

 3  字节输出流 OutputStream

1)抽象父级:OutputStream–不能实例化
2)普通子级:

        1、FileOutputStream–操作文件的字节输出流
              构造方法参数:File file / String pathname
              注意:默认存在一个参数boolean append,默认值为false,也就是覆盖输出
              如果将FileOutputStream构造函数的第2个参数appned设置为true,就会实现追加输出的效果
        2、BufferedOutputStream–高效字节输出流
              构造方法参数:OutputStream,但无法创建抽象父级对象,所以传的是FileOutputStream

4 字符输入流 Reader

1)抽象父级:Reader
2)普通子级:

        1、FileReader–操作文件的字符输入流
              构造方法参数:File file /String filename
        2、BufferedReader–高效字符输入流
              构造方法参数:Reader,但无法创建抽象父级对象,所以传的是FileReader

 5  字符输出流 Writer

1)抽象父级:Writer
2)普通子级:

        1、FileWriter–操作文件的字符输出流
              构造方法参数:File file /String filename
              注意:默认存在一个参数boolean append,默认值为false,也就是覆盖输出
              如果将FileWriter构造函数的第2个参数appned设置为true,就会实现追加输出的效果
        2、BufferedWriter–高效字符输出流
              构造方法参数:Writer,但无法创建抽象父级对象,所以传的是FileWriter

 6 Collection集合

  1. Collection是集合层次中的根接口
  2. 集合的继承关系
  3. 是集合层次的根接口,学习抽象父级的公共方法

7 Collection集合方法总结 

7.1 单个集合的操作

boolean add(E e) 将指定元素添加到集合中
void clear() 清空集合
boolean contains(Object o) 判断本集合是否包含指定的元素
boolean equals(Object o) 比较集合对象与参数对象o是否相等
int hashCode() 返回本集合的哈希码值。
boolean isEmpty() 判断本集合是否为空
boolean remove(Object o) 从本集合中移除指定元素o
int size() 返回本集合中元素的个数
Object[] toArray() 将本集合转为数组

 7.2 集合间的操作

boolean addAll(Collection<> c) 将c集合中的所有元素添加到本集合中
boolean containsAll(Collection<> c) 判断本集合是否包含c集合的所有元素
boolean removeAll(Collection<> c) 移除本集合中属于参数集合c的所有元素
boolean retainAll(Collection<> c) 保留本集合与参数集合c的公共元素

7.3 集合的迭代 

Iterator iterator() 返回本集合的迭代器

//5.集合的迭代/遍历
/*迭代步骤:
1.获取迭代器 集合名.iterator();
2.通过迭代器判断集合中是否有下一个元素可以迭代 迭代器.hasNext()
3.获取当前迭代到的元素
注意:迭代器的泛型取决于要迭代的集合的泛型,比如c2是Integer*/
Iterator<Integer> it = c2.iterator();
while(it.hasNext()){
    Integer num = it.next();
    System.out.println(num);

8  List接口

8.1 List接口的特点

  1. List集合是有下标的
  2. List集合是有顺序的
  3. List集合可以存放重复的数据

8.2 List集合方法总结 

8.2.1 单个集合间的操作

void add(int index, E element) 在集合的指定下标index处插入指定元素element
E get(int index) 返回本集合中指定下标index处的元素
E remove(int index) 移除本集合中指定下标index处的元素
E set(int index, E element) 用参数元素element替换集合中指定下标index处的元素
int indexOf(Object o) 判断指定元素o在本集合中第一次出现的下标,如果不存在,返回-1
int lastIndexOf(Object o) 判断指定元素o在本集合中最后一次出现的下标,如果不存在,返回-1
List subList(int fromIndex, int toIndex) 截取子集合,包含formidex处的元素,不包含toIndex处的元素

8.2.2 集合间的操作与集合的迭代 

boolean addAll(int index, Collection<> c) 将参数集合c中的所有元素,插入到本集合中指定的下标index处
ListIterator listIterator() 返回此列表元素的迭代器,这个是List自己的,不太常用,可以逆序迭代

9 ArrayList的特点

1.List接口的实现类
2.底层的数据结构是数组,内存空间是连续的
3.元素有下标,有序,允许存放重复的元素
4.通常可以根据下标进行操作
5.增删操作比较慢,查询操作比较快[数据量比较大时]

10 LinkedList的特点

1.List接口的实现类
2.底层的数据结构是链表,内存空间是不连续的
3.元素有下标,有序,允许存放重复的元素
4.通常进行首尾节点的操作比较多
5.增删操作比较快,查询操作比较慢[数据量比较大时]
注意:LinkedList的查询操作也不是都慢,首尾操作还是很快的

 简单方法:

void addFirst(E e) 添加首元素
void addLast(E e) 添加尾元素
E removeFirst() 删除首元素
E removeLast() 删除尾元素
E getFirst() 获取首元素
E getLast() 获取尾元素
E element() 获取首元素

功能一致但是名字不太好记的方法 :

boolean offer(E e) 添加尾元素
boolean offerFirst(E e) 添加首元素
boolean offerLast(E e) 添加尾元素
E peek() 获取首元素
E peekFirst() 获取首元素
E peekLast() 获取尾元素
E poll() 返回并移除头元素
E pollFirst() 返回并移除头元素
E pollLast() 返回并移除尾元素

 11 Set接口

Set接口的特点

set集合没有重复的元素
set集合的元素是无序的
set集合可以存null值,并且null最多有一个
我们自定义对象如果想去重,需要在自定义类中添加重写的equals()与hashCode()

12 Map接口

Map接口的特点

  1. map集合的结构是:键值对、KEY与VALUE、Map.Entry<K,V>的映射关系
  2. map中key值不允许重复,如果重复,对应的value会被覆盖
  3. map中的映射关系是无序的
  4. map没有自己的迭代器,所以迭代时通常需要转成set集合来迭代

 13 Map集合方法总结

13.1 简单方法

void clear() 清空集合
boolean equals(Object o) 判断集合对象与参数o是否相等
int hashCode() 返回本集合的哈希码值
boolean isEmpty() 判断集合是否为空
int size() 返回本集合中键值对的个数

13.2 map单个集合间的操作 

boolean containsKey(Object key) 判断map中是否包含指定的key
boolean containsValue(Object value) 判断map中是否包含指定的value
V get(Object key) 根据指定的key返回对应的value,如果不存在,返回null
V remove(Object key) 删除本集合中参数key对应的键值对
V put(K key, V value) 向集合中添加映射关系(键值对)
void putAll(Map<> m) 向本集合中添加m集合的所有映射关系(键值对)

13.3 map的迭代 

Collection values() 把本map中的Value值取出放入一个Collection中并返回这个Collection
Set keySet() 把本map中的Key值取出放入一个Set集合中并返回这个Set集合
Set<Map.Entry<K,V>> entrySet()
把本map中的每一对KV都看成是一个Entry,把所有的Entry取出放入一个Set集合中并返回这个Set集合

14 HashMap的存储过程

HashMap的结构是数组+链表 或者 数组+红黑树 的形式
HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
当计算到的位置之前没有存过数据的时候,会直接存放数据
当计算的位置,有数据时,会发生hash冲突/hash碰撞
解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
也就是说数组中的元素都是最早加入的节点
如果链表的长度>8并且数组长度>64时,链表会转为红黑树,当链表的长度<6时,会重新恢复成链表

15 什么是进程?什么是程序?有什么区别?

程序:数据与指令的集合,程序是静态的
进程:给程序加入了时间的概念,不同的时间进程有不同的状态
进程是动态的,就代表OS中正在运行的程序
独立性,动态性,并发性

16 什么是并行?什么是串行?什么是并发? 

CPU:电脑的核心处理器,类似于“大脑”
串行:是指同一时刻一个CPU只能处理一件事,类似于单车道
并行:相对来说资源比较充足,多个CPU可以同时处理不同的多件事,类似于多车道
并发:相对来说资源比较紧缺,多个进程同时抢占公共资源,比如多个进程抢占一个CPU

17 什么是线程?线程与进程有什么关系? 

线程是OS能够进行运算调度的最小单位
一个进程可以拥有多个线程,当然,也可以只拥有一个线程,只有一个线程的进程被称作单线程程序
注意:每个线程也有自己独立的内存空间,当然也有一部分公共的空间用于保存共享的数据

在宏观上,一个CPU看似可以同时处理多件事
在微观上,一个CPU同一时刻只能处理一件事
结论:线程的执行具有随机性,我们控制不了,是由OS底层的算法来决定的

18 线程有几种状态?它们是怎么转换的? 

新建状态:new–申请PCB,进行资源的分配
就绪/可运行状态:万事俱备只欠CPU,其实是将创建好的线程对象加入到就绪队列中,等待OS选中,这个选择我们是控制不了的
执行/运行状态:就绪队列中的线程被OS选中了,正在执行
注意:只有就绪状态才能切换成执行状态
阻塞状态:线程在执行中遇到了问题:
锁阻塞、休眠阻塞、等待阻塞…问题解决后再加入到就绪队列中
终止状态:线程成功执行完毕,释放资源

线程的挂起:正在运行中的线程,由于CPU分配的时间片用完,所以需要保存当前线程运行的各项状态信息,直到CPU下次再在就绪队列中选中这个线程,恢复现场,继续执行这个线程

 19 设计模式

1、概念:是一些前人总结出来的值得学习的编程“套路”,设计模式一共有23种
2、单例设计模式:确保代码中本类的实例只有一个
3、实现思路:
方案一:饿汉式
1)把本类的构造方法私有化–为了不让外界调用构造函数来创建对象
2)通过本类的构造方法创建对象,并把这个对象也私有化,为了防止外界调用
3)提供公共的全局访问点向外界返回本类的唯一的一个对象
注意:公共方法需要设置成静态–需要跳过对象,通过类名直接调用这个返回本类对象的公共方法
对象也需要设置成静态的–这个对象需要在静态方法中被返回,而静态只能调用静态

方案二:懒汉式
==延迟加载的思想:==我们有的时候有些资源并不是需要第一时间就创建出来,所以需要延迟到需要时再创建
这样既可以提升性能,又可以节省资源
1)把本类的构造方法私有化–为了不让外界调用构造函数来创建对象
2)创建了一个本类类型的引用类型变量【这个变量后续用来保存创建出来的对象的地址值】
3)提供公共的全局访问点向外界返回本类的唯一的一个对象
注意:这个公共的方法里,需要做判断
如果引用类型的变量值为null,说明:之前没有创建过本类对象–创建后再赋值给引用类型变量,并把它返回
如果引用类型的变量值不为null,说明:
之前有创建过本类对象,这个引用类型变量保存就是地址值,本次不再新建对象,直接返回
这个只是一个开始,远远没有结束,大家还可以继续拓展:装饰者 建造者 工厂

 20 反射的概念

        反射是Java这门语言中比较有特点的一个特征,反射非常强大,我们可以通过反射获取目标类当中的资源,甚至是私有资源,不仅仅如此,我们甚至还可以使用资源,并且创建对象,所以反射是一个经常被使用到的技术,开发过程中,我们有的时候并不能拿到源代码,但是又需要使用资源,那这个时候反射的出现就很有必要了

 21 反射常用API

获取包名 类名
clazz.getPackage().getName()//包名
clazz.getSimpleName()//类名
clazz.getName()//完整类名

获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量
getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量
getField(变量名)
getDeclaredField(变量名)

获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法
getConstructors()//获取所有的公开的构造方法
getDeclaredConstructors()//获取所有的构造方法,包括私有
getDeclaredConstructor(int.class,String.class)

获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法
getMethod(方法名,参数类型列表)
getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法
getDeclaredMethod(方法名,int.class,String.class)

反射新建实例
clazz.newInstance();//执行无参构造创建对象
clazz.getConstructor(int.class,String.class)//要先获取构造方法
clazz.newInstance(666,”海绵宝宝”);//再执行含参构造创建对象

反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量
field.setAccessible(true);//使私有成员允许访问
field.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
field.get(实例);//访问指定实例变量的值,静态变量,第一参数给null

反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
m.setAccessible(true);//使私有方法允许被调用
m.invoke(实例,参数数据);//让指定实例来执行该方法

22 java基础总结 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lushao6688

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值