- 博客(32)
- 收藏
- 关注
原创 2020-12-22
多线程编程面试题https://www.cnblogs.com/anding/p/5301754.html1.描述线程与进程的区别?*一个应用程序实例是一个进程,一个进程包含一个或多个线程,线程是进程的一部分;*进程之间是相互独立的,它们有各自的私有内存空间和资源,进程内的线程可以共享其所属进程的所有资源;2.为什么GUI不支持跨线程访问控件?一般如何解决这个问题?因为GUI应用程序引入了一个特殊的线程处理模型,为了保证UI控件的线程安全,这个线程处理模型不允许其他子线程跨线程访问UI元素。解决
2020-12-22 10:43:40
156
原创 2020-12-17
基本SQL语法1.创建表定义如下表结构,后面的题目都以此表结构为依据。Student(ID,Name,Age,Sex)学生表Course(ID,Name,TeacherID)课程表Source(StudentID,CourserID,Score)成绩表Teacher(ID,Name)教师表创建表的SQL语句:CREATE TABLE [Student] ([ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,[Name] NVARCHAR(20)
2020-12-17 15:50:23
253
原创 2020-12-16
深入浅出装箱与拆箱一、基本概念拆箱与装箱就是值类型与引用类型的转换,它是值类型与引用类型之间的桥梁,它们可以相互转换的一个基本前提就是:Object是.Net中的万物之源。装箱:值类型转换为引用类型,一般是转换为System.Object类型或值类型实现的接口引用类型;拆箱:引用类型转换为值类型,注意,这里的引用类型只能是被装箱的引用类型对象;由于值类型和引用类型在内存分配的不同,从内存执行角度看,拆箱与装箱就势必存在内存的分配与数据的拷贝等操作,这也是装箱与拆箱性能影响的根源。装箱就是把值类型
2020-12-16 14:48:43
75
原创 2020-12-16
C#经典面试题总结一、值类型与引用类型的区别值类型:(1)简单类型有符号类型:sbyte、short、int、long无符号整型:byte、ushort、uint、ulongUnicode字符:charIEEE浮点型:float、double高精度小数:decimal布尔型:bool(2)枚举类型:用户自定义类型:enum(3)结构类型:用户自定义类型:struct引用类型:(1)类类型所有其他类型的最终基类:objectUnicode字符串:string用户自定义类型:clas
2020-12-16 09:59:52
68
原创 2020-12-15
数据结构与算法笔面试题整理一、常见时空复杂度有:*常数级复杂度:O(1)*对数级复杂度:O(logN)*线性级复杂度:O(N)*线性对数级复杂度:O(NlogN)*平方级复杂度:O(N2)二、冒泡排序(重点)(1)算法流程a.比较两个相邻的元素,如果第一个比第二个大,则交换两个元素的位置;b.对每一对相邻的元素做同样的工作,从开始的第一对一直到结尾的最后一对,经过这一步,最后的元素将是做大值;c.针对所有的元素重复以上步骤,除了最后一个;d.持续对越来越少的元素重复以上步骤,直到没有
2020-12-15 14:56:52
64
原创 2020-12-10
数据结构–树(下)用完全二叉树构成一个堆,(使根节点的值大于它的左右节点,这样的堆我们又叫它大顶堆,相反的如果小于,它就是小顶堆)。容易发现,从根节点向下画任何一条线,都是有序的,选取下标为1的位置为根节点,树中所有节点的左右儿子为它的二倍和二倍加一,也就是除根节点以外,每个节点的下边除以2就是它的父节点,很容易的我们发现,这样的数据结构在插入和删除操作时,最坏的时间复杂度都为O(logN)。######堆的结构表示#define MAXDATA 999999999999typedef struct
2020-12-10 14:33:28
60
原创 2020-12-09
数据结构–树(中)二叉搜索树对一颗二叉树,该如何实现它的动态查找(会有新元素的添加,和对当前树包含元素的删除),前面学过二分查找,很自然的如果我们再构建一棵树时,如果当前节点的左子树都比它小,右子树都比它大,对这样的树,我们叫做二叉搜索树。根据这样的性质,我们可以很自然的得出,二叉搜索树最小的节点是它的最左端的节点,二叉搜索树最大的节点是它的最右端的节点。二叉搜索树的查找我们知道对于一颗二叉搜索树,它任何节点的左子树都比它小,右节点都比它大,自然的一种二分查找,从根节点开始遍历,如果当前节点比需要查
2020-12-10 11:16:15
64
原创 2020-12-09
数据结构–树(上)树树是一种基本的层次结构,相比线性结构,在动态查找上,效率更高。两种查找方式顺序查找和二分查找顺序查找(哨兵法)对于一个线性表方便的查找方式是,从后向前查找且将查找的值放在最前面作为哨兵,只需要判断下标位置的元素是否为查找元素,而不用考虑下标是否走到边界(因为边界元素正好是我们的哨兵,走到了这里自动退出)代码实现:#include<stdio.h>#include<stdlib.h>typedef struct LNode* List;#defi
2020-12-09 15:08:59
62
原创 2020-12-07
基本数据结构1.线性表在数据结构中,线性表是最常见也是使用最频繁的基本数据结构,它可以通过数组实现或者链表实现。/////通过数组实现#include<stdio.h>#include<stdbool.h>#define MAXSIZE 5#define ElementType inttypedef struct LNode* List;struct LNode{ElementType Data[MAXSIZE];int last;};//make a e
2020-12-08 14:41:21
87
原创 2020-11-28
C/S架构和B/S架构的区别一、C/S架构1.C/S架构及背景C/S架构是一种比较早的软件架构,主要应用于局域网内。在这之前经历了集中计算模式,随着计算机网络的进步与发展,尤其是可视化工具的应用,出现过两层C/S和三层C/S架构,不过一直很流行也比较经典的是我们所要研究的两层架构。C/S架构软件(即客户机/服务器模式)分为客户机和服务器两层:第一层是客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组
2020-11-28 10:15:34
434
原创 2020-11-27
C#事件监控变量值的改变public class Program{//需要监控的字段private int myValue;//属性设置,此处调用了事件触发函数public int MyValue{ get { return myValue; } set { //如果变量改变则调用事件触发函数 if (value!=myValue) { WhenMyValueChange(); }
2020-11-27 15:04:45
73
原创 2020-11-27
前端系列-------Bootstrap一、Bootstrap整体架构Bootstrap主要有下面几部分组成:#12栅格系统—就是将屏幕平分12份(列)。使用行(row)来组织元素(每一行都包括12个列),然后将内容放在列内。通过col-ml-offset-*来控制列偏移。#基础布局组件—Bootstrap提供了多种基础布局组件。如排版、代码、表格、按钮、表单等。#Jquery—Bootstrap所有的Java...
2020-11-27 15:02:41
66
原创 2020-11-26
网络编程–P2P编程一、P2P的介绍首先,现在熟知的BT、电驴、迅雷、QQ、MSN和PPlive等都是基于P2P方式实现的软件,并且对等互联网(Peer to Peer,P2P)将是互联网的发展方向,因此对于P2P技术的了解显得非常的重要。在P2P技术之前,所有的网络应用都采用C/S或者B/S架构来实现的,然而在之前C/S架构的应用程序中,客户端软件向服务器发出请求,服务器然后对客户端请求作出响应,在这种情况下,如果客户端越多,此时服务器的压力就越大。然而采用P2P技术实现的每台计算机即是客户端,也是
2020-11-26 16:50:43
110
原创 2020-11-26
网络编程UDP一、UDP介绍UDP和TCP都是构建在IP层之上传输层的协议,但UDP是一种简单、面向数据报的无连接协议,提供的是不一定可靠的传输服务。然而TCP是一种面向连接、可靠的,面向字节流的传输协议,对于“无连接”是指在正是通信前不必与对方先建立连接,不管对方状态如何都可以直接发送过(就如QQ中通过QQ号查看好友后发送添加好友请求,此间不需要考虑对方的状态如何,都照样发送请求)。从UDP和TCP的定义中就可以看出它们两者的区别了,(1)UDP的可靠性不如TCP,因为TCP传输前需要先建立连接,
2020-11-26 15:34:44
165
原创 2020-11-26
网络编程TCP一、TCP的工作过程首先TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议。TCP的工作过程可以分为三个阶段:一、连接的建立。二、传输数据。三、断开连接。1.1连接的建立TCP的连接建立就像打电话一样,我们打电话时,拨一个号码并不是立即就可以接通的,期间会有一个“嘟嘟”的呼叫过程,这就好比是TCP协议的连接建立阶段。当我们用TCP编写的程序,必须建立TCP连接。TCP协议的连接建立通过三次握手来完成的。第一次握手:建立连接时,客户端发送SYN包(seq=x)到服务器,并进入S
2020-11-26 14:21:16
73
原创 2020-11-23
STL入门介绍一、STL是什么STL全称为Standard Template Library,即标准模板库,该库提供一些常用的容器对象和一些通用的算法等,可以理解STL就是一个库,该库帮我们封装了很多容器类和通用的方法,我们可以通过调用该库中封装好的方法和容器类来进行编程,相比C#而言,STL就好比.NET类库中的某个DLL。例如,C#中,List类存在于mscorlib.dll中System.Collections.Generic命名空间下,C++中,list存在于list头文件中std命名空间下,所
2020-11-25 10:06:40
163
原创 2020-11-23
建造者模式一、建造者模式的详细介绍1.1建造者模式的具体实现在这个例子中,电脑城的老板是直接与客户(也就是采购员)联系的,然而电脑的组装是由老板指挥装机人员去把电脑的各个部件组装起来,真真负责创建产品的人就是电脑城的装机人员。理清这个逻辑过程之后,下面就具体看下如何用代码来表示这种现实生活中的逻辑过程:...
2020-11-23 13:17:55
103
原创 2020-11-21
抽象工厂模式工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题。...
2020-11-23 11:19:21
113
原创 2020-11-21
工厂方法模式工厂方法模式可以解决简单工厂模式中存在的问题:–简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂。一、工厂方法模式的实现工厂方法模式之所以可以解决简单工厂模式存在的问题,是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不在负责所有产品的创建,而只是给出具体工厂必须实现的接口,这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中的缺点。下面看下工厂模式的具体实现代码:namespace
2020-11-21 15:03:06
65
原创 2020-11-21
简单工厂模式一、简单工厂模式的介绍说到简单工厂,自然的第一个疑问就是什么是简单工厂模式?在现实生活中工厂是负责生产产品的。同样在设计模式中,简单工厂模式我们也可以理解为负责生产对象的一个类,我们平常编程中,当使用“new”关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,此时我们可以运用面向对象(OO)的很重要的原则去解决这一问题。该原则就是–封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用来封装,这样的一种思路也
2020-11-21 11:47:25
90
原创 2020-11-21
如何使不符合要求的元素等于离它最近的一个元素一、实现思路为:1.首先对数组里面的数字进行一次遍历,如果当前的值不为“0”把值添加进结果数组中,否则对它进行处理。2.处理不为“0”的值的时候,用一种“等距离比较”的方法,找出等距离内的左右2个值,优先看左边的值是否为“0”,如果是的话跳过,如果不是的话将结果数组内的当前值替换为此值。3.距离的最大值为数组长度减去1,遍历的时候注意i-j的值不小于0,i+j的值要小于数组长度。具体实现代码如下:string [] s = new string[9]
2020-11-21 09:37:07
51
原创 2020-11-20
C#5.0新特性 – Async和Await使异步编程更简单一、同步代码存在的问题对于同步的代码,大家肯定不陌生,因为我们平常写的代码大部分都是同步的,然而同步代码却存在一个很严重的问题,例如我们向一个Web服务器发出一个请求时,如果我们发出请求的代码是同步实现的话,这时候我们的应用程序就会处于等待状态,直到收到一个回响信息为止,然而在这个等待的状态,对于用户不能操作任何的UI界面以及也没有任何的消息,如果我们试图去操作界面时,此时我们就会看到“应用程序为响应”的信息(在应用程序的窗口旁),相信大家在平
2020-11-20 13:30:15
71
原创 2020-11-19
Linq介绍一、Linq是什么?Linq也就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net 3.5中提出的一项新技术,Linq主要包含4个组件–Linq to Objects、Linq to XML、Linq to DataSet和Linq to SQL。下面简单介绍下四个组件:*Linq to SQL 组件–可以查询基于关系数据的数据(微软本身只是实现了对SQL Server的查询,可以对数据库中的数据进行查询、修改、插入、删除、排序等操作)*Lin
2020-11-20 10:24:15
64
原创 2020-11-19
扩展方法的全面解析一、扩展方法的介绍对于扩展方法的理解可以拆分为–首先它肯定是一个方法,然而方法又是对于一个类型而言的,所以扩展方法可以理解为现有的类型(现有类型可以为自定义的类型和.Net类库中的类型)扩展(添加)应该附加到该类型中的方法。在没有扩展方法之前,如果想为一个已有类型自定义自己逻辑的方法时,我们必须自定义一个新的类型来继承已有类型的方式来添加方法,使用这种继承方式来添加方法时,必须自定义一个新的派生类型,如果基类有抽象方法还需要重新去实现抽象方法,这样为了扩展一个方法却会导致因继承而带来
2020-11-19 15:19:56
91
1
原创 2020-11-16
C#Lambda表达式的理解应用一、Lambda表达式的演变过程Lambda表达式可以理解为是一个匿名函数,Lambda表达式可以包含表达式和语句,并且可以用于创建委托,以及C#编译器也能将它转换成表达式树。对于Lambda表达式中都会使用这个运算符——“=>”,它读成“goes to”,该运算符的左边为输入参数,右边是表达式或者语句块。using System;namespace Lambda{class Program{//Lambda表达式使用演示static void Ma
2020-11-18 16:56:01
81
原创 2020-11-16
C#迭代器的理解一、迭代器的介绍迭代器可以想象成数据库的游标,即一个集合中的某个位置,C#1.0中使用foreach语句实现了访问迭代器的内置支持,使用foreach使遍历集合更加容易,foreach被编译后会调用GetEnumerator来返回一个迭代器,也就是一个集合中的初始位置(foreach其实也相当于一个语法糖,把复杂的生成代码工作交给编译器去执行)。二、迭代器的实现在C#1.0中要实现一个迭代器必须实现IEnumerator接口,这样就必须实现IEnumerator接口中的MoveNex
2020-11-16 14:55:19
70
原创 2020-11-13
事件模式的实现using System;using System.Threading;namespace BirthdayEventDemo{class Program{static void Main(string[] args){//实例化一个事件源对象Me eventSource = new Me(“菜鸟”); //实例化事件关注者 Friend1 obj1 = new Friend1(); Friend2 obj2 = new Friend2(); //使用委托
2020-11-13 10:11:42
73
原创 2020-11-12
C#中为什么要引入委托C#中委托相当于C++中的函数指针,函数指针是用指针获取一个函数的入口地址,然后通过这个指针来实现对函数的操作。C#中的委托相当于C++中的函数指针,也就说两者是有区别的:委托是面向对象的,类型安全的,是引用类型,所以在使用委托时首先要 定义–声明–实例化–作为参数传递给方法–使用委托1.定义:delegate void MyDelegate(type1 para1,type2 para2);2.声明; MyDelegate d;3.实例化:d = new MyDelegate
2020-11-12 15:39:08
49
原创 2020-11-12
字典Dictionary的内部实现机制1.Dictionary的内部结构是哈希表,从而可以快速进行查找。Dictionary添加元素的过程原理:buckets(哈希表)记录了元素的在元素列表的存储位置,也就相当于一个映射列表。在查找的时候,就可以通过key值的哈希值来与buckets数组长度求余来获得元素在元素列表中的索引,这样就可以快速定位元素的位置,从而获得元素的key对应的Value值。2.解决冲突在添加元素过程中,有一个很重要的问题,如果产生冲突怎么办?即如果后面需要插入的一个元素的key值
2020-11-12 13:36:34
96
原创 2020-11-11
C#–深拷贝和浅拷贝一、深拷贝:指的是拷贝一个对象时,不仅仅把对象的引用进行复制,还把该对象引用的值也一起拷贝。这样进行深拷贝后的拷贝对象就和源对象相互独立,其中任何一个对象的改动都不会对另外一个对象造成影响。在.NET领域,值对象就是典型的例子,如int,Double以及结构体和枚举等。具体例子如下所示:int source = 123;//值类型赋值内部执行深拷贝int copy = source;//对拷贝对象进行赋值不会改变源对象的值copy = 234;//同样对源对象赋值也不会改
2020-11-11 16:54:01
70
原创 2020-11-11
C#设计模式(1)——单例模式一、单例模式的优缺点1.单例模式只允许创建一个对象,因此节省内存,加快对象访问速度,因此对象需要被公用的场合适合使用,如多个模块使用同一个数据源连接对象等等。2.单例模式的缺点就是不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。用单例模式,就是在适用其优点的状态下使用。二、单例模式的简介什么是单例模式?从“单例”字面意思上理解为—一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方
2020-11-11 11:31:32
121
1
原创 C#中委托和事件的应用理解
C#中委托和事件的理解使用委托和事件的说明:(1)C#中事件:事件是属于类的成员,所以要放在类的内部。(2)委托属于一个定义,是和类、接口类似的,通常放在外部。Preproc.cspublic class Preproc{//数据处理事件EventHandler FirstConnectionEventHandler;public Preproc()//构造函数{//关联事件FirstConnectionEventHandler = new EventHandler(AddIpToL
2020-11-10 16:41:18
229
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人