- 博客(61)
- 资源 (17)
- 问答 (2)
- 收藏
- 关注

原创 Java基础github
最近在一直研究WebRTC开源项目Kurento-Room,初步研究的差不多了。也写了一些文档,等时机成熟我再分享出来!由于自己JAVA基础较为薄弱,所以特地学习和编写了一些例程,涉及JAVA基础和数据结构,正在Github上更新,希望大家多交流!1、java基础例程,参考毕向东视频教程 (https://github.com/Shuo-Jia/JavaSample) 2、java数据结构与算法
2017-06-23 18:00:44
762
原创 史上最全最简单的C++、JAVA面试合集
OFFER面试指南包含程序员常见的面试考题,涵盖C++、JAVA、操作系统、算法等丰富的面试资料。所有资料将同步更新到微信小程序,同时,微信小程序也包含各大互联网公司、排行榜,欢迎关注使用。...
2022-08-07 22:27:24
416
原创 JAVA面试指南,这个就够了
最近手残,搞了个公众号,主要闲暇时间随便聊一些程序圈的一些事,也会分享一些技术面试的资料,感兴趣的可以关注一波。关注后,后台发送 面试指南,可以获取2021最新JAVA面试总结,基本看完后,JAVA八股文这些应该不在话下了。...
2021-09-07 18:54:25
234
原创 深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成
今天开始谈论一些JVM虚拟机的知识。其实在前面叙述中多多少少已经附带提起了JVM相关的知识,如类加载、多线程相关的底层机制、方法调用、泛型的机制等等,但是实际上JVM知识会有很多,今天就把比较重要的其他一些知识再拿出来理一理。首先要讲的也是非常基础的就是JVM的内存组成: JVM的内存被划分5个区域: 堆区、方法区——这两个区域的数据共享 虚拟机栈、本地方法栈、程序计数器——...
2018-05-14 10:22:09
18463
5
原创 Tomcat多线程模型浅析
我们在上一部分文章里已经看到了,Tomcat的架构是如何一步步构建出来,但是在后台服务器的构建中,一个很重要的问题是如何实现多线程?一般情况下,如果我们来实现最初步的想法就是:不断循环接收客户端的连接,每个连接构建一个线程,然后进行相关的数据处理!但是,实际上我们应该考虑的更多,比如如何选用BIO还是NIO等等?所以,我们来借鉴一下Tomcat的多线程设计思路!首先Tomcat的设计了...
2018-05-13 19:00:14
8080
原创 深入理解系列之JAVA多线程(3)——volatile原理
我们在上一篇文章讲到,synchronized关键字保证了代码同步性,同时有利于实现程序的安全性,但是同时也带来性能下降的弊端!所以,如果不是必要的我们应该避免使用synchronized关键字,在一些情况下可以采用其他方式作为替代!其中之一就是volatile。1、什么是缓存一致性?关于缓存一致性,我在第一章就简要的介绍过。缓存一致性的出现是因为计算机内存模型导致的:为了解决...
2018-05-09 18:49:04
468
2
原创 深入理解系列之JAVA多线程(2)——synchronized同步原理
多线程中为了解决线程安全问题,一个重要的手段就是同步!所谓同步其实就是使得原本各个线程交叉执行(异步),变成排队执行(同步)。同步策略使得不同线程操作共享数据遵循“先来后到“,从而避免某个线程没有处理完数据就被另一线程抢占操作出现数据被覆盖或者脏读的情况。其中同步最常用的手段就是synchronized关键字!1、synchronized有哪些主要用法?有什么区别?synchr...
2018-05-09 11:34:24
543
原创 Tomcat架构浅析
Tomcat服务器作为目前比较流行的一种服务器容器已经被广泛用于后台服务器的搭建、后台集成框架的嵌入(如SpringBoot),不同于Apache、Nginx本身(注意是本身,其实可以搭配后台脚本实现动态网页)仅仅支持静态网页,由于Tomcat其实是一种Servlet规范的实现,而Servlet又支持JSP,所以Tomcat实际上是完美支持动态页面的渲染的。了解Tomcat的工作原理,有助于...
2018-05-08 16:21:01
630
1
原创 深入理解系列之JAVA多线程(1)——概念与原理机制
现代操作系统都支持多任务的处理,所以为了提高JAVA程序运行的效率,JAVA在虚拟机层面采用了多线程机制,即“同时”运行多个逻辑代码!问题一、线程和进程的区别是什么?在操作系统层面,我们听到最多的就是“进程”的概念,即在日常操作系统使用中,我们认为每个软件就是一个进程,线程被称作“轻量级的进程“,我们通常用以下三句话(或表达同类意思的语句)来阐述他们之间的关系:1)、进程是...
2018-04-30 17:44:19
559
原创 深入理解系列之JAVA多态机制(重载/重写)
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态(来自百度百科)。所以,按照这个意思其实多态的“主题”是对象,但是实际在我们运用中我们常把“重载”和“重写”称之为“多态”其实这是不严谨的!重载和重写只是多态的存在带来的两种应用表现形式,也就是说正是因为重载和重写我们才看到了多态的“威力”。所以,当我们谈论多态实现机制的时候其实就...
2018-04-25 16:21:49
581
原创 NIO入门实例-写一个客户端/服务器例程
注:该文章实际为《java网络编程》例11-1和例11-2的源码勘误!原例程经过实际测试并不能实现期望的功能,在分析代码逻辑后勘误如下!在勘误之前贴出书中原始例程(仅服务器有误):package org.nioTest;import sun.rmi.runtime.Log;import java.io.IOException;import java.net.InetSocke...
2018-04-23 23:07:41
558
原创 深入理解系列之JAVA泛型机制
泛型是指在声明(类,方法,属性)的时候采用一个“标志符”来代替,而只有在调用的时候才传入真正的类型,我们最常见的泛型实例就是前面讲述的集合类,集合类在声明的时候都是通过泛型方式来声明的,只有在调用(实例化)时我们才确定传入的是Integer亦或是String等等!注:本文着重叙述泛型实现的原理,而忽略一些泛型应用时的注意事项,详细应用时的注意事项请参看其他博文问题一、为什么要采...
2018-04-20 11:47:26
464
原创 WebRTC自适应控制算法
该文章系总结性文章,主要参考一下文章: 1、webrtc视频jitterbuffer原理机制(描述版) - 简书 http://www.jianshu.com/p/bd10d60cebcd 2、WebRTC视频接收缓冲区基于KalmanFilter的延迟模型 - 简书 http://www.jianshu.com/p/bb34995c549a 3、WebRTC基于GCC的拥塞控制(上) ...
2018-04-19 11:31:25
2121
原创 通过python抓取博客信息
最近写博客,忽然想知道自己的博客阅读量的趋势都是怎么样的,无奈优快云并不提供这个功能。本来是想偶尔的手动查看,记录到excel表格中然后一段时间后就能知道大概了,但是作为程序员能够交个程序自动执行的就不要采用这种原始的办法了,上网一搜果然有和我一样“无聊的”想做这个统计的,再加上最近学习python,所以就决定写个python爬虫脚本来抓取这些信息!(无奈python水平太弱,对于python中...
2018-04-19 11:07:18
495
原创 深入理解系列之JAVA数据结构(5)——String
String类型是Java编程中最为常见的数据结构(没有之一),与之相关联的还有StringBuilder和StringBuffer。其中String类型是不可变的;后者均是可变的字符串,但是StringBuilder是线程不安全的,StringBuffer线程安全;所以三者的效率排名为:StringBuilder>String>StringBuffer。另外,为了优化字符串的使...
2018-04-17 21:04:21
5765
5
原创 深入理解系列之JAVA反射机制
反射是指,程序运行期间,对于任意一个类,都能够知道这个类的所有属性和方法,且都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。问题一、反射机制的理论基础是什么?如前言所属,基本每个java程序员都知道反射的概念和作用,但是为什么java可以支持反射?为什么C/C++就没有呢?其实,java之所以能够实现反射其根本的理论基...
2018-04-17 09:54:00
498
原创 深入理解系列之JAVA动态代理机制
代理的作用,就是生成代理对象使得真实对象的某些方法执行被代理对象拦截,从而在真实方法执行前、执行后添加额外的“动作”!动态代理则是指不需要修改原来的对象方法,在程序运行的过程中动态的生成代理对象,从而动态的生成这些“额外的”动作,主要从两个方面来深入理解动态代理机制!问题一、动态代理的基本实现是什么?动态代理本质上还是java中的“代理设计模式”,所以启UML图如下所示 ...
2018-04-15 22:12:28
745
原创 深入理解系列之JAVA数据结构(4)——Hashtable
1、Hashtable和HashMap,从存储结构和实现来讲基本上都是相同的, Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类,但二者都实现了Map接口。 2、它和HashMap的最大的不同是它是线程安全的,另外它不允许key和value为null。 3、Hashtable是个过时的集合类,不建议在新代码中使用,不需要线程安全...
2018-04-07 13:00:23
388
原创 深入理解系列之JAVA数据结构(3)——HashMap
1、 HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable大致相同) 2、此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 3、 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collectio...
2018-04-06 23:46:01
576
原创 深入理解系列之JAVA数据结构(2)——LinkedList
1、LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 2、LinkedList相对于ArrayList来说,是可以快速添加,删除元素,ArrayList添加删除元素的话需移动数组元素,可能还需要考虑到扩容数组长度。 3、 LinkedList 实现 List 接口,能对它进行队列操作。 Link...
2018-04-06 17:00:50
275
原创 深入理解系列之JAVA数据结构(1)——ArrayList
1、 ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。提供了相关的添加、删除、修改、遍历等功能。 2、ArrayList实现了RandmoAccess接口,即提供了随机访问功能。在ArrayList中,我们即可以通过元素的序号快速获取元素对象,这就是快速随机访问。ArrayList实现了Cloneable接口,即覆盖了函数clone(),能...
2018-04-06 15:49:41
482
原创 常用查找算法原理总结
一、静态查找表1、顺序查找表:设置界(0~n),然后从头比到尾,有则返回! 顺序查找表plus:把原来的界(0~n)改为设置哨兵R[0]或者R[n],当比较到R[0](从后往前比)或者R[n](从前往后比)还没有相等的时候,就是没有!否则,有则返回!这样省略了每次都要判断是否到了界点的步骤! 2、有序查找表:“最基本”的是折半查找!首先和R[m]=R[(0+n)/2]比较,如果
2018-01-06 21:23:21
616
原创 常用排序算法原理总结
前面有篇文章总结了性能,同时强调了算法原理才是最重要的,仅仅记住一些性能指标的数据,是没有用的。这篇文章主要以较“精炼简单”但是又“详细啰嗦”的语言来描述算法实现的细节过程!注意:可能不适合初学者看,初学者应该先看算法书籍以及实现的源码,然后再参考下文叙述来帮助理解算法实际的原理!本篇没有实例代码,请参看《大话数据结构》的C源码和个人的github的java源码链接!(《大话数据结构》java语言
2018-01-05 15:57:01
473
原创 常用查找、排序算法的性能总结
话说这些性能总结也就对考试(例如考研、面试刷题)有用,算法最终的目的还是理解和运用,所以大家看看看看一下就行了,最终还是靠理解为主! 一、查找算法 其中二叉树查找的标红的性能有待考究;哈希查找的查找长度网上也有,看起来太复杂(哈希表(等概率情况下)查找成功与查找不成功的平均查找长度) 二、排序算法 其中“初始序列”指复杂度是否和初始序列有关,其实如果发现最好最差平均复杂度一样,就是...
2018-01-04 17:02:01
1798
原创 KMP字符串匹配
我们假设有上图字符串S:abcaab和T:abcababcaabab字符匹配需求,左边是朴素算法:即从T的第0位和分别和S的1~n位开始比较,相同则用黄色标注,不同则用红色标注,如果遇到不同,然后T的第0位和下一位开始重新来过开始第二轮比较。但是,在这个比较的过程中,我们会发现两种情况: 1. 0~3位分别相同,即T[0]=S[0],T[1]=S[1],T[2]=S[2]...
2017-07-13 16:43:44
663
原创 数据链路层概述
数据链路层主要的通信信道包括点对点信道和广播信道。点对点信道针对的是任意两台主机间的通信方式,而广播信道是指局域网间众多主机通信的的处理方式。 在点对点通信中,主机间需要通过“封装成帧”来界定数据的起始,需要使用填充技术区分和处理“透明传输”中的无效界定符,最终需要“差错检测”技术中的“CRC”校验来提高数据传输的正确率。而完成这一些列操纵的重要协议即为“PPP协议”。而PPP协议又包括链路控制协...
2017-01-12 20:10:22
790
原创 NAT转换
距离上一次总结“路由原理”已经十多天了,之所以是拖这么长,是因为期间在通过Socket编程运用“NET转换原理”的时候出现了一些障碍,至今没有完全解决!不管怎样我们还是先总结一下吧!首先必须来了解一下何为“NAT转换”!“NAT转换”存在的最直接的意义就是解决了IP地址不够用的现状。“局外人”会认为日常生活中我们每台电脑所用的IP地址是唯一的,因为只有这样才不会产生不必要的“冲突”。其实这是不准确的
2017-01-12 19:36:13
1460
1
原创 (6)Kurento之系统搭建IV-Helloworld
此示例,基于helloworld-demo。其余所有搭建方法均与此相同。 1、DEMO搭建git clone https://github.com/Kurento/kurento-tutorial-java.git cd kurento-tutorial-java/kurento-hello-world git checkout 6.6.0 mvn compile exec:jav...
2017-01-12 12:12:03
2743
1
原创 (5)Kurento之系统搭建III-运行环境/工具
接下来我们需要搭建信令服务器,以测试KMS服务器是否正常工作。在Kurento中,信令服务器准确的说叫“应用服务器”,因为除了提供WebRTC基础的信令交互外,还通过与KMS交互来创建相应的媒体功能。比如:需要录制功能。那我的“应用服务器”就需要发起“创建录制功能”的信令。在官网上,应用服务器的功能被定义为:1.配置媒体处理逻辑: 在应用程序中,这个部分配置了Kurento如何来处理媒体。...
2017-01-12 12:04:44
2397
1
原创 (4)Kurento之系统搭建II-Coturn
上一篇讲到配置stun/turn服务器。这里我们自己搭建一个属于自己stun/turn服务器。此服务器能够成功使用的先决条件即必须使用的一端能够访问到此服务器所在的主机。所以一般情况一定要具备“公网”环境!一般情况下申请的云主机都会提供公网环境,即使像上文那样,主机在NAT之后!好了,确定号网络环境后,开始搭建。首先下载安装包:http://turnserver.open-sys.org/do...
2017-01-12 11:54:57
4074
2
原创 (3)Kurento之系统搭建I-KMS6.0
首先,要搭建的自然是KMS。注意:KMS必须安装在Ubuntu 14.04 LTS 64位上!按照官网文档:echo "deb http://ubuntu.kurento.org trusty kms6" | sudo tee /etc/apt/sources.list.d/kurento.list wget -O - http://ubuntu.kurento.org/kurento....
2017-01-12 10:36:18
5089
2
原创 (2)Kurento之KMS通信架构
根据项目需求及Kurento协议,设计如下架构:这个看起来貌似很复杂,但其实只是WebRTC的拓展而已,即中间加入第三方进行通信,所以任意一端和KMS实际上组成了原始的WebRTC架构。你可以只看左边或者右边的通信架构,即发现其实本质上一样的。在Kurento通信架构中,KMS和每个客户端(图中的Android和PC-Browser)组成了一个“通信对端”,视频数据首先经过KMS,然后在转...
2017-01-12 10:30:43
3823
2
原创 (1)Kurento之WebRTC通信架构
关于WebRTC网上有好多介绍,这里我就不详细的叙述了。重点放在WebRTC的项目实施过程,涉及后续开发,将会有详细介绍。 WebRTC是由谷歌提出的一套基于UDP协议的网页流媒体协议。有以下几个特点: 1、网页间直接通信。即不需要安装任何插件,通过网页前端的JS程序,即可构建两端的通信。 2、NAT穿透。不需要中间流媒体服务器进行中转流媒体数据,通过NAT穿透协议ICE框架,即可实...
2017-01-12 09:51:51
5403
原创 ADT的栈的实现
ADT,称为抽象数据类型。所谓抽象数据类型,即定义一种数据形式,并封装该数据的操作方法。 参考链接: http://blog.youkuaiyun.com/qscool1987/article/details/7179791, 这里我们在C++中实现一种“栈”的抽象数据类型。首先介绍一下栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相
2017-01-10 21:50:51
2336
原创 运算符重载典例:Vector-维克多
我们在上一节介绍了关于重载和友元的概念和用法!这篇文章重点介绍运算符重载的一些实例。 上篇我们已经说了,运算符重载相当于赋予运算符”拓展功能”。所以并不局限于“加减乘除”等。我们在C++中,使用打印函数时,常常用count<<来表示,但我们也知道<<,也可以表示“移位”!这里其实就是对<<做了“运算符重载”!我们也知道,当要输出类Time对象coding的hours,minutes值时,我们必
2017-01-10 21:39:50
2839
原创 重载/友元
重载分为函数重载和运算符重载!重载本身的概念在C++中通俗含义是:相同的某个元素表达不同的意思!我们首先来看函数重载。函数重载 函数重载本身时比较简单明了的,即定义同一个函数名称,通过设置不同的传入参数来使之成为不同的函数!如下所示: Time(); Time(int h, int m = 0);在类声明中声明同一个函数名称Time(注意,这是个特殊的函数,我们称之为构造函数,即创建对象时,将自
2017-01-10 20:53:15
562
原创 类/指针/函数/this
这几个元素加一块,如果对其不是很理解,怕是看不懂源码。我们首先看三段代码:1、定义:#ifndef STOCK_H_#define STOCK_H_ #include"stdafx.h"#include class Stock{private: std::string company; int shares; double sh
2016-12-13 15:16:22
825
原创 netstat命令输出结果分析
netstat命令一般用来查看IP/Port占用情况,在网络程序员那里就可以用于检测数据发送/接收的端口是否正确。比如最近在做“视频实时传输”项目时就是用它发现问题的。所以有必要看懂netstat命令输出结果的含义,下面给出三个典型的结果:说明:Tserver01为一个UDP服务器测试程序,用于接收客户端的请求数据,然后回传另一组数据到客户端。UDP ——传输协议为UDP协
2016-04-12 11:15:28
27906
1
转载 64位和32位的区别
最近在调试UDP传输视频数据的时候,发现不同编译器下的定义的相同的结构体在传输的时候导致大小改变,从而使得数据传输出错。感觉下边的一篇文章总结的不错!-----------------------------------------------------------------------------------------转载自:http://blog.youkuaiyun.com/zhongzh
2016-03-21 10:02:22
891
JAVA网络编程第四版中文
2018-04-23
图解TCP/IP 第五版
2018-03-08
Crosswalk+Cordova开发安卓app-JavaScript调用java 源代码下载
2017-10-09
链表常用操作集合
2015-12-06
WebRTC怎么断线重连?
2017-03-22
如何在linux下实现视频4G无线传输到服务器端?
2015-11-19
TA创建的收藏夹 TA关注的收藏夹
TA关注的人