提示:java总结学习之路
提示:以下是本篇文章正文内容,下面案例可供参考
数组
什么是数组
- 数组就是将数据组装起来,不管里边有多少个都称为数组 即array 每一个组里边的数据类型都是相同的
数组的定义:
- 数据类型 [] 数组名 也可以 数据类型 数组名[]
- 二维数组 数据类型[][] 数组名 / 数据类型 数组名 [][]
- 二维数组在往上有更多的维度
数组的创建
- 数组类型[] 数组名 = new 数组类型[]{元素1,元素2, …n个};
- 数组类型[] 数组名 = {元素1,元素2, …n个};
- 数组类型[] 数组名 = new 数组类型[10]; 需要给数组的长度
数组的初始化
- 动态初始化:在创建数组时,直接指定数组中的长度/个数
- 列子: int [] arrays=new int[10]
- 静态初始化:在创建数组的时候不指定他的的长度,而是直接根据数组中的内容进行指定
- 列子: int [] arrays={1,2,3,4,5}
- 注意事项
- 静态初始化内存放的数据类型必须跟[]前数据类型一样
- 静态初始化,没指定长度,但是他会根据里边的元素个数指定长度
数组中的常见问题
- 索引越界异常:ArrayIndexOutOfBoundsException:当访问了数组中不存在的索引,就会引发索引越界异常。
- 空指针异常:NullPointerException:当引用数据类型的变量被赋值为 null 之后,就代表跟堆内存的连接被切断了,如果这时候还想去访问堆内存的数据,就会出现空指针异常。
二维数组介绍
- 二维数组是一种容器,该容器是用来存放一维数组
- 二维数组的初始化:
- int [] [] aays=new int[5][5] 表示:该二维数组可以存放5个一维数组,每一个一维数组可以存放5个元素
集合框架
-
数据思维思维导图
-
Conllection集合
- 集合的概念:放的是动态对象数组,集合框架用来存储喝操作不同类型的数组
conllection
List集合
ArrayList
- 底层原理:基于数组实现
- 扩容机制:默认大小是10也可以手动指定,超出容量时扩容50%,10->15,可以使用System.arraycopy()将数组赋值到新的数组上边
- 优缺点:
- 查询效率高,因为可以根据下表子啊O(1)复杂度查找数据
- 插入删除效率低,不管插入还是删除都需要更新索引
- ArrayLIst 是可以动态是数组,也就是数组的复杂版本,可以动态的添加或者删除
- ArrayList的长度是可变的
- ArrayList属于线程不安全,也不考虑线程同步,ArrayList擅长于随机访问.
LinkedList集合
- 底层机制:LinkedList集合是基于双向链表进行实现的
- 优缺点:插入和删除效率搞因为只需要改变节点的指向即可,查询的效率会变低,因为每次都会从头到尾的查询
- LinkedList属于线程不安全 也不考虑线程同步
Vector集合
- 底层机制:基于数组进行实现的
- 扩充机制 是每次扩充的两倍 10 -20
- 优缺点:
- 由于底层结构是一块连续的空间,所以可以支持下标’‘[]’'随机访问的形式。
- cpu高速缓存命中率高尾插尾删除效率高,相比list
- 越靠近头部位置插入效率越低
CopyOnWriteArraylist集合
- 底层机制:线程对其操作时赋值一个副本 对副本及逆行操作
- 优缺点:
- 线程安全 并且性能最优
- 读写分离 性能高 读写操作针对不同的容器 便利是修改 不会抛出异常
- 比较占内存,读写不是一个容器无法保证数据读取的实时性
Set集合
HashSet集合
- 底层原理: 基于HashMap实现 HashSet的元素就是HashMap的key value是静态对象
- HashSet:是非线程安全,这就意味这如果多个线程同时访问一个hashset实例并且至少有一个线程修改了集合,那么必须通过外部同步来确保对集合访问是安全的,在多线程环江下 可以考虑使用 Collections.synchronizedSet方法,该方法返回的是一个线程安全的set包装器
- HashSet属于无序集合,他的元素不以特定的顺序存储 如果需要特定的顺序可以考虑使用LinkedHashSet进行实现 他会保留插入的顺序
- HashSet优缺点:
- 不包含重复的元素,他是不允许有重复的元素的
- 快速查找,HashSet是基于哈希表进行实现的 查找 插入和删除操作的时间复杂度是常数级别的具有高效的性能
- 不适合基本数据类型
- 迭代效率比有序集合要慢一点
- HashSet是基于HashMap实现的 在内部它是由一个HashMap支持的 存储的元素也是以键值对的方式进行存储
ThreeSet集合
- 实现机制:它基于红黑树实现的有序集合,通过红黑树来进行存储元素,保持元素的自然顺序
- ThreeSet的优缺点
- 有序性:threeset是保持元素的有序性,可以根据元素的自然顺序并提供的比较器来进行排序
- 高效的查找 插入 和删除 :底层使用的是红黑树,基本的操作时间复杂度是O(log n)
- Treeset实现了NavigableSet接口,提供了一些有用的导航方法,获取小于或者等于给定元素的最大元素
- 内存消耗的比较搞,与哈希集合进行相比,红黑树的实现需要更多的内存空间
- 不是线程安全,在多线程的环境下 如果有一个线程修改了集合 而其他的线程需要同时访问这个集合,那么就得需要外部同步操作来确保操作的安全性
Queue集合
- ArrayDeque:可以用来做栈也可以做队列 双端队列
- priorityQueue:常用于实现堆数据结构
- 底层原理:二叉树 实现的形式是数组
Map
LinkedHashMap 集合
- 实现机制:他继承于HashMap类 与HashMap类不同的是 LinkedHashMap是通过双向链表来维护键值对的插入顺序或者是按照访问顺序
- 优缺点
- 与普通的hashMap进行想不,LinkedHashMap需要额外的链表结构,在内存上的消耗相对较高、
- 不属于线程安全
Hashtable集合
- 实现方式:Hashtable使用一个数组作为哈希表,通过哈希函数将键映射到数组的索引,解决冲突的方式是链地址法,在哈希表的每个位置维护一个链表,将具有相同哈希值的键值存储在一个链表上
- 优缺点:
- 线程安全,所有的操作基本上都是同步的,在多线程的环境中可以安全的使用,使用了synchronized互斥锁,全局锁,所以性能与吞吐量较低
- 稳定性比较号,是一个稳定和可靠的集合类
- 迭代器不支持修改,在迭代过程中如果要尝试修改Hashtable的结构则会抛出异常
- Hashtable在性能上相对比较差尤其是高并发的情况下
- 快速失败机制:在迭代过程中如果要尝试修改Hashtable的结构则会抛出异常,因为迭代器会维护一个modCount变量 集合被修改时modCount变量会被修改 每次hasNext()和next()都是会先去查看modCount是否会改变 如果没有改变则继续执行,改变就抛异常
TreeMap集合
- 底层原理:红黑树 根据key进行排序
- 红黑树是一种平衡二叉搜索树 它具有根节点都是黑色的 每个节点要么都是红色要么都是黑色
- 优缺点:
- 有序性,TreeMap保持了键的有序性
- 高效的查找 插入 删除,底层使用了红黑树
- 实现了NavigableSet接口,提供了一些有用的导航方法,获取小于或者等于给定元素的最大元素
- 与哈希表进行相比 红黑树需要更多的内存空间 所以他的内存消耗相对要高
- 不属于线程安全
ConcurrentHashMap集合
- 底层结构
- jdk1.7:segment数组+HashEntry数组,先通过hash定位到HashEntry在hash定位到具体的位置
- jdk1.8:使用的是红黑树跟Node 抛弃了segment并且将HashEntry改成了Node
- 优缺点:
- 线程安全:他是通过分割桶(buckets)和使用synchronized关键字来实现高效的并发访问
- 支持高并发的读写操作,比传统的HashMpa有着更好的性能,允许多个读操作并发进行,不会阻塞,而写的操作指挥锁定特定的桶,并不是整个集合,从而提高了并发性能
- 初始的容量的限制,过小的容量会导致桶的竞争增加,太大的容量会导致浪费内存
- 迭代器弱的一致性,迭代器可能不会捕捉到最新的修改,在迭代的过程中其他线程可能对映射进行修改
- 安全性
- jdk1.7:ReentrantLock+volatile
- ReentrantLock只锁住一个segment
- volatile修饰HashEntry保证可见性和有序性
- 尝试获取锁失败会自旋,知道获取成功,如果是一直获取不到则会进入阻塞 保证能够获取成功
- jdk1.8:synchronized+cas+volatile
- volatile保证了get时的可见性
- cas用于对hash桶第一个元素进行赋值
- synchronized 分段锁锁住整个hash桶 而不是这个map
- jdk1.7:ReentrantLock+volatile
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。