Java中常用数据结构和集合浅解

Spring+SpringMVC+Mybatis框架搭建所需jar包 立即下载
------数据结构:
是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

1.集合
数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;
2.线性结构
数据结构中的元素存在一对一的相互关系;
3.树形结构
数据结构中的元素存在一对多的相互关系;
4.图形结构
数据结构中的元素存在多对多的相互关系。

常用数据结构:数组、栈、队列、链表、树、图、堆、散列表

------简单介绍如下:

------数组:
数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
数组的特点是:
元素类型是固定的、长度是固定的、通过角标查询,查询快,增删慢。

------栈:
线性结构。就像是坐电梯,只有一个口,有顺序地进出,并且只能一端进与出,称为LIFO,先进后出或者后进先出,顾名思义就是先进去的就后出来,类似坐电梯,先进去的人会被后进去的人给不断的挤到后边去,此举称之为压栈。底层是用LinkedList来实现的。

------队列:
线性结构。就像是一条水管,有两端,有顺序地进出,并且只能一端进另一端出,称为FIFO,先进先出,顾名思义就是先进去的就先出来,如果你要删除,只能从出口端,一个一个的顺序删除,同理,要增加,也只能通过入口端顺序地添加进去。底层是用LinkedList来实现的。

------链表:
链表的类型有多种:单链表,双链表,有序链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

可以这样理解:
有一条街,小明住在街中一角,他有小红的地址,然后小红也是住在这条街,她有小花的地址,同样小花也有别人的地址。某天我想找小红玩,但是我不知道她住哪里,我可以问小明,就知道小红住在哪里了。那么小明小红小花这些人之间的关系就组成一个链表。


单链表:
就是小明只是右手握着小红的地址,他只有小红一个人的地址

双链表:
就是小明左手握着小白的地址,右手握着小红的地址,他有两个人的地址

循环链表:
就是小明握有小红的地址,小红握有小花的地址,而小花又握有小明的地址,这样就形成了一个循环

有序链表:
以某个标准,给链表的元素排序,比如比较内容大小、比较哈希值等

链表与数组比较:
优点:链表不需要确定长度大小,也不需要连续的内存空间,
缺点:由于不是连续的空间,所以查找元素比较吃力;相比数组只存储元素,链表的元素还要存储其它元素的地址,内存开销相对增大。

------二叉树:
这个...额...用语言描述有点词穷,还是看图比较清晰(下图盗自百度)

二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。二叉树常被用于实现二叉查找树和二叉堆。

遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。

二叉树的遍历大概分为四种,分别是前序遍历,中序遍历,后序遍历,按层遍历

以上图为例:
前序遍历:根-->左-->右(1-->2-->4-->5-->3-->6-->7 )
中序遍历:左-->根-->右(4-->2-->5-->1-->3-->6-->7)
后序遍历:左-->右-->根(4-->5-->2-->6-->7-->3-->1)
按层遍历:从上到下,从左到右(1-->2-->3-->4-->5-->6-->7)

二叉树与树的区别:
1、二叉树,顾名思义就是每个结点最多只有两个分支,可以有一个,但最多两个;树就没有这个规则,树的一个结点可以有不确定个分支
2、二叉树的结点有左右之分;树的结点没有左右之分

------哈希表:
百度百科这样说的:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

可以这样理解:(不太准确但是比较形象)
每个人都有自己的特征,获取这个特征的方法就叫哈希函数,一堆这样的特征被存起来就叫做哈希表

代表:
MD5、SHA-1
作用:
文件校验、数字签名
缺点:
哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。

----集合的体系:(根据api1.6继承或实现关系分类)

----常用集合:(从使用的角度分类)

几个接口的特点:
List接口(存储一组不唯一且按插入顺序排序的对象,可以操作索引)
Set接口(存储一组唯一且无序的对象)
Map接口(以键值对的形式存储元素,键是唯一的,也就是key)

1、如果元素可以重复,实现List接口
     1)需要查询快
          a)线程安全
                    Vector(由数组实现,访问元素的效率比较高,删除和添加元素效率低,因为要操作大量的元素)
          b)线程不安全
                    ArrayList(由数组实现,访问元素的效率比较高,删除和添加元素效率低,因为要操作大量的元素)
     2)需要增删快,
          a)线程不安全
                    LinkedList(由链表实现,插入、删除元素效率比较高,访问效率比较低)
2、如果元素需要唯一不重复,实现Set接口
     1)需要查询快,
          a)线程不安全
                    HashSet(由哈希表实现,使用了Hashtable。添加、查询、删除元素的效率都很高,缺点是元素无序。通过hashcode与equals方法确保元素的唯一)
                    TreeSet(由二叉树实现。查询效率高,且元素有序的。存放自定义类型的对象需要实现 Comparable接口,重写compareTo方法,提供对象排序的方式)
                    LinkedHashSet(由哈希表实现元素的存储,由链表实现元素的顺序。添加、查询、删除元素的效率都高,且元素是有序的)
                    
     2)需要排序,
          a)线程不安全
                    TreeSet
                   
3、通过键值对存取,实现map接口
     1)需要查询快,
          a)线程不安全
                    HashMap(由哈希表实现,使用了Hashtable。添加、查询、删除元素的效率都很高)
                    LinkedHashMap(由哈希表实现元素的存储,由链表实现元素的顺序。添加、查询、删除元素的效率都高,且元素是有序的)
                    TreeMap(由二叉树实现。查询效率高,且元素有序的。存放自定义类型的对象需要实现 Comparable接口,重写compareTo方法,提供对象排序的方式)
                    Hashtable( 类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法)

这几个也应该了解下:(提高写并发的处理能力,但是弱化了元素读取的一致性)

CopyOnWriteArrayList:http://ifeve.com/java-copy-on-write/
简单理解:多人在操作同一个容器时,每个人修改里面的元素时其实是复制出来一个新的容器 ,然后在新的容器上进行修改,修改完将新的容器赋给原来容器的引用,而这个过程中很多人在同步做读取的动作,但是他们读取的是旧的容器元素,新的内容他们未能取得,这样就读写分离了,不会产生冲突,但是新旧元素不能保持一致。
也可以这样粗糙的理解:我有一批旧的水果,又进了一批新的水果,你却在旧的水果堆里面挑水果来买。

词穷.....看上面贴的博客吧,讲得好详细

----收集的一些注意点:

序列化:
大部分的集合实现了序列化的接口,比如ArrayList


comparable、comparator、comparaTo的关系:

public class Test {
       public static void main(String[] args) {
             Man a = new Man(3);
             Man b = new Man(4);

             // Comparable是类自己的比较工具
             // Man实现了Comparable接口
             // 重写了compareTo方法,提供排序的标准
             // TreeSet根据要求对存储的元素进行排序
             TreeSet<Man> ts = new TreeSet<Man>();
             ts.add(a);
             ts.add(b);
             // 或者是自己使用自己的方法与同类对象进行比较
             int compare = a.compareTo(b);

             // Comparator是实现一个外部的工具
             // 这个是一个比较大小的工具
             // 比如比较乐观man之间的年龄大小
             CompareTool tool = new CompareTool();
             tool.compare(a, b);
       }
}

class Man implements Comparable<Man> {
       int age;

       public Man(int age) {
             this.age = age;
       }

       public int compareTo(Man arg0) {
             // 根据业务需求,编写排序的比较方式,比如年龄从大到小
             return 0;
       }
}

class CompareTool implements Comparator<Man> {

       public int compare(Man arg0, Man arg1) {
             // 根据业务需求,编写排序的比较方式,比如年龄的比较
             return 0;
       }
}



hashcode与equals:
HashSet、LinkedHashSet之类的集合,可以按业务需求重写hashcode与equals方法,判断对象的唯一性

public class Test {
       public static void main(String[] args) {
             HashSet<String> hs = new HashSet<String>() {
                    @Override
                    public int hashCode() {
                          // 按你的业务要求,重写hashCode方法
                          // 这里是获取对象的特征,用于判断是否有重复对象
                          return -1;
                    }

                    @Override
                    public boolean equals(Object arg0) {
                          // 按你的业务要求,重写equals方法
                          // 这里判断是否是同一个对象
                          return false;
                    }
             };
       }
}




迭代器:
顾名思义,就是获取元素的工具。集合里面的类一般都实现Iterable接口并重写Iterator方法,通过迭代器来操作元素
(List集合特有的迭代器 ,ListIterator ,解决并发修改集合的问题,并且提供了更多操作元素的方法 )

public class Test {
       public static void main(String[] args) {
             ArrayList<String> arr = new ArrayList<String>();
             // 获取迭代器
             Iterator it = arr.iterator();
             // 查询是否还有内容
             if (it.hasNext()) {
                    // 获取内容
                    String str = (String) it.next();
             }
             // list特有的迭代器,线程安全的
             ListIterator lit = arr.listIterator();
             if (lit.hasNext()) {
                    String str = (String) lit.next();
             }
             if (lit.hasPrevious()) {
                    String str = (String) lit.previous();
             }

             // set的迭代
             HashSet<String> hm = new HashSet<String>();
             Iterator ite = hm.iterator();
             if (it.hasNext()) {
                    String str = (String) it.next();
             }

             // map的迭代
             LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>();
             // 要先把map转换为set
             Set set = lhm.entrySet();
             Iterator sit = set.iterator();
             if (sit.hasNext()) {
                    // 获取内容
                    String str = (String) sit.next();
             }
       }
}


泛型:
集合是存储对象的,且都是Object,由于对象具有多态等特点,每次把元素取出肯定是需要向下转型,但是这个要转的类型并不确定,于是这个强转的过程就有出错的可能。那么为了解决这个问题,就需要用到泛型。使用泛型来规定这个集合只能存放某个类型的数据,就不需要关心强转的问题了。

public class Test {
       public static void main(String[] args) {
             // 创建一个list集合
             ArrayList arr = new ArrayList();
             // 添加元素
             arr.add("hello");
             // 获取元素时需要强转
             String hello = (String) arr.get(0);
             // 如果我强转成一个我自定义的people类,居然也是可以的,这就是潜在的危险
             People people = (People) arr.get(0);

             // 创建一个带泛型的list集合
             ArrayList<String> arr2 = new ArrayList<String>();
             // 添加元素
             arr2.add("hello");
             // 取出元素不需要强转
             String hello2 = arr2.get(0);
       }
}



----常见面试题:

集合与数组的比较:
数组不够灵活,集合提供了不同的类型来适应不同的场合。具体如下:
1 :数组能存放基本数据类型和对象,而集合类中只能存放对象。
2 :数组容量固定,集合类容量动态改变。
3 :数组无法判断其中实际存有多少元素, length 只告诉了数组的容量,而集合的 size() 可以确切知道元素的个数
4 :集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
5 :集合以类的形式存在,具有封装、继承、多态等类的特性,通过自定义可以满足各种复杂操作,提高开发效率

Collection 和 Collections 的区别:
Collection 是 集合的顶层接口
Collections是一个 专门用来操作集合的工具类,它提供了 搜索、排序、线程安全化等操作。

ArrayList 和 LinkedList 的联系和区别:
ArrayList由 数组实现,在内存中分配连续空间,遍历元素和随机访问元素效率比较高
LinkedList由 链表实现,插入、删除元素效率比较高

Vector 和 ArrayList 的联系和区别:
实现原理相同,功能相同,都是长度可变的数组结构,很多时候可以互用, 两者的主要区别如下
Vector 是早期的 JDK 接口, ArrayList 是用来替代 Vector 的
Vector 线程安全但低效, ArrayList 线程非安全但高效
长度需要增长时, Vector 默认增长1倍, ArrayList 增长 1.5倍

HashMap 和 Hashtable 的联系和区别:
实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用, 两者的主要区别如下:
Hashtable 是早期的 JDK 提供的接口, HashMap 是新版的 JDK 提供的接口
Hashtable 继承 Dictionary 类, HashMap 实现 Map 接口
Hashtable 是线程安全, HashMap 线程非安全
Hashtable 不允许 null 键和值 , , HashMap 允许 null 值


----摘自百度:(两幅图感觉列举得很形象)



原文转载自: http://blog.youkuaiyun.com/u013632854/article/details/70338252

spring+springmvc+mybatis搭建的一个系统附带mysql数据库 完整模板 spring+springmvc+mybatis搭建的一个系统附带mysql数据库, 里面包含两套不同风格的模版! 立即下载

相关推荐

java基于链表实现树结构(算法源码)

/* * 基于链表实现树结构 */ package dsa; public class TreeLinkedList implements Tree { private Object element;//树根节点 private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; parent = p; firstChild = c; nextSibling = s; } /*---------- Tree接口中各方法的实现 ----------*/ //返回当前节点中存放的对象 public Object getElem() { return element; } //将对象obj存入当前节点,并返回此前的内容 public Object setElem(Object obj) { Object bak = element; element = obj; return bak; } //返回当前节点的父节点;对于根节点,返回null public TreeLinkedList getParent() { return parent; } //返回当前节点的长子;若没有孩子,则返回null public TreeLinkedList getFirstChild() { return firstChild; } //返回当前节点的最大弟弟;若没有弟弟,则返回null public TreeLinkedList getNextSibling() { return nextSibling; } //返回当前节点后代元素的数目,即以当前节点为根的子树的规模 public int getSize() { int size = 1;//当前节点也是自己的后代 TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 size += subtree.getSize();//累加 subtree = subtree.getNextSibling();//所有孩子的后代数目 } return size;//即可得到当前节点的后代总数 } //返回当前节点的高度 public int getHeight() { int height = -1; TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 height = Math.max(height, subtree.getHeight());//在所有孩子中取最大高度 subtree = subtree.getNextSibling(); } return height+1;//即可得到当前节点的高度 } //返回当前节点的深度 public int getDepth() { int depth = 0; TreeLinkedList p = parent;//从父亲开始 while (null != p) {//依次 depth++; p = p.getParent();//访问各个真祖先 } return depth;//真祖先的数目,即为当前节点的深度 } }

数组、链表等常用数据结构和集合浅解(java)

数组、链表等常用数据结构和集合浅解(java)脑子转了一圈,巴拉巴拉的写了一大堆,本来今天步行者打骑士的比赛在上半场已经花了,步行者领先20多分,然而詹姆斯一个大大大号三双强行把比分拉回来还赢了比赛,留下36分的乔治在风中发呆。------数据结构:是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。1.集合数据结构中的元素之间除了“同属一个集合” 的相互关系...

iamzhuwh 1万+

java模拟实现数组链表树图等数据结构

自己写的一个小项目。用数组模拟实现java的数据结构,性能还行。和源码思路比较接近。可以看看,有助于初学者了解数据结构与算法。

JAVA基本数据结构——数组/链表/队列/栈/哈希表/集合/堆

一、动态数组ArrayList import java.util.ArrayList; import java.util.Collections; 初始化: ArrayList<Integer> list = new ArrayList<Integer>(); 添加元素: list.add(2); 利用Collections求最值 max = Collections.max(list); // min = Collections.min(list); 拷贝: .

上山的人 845

vivado生成及调用自定义IP的方法

开发环境:vivado 2018.2 1.将整个工程封装为自定义IP 将整个工程封装为自定义IP主要有以下步骤: 步骤1.选中工程中的top模块。点击Tools ------> Create and Package New IP,如图1所示 图1 步骤2.弹出界面后,点击next至图2界面,选择Package your current project,然后继续点击next 图2 步骤3.选择生成的IP路径,如图3所示。这个路径就是后续添加该IP的路径 图3 步骤4.继续点击next,然后选择fi

进击的阿日比 4730

Android 跨进程通信-(一)Binder概念引入

前言 主要对Android中的跨进程通信进行总结下,这篇先梳理下里面的涉及的一些概念 一 多进程 1.进程与线程 进程:系统中正在运行的一个应用程序,某个程序一旦运行就是一个进程,是资源分配的最小单位; 线程:程序执行的最小单位,包含在进程中,一个进程可以包含多个线程。 2.Android应用中的多进程 (1)dalivk虚拟机 Android系统的底层任务管理以及驱动都是基于Linux系统。一个Android系统其实就是一个Linux系统,通过adb shell进入连接的手机,就可以看到Li

nihaomabmt的专栏 1103

java list 数据结构_java数组、集合和数据结构知识*

一、数据结构知识。数据结构分为逻辑结构和物理结构,下面是百度百科的数据结构知识。元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关。逻辑结构包括:集合数据结构中的元素之间除了“同属一个集合” 的相互关系外,别无其他关系;数据结构中的元素存在一对一的相互关系;数据结构中的元素存在一对多的相互关系;数据结构中的元素存在多对多的相互关系。逻辑结构除...

weixin_35715490的博客 276

声品质粗糙度matlab,声品质的应用分析方法

声品质的应用分析方法2016-04-05 09:18:57阅读次数:14198摘要:声品质分析在噪声的主观评价方面已经得到越来越多的应用。本文比较了声品质分析与传统计权声级的区别,并介绍了在声品质分析的实际应用中,针对稳态信号、非稳态信号的几种不同分析方法,以及各分析方法的要求和特点。关键词:声品质,响度,尖锐度,粗糙度,波动度1前言传统评价噪声的方法主要为计权声压级,用以反映声音的大小。但是人耳...

weixin_30767323的博客 2438

Java学习总结--034集合Collection+List

1.集合的由来及集合继承体系图 A:集合的由来 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。 B:数组和集合的区别 (1): 长度区别: 数组的长度是固定的而集合的长度是可变的 (2): 存储数据类型的区别: 数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型 (3): 内容区别: 数组只能存储同种数据类型的元素 ...

web116629的博客 323

逆向工程实战:如何一步步破解京东APP的sign签名算法(附Frida脚本)

本文详细解析了京东APP的sign签名算法逆向工程实战,通过Frida脚本动态分析Java层和Native层的多层签名机制,揭示商业应用的加密协议设计。文章提供了完整的逆向工程方法论与工具链,帮助开发者深入理解移动应用安全防护体系,提升安全防御能力。

weixin_28622215的博客 918

高速设计注意事项总结——MDI篇

在以太网高速通信系统中,MDI(Medium Dependent Interface,介质相关接口)是连接物理层芯片(PHY)与传输介质(如网线)的关键接口,其设计直接影响信号完整性、传输速率和抗干扰能力。本文围绕 MDI 及 RJ45 接口电路、关键参数、设计与布线要点展开,为高速以太网设计提供参考。本文包含MDI 及 RJ45 接口电路组成、电路设计注意事项、布局布线要求等内容

qq_16237389的博客 1446

数据结构(集合和数组)

在使用JAVA的时候经常用到集合类(有时也称容器类),下面对常用的容器类进行一下总结。首先看一张图,了解一下集合类的结构以及他们之间的关系: 一、Collection接口 Collection接口是Set、List和Queue接口的父接口,提供了多数集合常用的方法声...

746

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 458

集合浅解

集合集合,见名知意,就是把某些东西放在一起。但是它不同于数组。简单的数据结构 数组:数组在内存中开辟了连续的内存空间,方便查找和修改 链表:链表是指在内存中开辟了每一块首尾相连地内存,尾部为null。其特点是方便增减。只需更换链接即可。代码如下: public class IOdemo1{ private int age; priate IOdemo1 io;

峰峰峰呀和桃子的故事 259

ABAP Channels 实战:在 ABAP 7.40 中用 WebSocket 打造实时双向通信

本文详细介绍了SAP ABAP 7.40引入的ABAP Channels通信框架,包含AMC(ABAP Messaging Channels)和APC(ABAP Push Channels)两部分。AMC作为应用服务器内部的消息总线,支持发布/订阅模式,可实现跨会话实时通信;APC基于WebSocket协议,用于浏览器等客户端与ABAP服务器的双向实时交互。文章通过一个乒乓球游戏案例展示了ABAP Channels的实时协作能力,并详细解析了AMC的配置方法、消息发送与接收的代码实现,帮助开发者理解如何利用

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 221

【二.图像处理核心技术】【5.形态学操作:腐蚀/膨胀/开闭运算】

想象一下,你拍了一张布满雪花点的老照片,或者扫描了字迹断裂的文档,这时候形态学操作就是你的像素整形师!它们能让模糊的边界变清晰,把断裂的笔画连起来,甚至从X光片里揪出癌细胞。今天我们要聊的,是计算机视觉界的"广场舞双雄"——腐蚀和膨胀。这俩操作就像给像素点们请了个健身教练,要么集体减肥(腐蚀),要么组团增肌(膨胀)。下次当你用美颜相机时,不妨会心一笑——这看似魔法的背后,正是形态学在默默耕耘。腐蚀的规则很简单:如果一个像素点周围的邻居不全白,它就"狗带"(变黑)。:先用砂纸打磨(腐蚀),再喷漆填补(膨胀)

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 426

Redis浅解

Redis 1、NoSQL数据库概述 NoSQL(NoSQL = Not Only SQL),意即“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 不遵循SQL标准。 不支持ACID。 远超于SQL的性能。 NoSQL适用场景 对数据高并发的读写 海量数据的读写 对数据高可扩展性的 NoSQL不适用场景 需要事务支持 基于sql的结构化查询存储,处理复杂的关系,需要条件查询 什么时候用NoSQL

qq_42985642的博客 313

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JAVA容器概论

JAVA容器概论

m0_63164811的博客 219

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Hashmap浅解

集合 集合分为Collection和map collection中包含list,set,queue。 map有Treemap和Hashmap。 Hashmap hashmap是一种数组加链表的结构 用value和key来存储标记。map使用了一种将key映射到值的对象。 特点 1.存储:位置index=key.hashcode%map.length hashcode方法确保每个key的code值唯一。 具有相同index的对象存在已有的对象next位置,1.6使用头插法,1.8中使用尾插法 2取值:用同样

qq_44832130的博客 133

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mongodb浅解

1.数据库概念: 数据库:数据存储的仓库 数据库就是为我们方便的管理数据的一个平台,例如对数据的存储、修改、查询等都非常的方便。2.数据库分类 数据库产品有很多,以下是一些常见的数据库产品: •MySQL •Oracle •DB2 •SqlServer •MongoDB数据库没有排名之分,各有各的应用场景,我们这里学习的

haoziyang007的博客 529

java基础 Map补充LinkedHashMap,TreeMap,以及Properties类,Set。

因为前面讲hashMap的源码,发现太长了,所以本章作为补充,毕竟Map的接口下还有其他常用的实现类,所以本篇是讲LinkedHashMap还有TreeMap,以及Properties类。 LinkedHashMap 看名知其意,也是一个链表结构,而链表结构的原理前面说过,在讲解List接口中的时候已经说过,如果对于这个有点不了解可以看。java基础 浅解list集合中ArrayList与LinkedList 老规矩,先看代码,然后进行讲解(jdk1.8)。 public class LinkedHlash

u011863822的博客 258
上一篇: 谈Spring事务隔离级别
下一篇: 几种常见排序算法的分析
南哥220
博客等级 码龄9年 2粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值