day015

Collection接口
集合层次根接口

List接口(其特有方法都是与下标有关的)
List集合是有下标的
List集合是有顺序的
List集合可以存放重复的数据

Map接口

				<collection所有方法>
				以下collection即集合
					↓ 

boolean add(E e) //将指定元素添加到集合中
确保此 collection 包含指定的元素(可选操作)。

boolean addAll(Collection<? extends E> c) //<? extends E>–<>将c集合中所有的元素加到本集合中
将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

void clear()
移除此 collection 中的所有元素(可选操作)。

boolean contains(Object o)
如果此 collection 包含指定的元素,则返回 true。

boolean containsAll(Collection<?> c)
如果此 collection 包含指定 collection 中的所有元素,则返回 true。

boolean equals(Object o) //比较集合对象与参数对象o是否相等,参数对象为集合才有意义
比较此 collection 与指定对象是否相等。

int hashCode()
返回此 collection 的哈希码值。

boolean isEmpty()
如果此 collection 不包含元素,则返回 true。

Iterator iterator()
返回在此 collection 的元素上进行迭代的迭代器。

boolean remove(Object o)
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

boolean removeAll(Collection<?> c) //移除本集合中属于参数集合c的所有元素
移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

boolean retainAll(Collection<?> c) //<>表示泛型,传啥都行.保留本集合与参数集合C的公共元素
仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。

int size()
返回此 collection 中的元素数。

Object[] toArray()
返回包含此 collection 中所有元素的数组。

T[]
toArray(T[] a)
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

				<List特有方法>
			             ↓ 

void add(int index, E element)
在列表的指定位置插入指定元素(可选操作)。

boolean addAll(int index, Collection<? extends E> c)
将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。

int indexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。

int lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。

E get(int index)
返回列表中指定位置的元素。

E set(int index, E element)
用指定元素替换列表中指定位置的元素(可选操作)。

Iterator iterator()
返回按适当顺序在列表的元素上进行迭代的迭代器。

E remove(int index)
移除列表中指定位置的元素(可选操作)。

List subList(int fromIndex, int toIndex) //截取子集合,含头不含尾
返回列表中指定的 fromIndex(包括)和 toIndex(不包括)之间的部分视图。

ListIterator listIterator(int index) //不常用,但可逆序迭代
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。

			<Map特有方法>(Entry--键值对)

简单方法:

void clear() 清空集合

boolean equals(Object o) 判断集合对象与参数o是否相等

int hashCode() 返回本集合的哈希码值

boolean isEmpty() 判断集合是否为空

int size() 返回本集合中键值对的个数

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集合的所有映射关系(键值对)

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集合

3.List接口的两个常用实现类

ArrayList的特点:
底层的数据结构是数组,内存空间是连续的
元素有下标,通常可以根据下标进行操作
增删操作比较慢,查询操作比较快【数据量大时】

LinkedList的特点:
底层的数据结构是链表,内存空间是不连续的
元素有下标,但是通常首尾节点操作比较多
增删操作比较快,查询操作比较慢【数据量大时】
注意:LinkedList查询慢也不是都慢,首尾操作还是比较快的

#################################################################

map中的value可以重复,所以 拿Entry的key去求哈希,结果对数组长度取余

数组的扩容 与 链表无关

链表长度>8时,链表会转成红黑树(左小右大,自平衡二叉查找树)

所以HashMap数组中 可能 会同时 存在 单个元素+链表+红黑树

加载因子:数组存到什么程度才自动扩容
HashMap源码中的加载因子static final float DEFAULT_LOAD_FACTOR = 0.75f;
0.75—存了3/4再扩容

加载因子是表示Hsah表中元素的填满的程度。

加载因子越大,填满的元素越多,空间利用率越高,但冲突的机会加大了。

反之,加载因子越小,填满的元素越少,冲突的机会减小,但空间浪费多了。

冲突的机会越大,则查找的成本越高。反之,查找的成本越小。

因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷。

#################################################################

set接口

Set是一个不包含重复数据的Collection
Set集合中的数据是无序的(因为Set集合没有下标)
Set集合中的元素不可以重复 – 常用来给数据去重

Set集合的特点
数据无序且数据不允许重复
HashSet : 底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
TreeSet : 底层是TreeMap,也是红黑树的形式,便于查找数据

1.set集合没有重复浮点元素
2.无序
3.可以存一个null
4.我们自定义对象如果想去重,需要在自定义类中添加重写的equals()与hashcode()

集合学习的方法:
学习父级的公共方法,学习子类的创建方式,学习各种集合的特点
1.关于List大都是与下标有关的操作
2.关于Set通常都是去重的操作
3.关于map通过都是映射关系
4.API要常练习,方法互相之间没有任何关系,用哪个,查哪个.

#################################################################

IO流-序列化

集合

进程-线程

组合,互不干扰

#################################################################

					<进程>

每个进程都有自己独立的运行空间,互不影响

1.1 进程的概念

进程就是正在运行的程序,它代表了程序所占用的内存区域

1.2 进程的特点

独立性
进程是系统中独立存在的实体,它可以拥有自己独立的资源,每个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间
动态性
进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合,程序加入了时间的概念以后,称为进程,具有自己的生命周期和各种不同的状态,这些概念都是程序所不具备的.
并发性
多个进程可以在单个处理器CPU上并发执行,多个进程之间不会互相影响.

±–+<–谷歌
|cpu|<–QQ
±–+<–百度

高并发:多个进程强占公共资源

±–+
|cpu|<–谷歌
±–+

±–+
|cpu|<–QQ
±–+

±–+
|cpu|<–百度
±–+
并行:多个cpu同时处理不同的进程

HA(High Availability)高可用:指在高并发的情景中,尽可能的保证程序的可用性,减少系统不能提供服务的时间

(当你在高并发的环境中,尽量保持不崩溃,即使奔溃了也能尽快恢复)

							<线程>

2.1 线程的概念
线程是操作系统OS能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位
一个进程可以开启多个线程,其中有一个主线程来调用本进程中的其他线程
我们看到的进程的切换,切换的也是不同进程的主线程
多线程扩展了多进程的概念,使的同一个进程可以同时并发处理多个任务

(IDEA中打开多个界面)(QQ中打开多个聊天窗口)

2.2 进程与线程的关系
一个操作系统中可以有多个进程,一个进程中可以包含一个线程(单线程程序),也可以包含多个线程(多线程程序)

宏观层面上,所有的进程/线程看似同时运行,
但是微观层面上,同一时刻,一个CPU只能处理一件事.切换的速度甚至是纳秒级别的,非常快

CPU分时调度

时间片,即CPU分配给各个线程的一个时间段,称作它的时间片,即该线程被允许运行的时间.

如果在时间片用完时线程还在执行,那CPU将被剥夺并分配给另一个线程,将当前线程挂起.

如果线程在时间片用完之前阻塞或结束,则CPU当即进行切换,从而避免CPU资源浪费,当再次切换到之前挂起的线程,
恢复现场,继续执行。

OS执行线程的规则(OS自行选择):

FCFS(First Come First Service 先来先服务算法)

SJS(Short Job Service短服务算法)

*(哲学家/银行家算法)

3.3 线程的状态
线程状态比较复杂,由易到难,先学习线程的三种基础状态及其转换,简称”三态模型” :

就绪(可运行)状态:线程已经准备好运行,只要获得CPU,就可立即执行

执行(运行)状态:线程已经获得CPU,其程序正在运行的状态

阻塞状态:正在运行的线程由于某些事件(I/O请求等)暂时无法执行的状态,即线程执行阻塞

			    【就绪】
				      ↖时间片完
							
		   I/O完成↗          线程调度↘
			

	【阻塞】      <-    (I/O阻塞)    -     【执行】    -  (终止) ->

就绪 → 执行:为就绪线程分配CPU即可变为执行状态"

执行 → 就绪:正在执行的线程由于时间片用完被剥夺CPU暂停执行,就变为就绪状态

执行 → 阻塞:由于发生某事件,使正在执行的线程受阻,无法执行,则由执行变为阻塞

(例如线程正在访问临界资源,而资源正在被其他线程访问)
反之,如果获得了之前需要的资源,则由阻塞变为就绪状态,等待分配CPU再次执行

再添加两种状态:

创建状态:线程的创建比较复杂,需要先申请PCB(进程控制块),然后为该线程运行分配必须的资源,
并将该线程转为就绪状态插入到就绪队列中

终止状态:等待OS进行善后处理,最后将PCB清零,并将PCB返回给系统


     【创建】         ->          【就绪】
				      	↖时间片完
							
		   I/O完成↗          线程调度↘
			

	【阻塞】      <-    (I/O阻塞)    -     【执行】    -  (终止) -> 【终止】

######################################################################

多线程实现的方案一:继承
1.自定义一个类extends Thread
2.重写run()里面写业务
3.创建线程对象
4.调用start()
注意:可以通过调用父类Tread的含参构造Thread(String name)
给自定义线程对象起名字,调用方式:super(name)

多线程实现的方案二:实现
1.自定义一个类implements Runnable
2.实现接口中未实现的run()
3.打印线程名称:Thread.currentThread().getName()
4.创建目标业务对象----接口实现类的对象–包含的是我们的业务
5.创建线程对象—Thread t1 = new Thread(targert);
目的:为了把实现类与Thread建立关系,原因是想用Thread的start()
6.通过线程对象调用start(),把线程对象加入就绪队列

Runnable比继承 难 在于总是要绕一步

方案二:
降低耦合性
任务发布效率高

#################################################################

HashMap HashSet

实现了Map接口 实现Set接口

存储键值对 仅存储对象

调用put()向map中添加元素
调用add()方法向Set中添加元素

HashMap使用键(Key)计算Hashcode
HashSet使用成员对象来计算hashcode值,

HashMap相对于HashSet较快,因为它是使用唯一的键获取对象
HashSet较HashMap来说比较慢

#################################################################

集合类对象.iterator()
返回在此集合的元素上进行迭代的迭代器。

class MyRunnable implements Runnable

MyRunnable:接口Runnable的实现类

Thread t1 = new Thread(target);

线程类的一个含参构造就是接收MyRunnable实现类对象的

因为接口不能创建对象
所以 传 接口 的实现子类

##############################################################################

		+----------------------------------------+

	       集合  结束		 

		+----------------------------------------+				

##############################################################################

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值