编程基础知识


一 编程基础

1.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?

内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。
内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。
内存优化:Android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用LruCache缓存的目的来控制图片所能够使用的内存。
还有对于比较耗资源的对象及时的关闭,例如Database Conn , 各种传感器 , Service 等等。

2. 深拷贝和浅拷贝的理解 ?

如果对象有个指针型成员变量指向内存中的某个资源,那么如何复制这个对象呢?你会只是复制指针的值传给副本的新对象吗?指针只是存储内存中资源地址的占位符。在复制操作中,如果只是将指针复制给新对象,那么底层的资源实际上仍然由两个实例在共享。

浅复制:两个实例的指针仍指向内存中的同一资源,只复制指针值而不是实际资源;
深复制:不仅复制指针值,还复制指向指针所指向的资源

3.如何理解MVC设计模式

MVC是一种架构模式,M表示MOdel,V表示视图View,C表示控制器Controller:

Model负责存储、定义、操作数据;
View用来展示书给用户,和用户进行操作交互;

Controller是Model和View的协调者,Controller把Model中的数据拿过来给View用。Controller可以直接与Model和View进行通信,而View不能和Controller直接通信。View与Controller通信需要利用代理协议的方式,当有数据更新时,MOdel也要与Controller进行通信,这个时候就要用Notification和KVO,这个方式就像一个广播一样,MOdel发信号,Controller设置监听接受信号,当有数据更新时就发信号给Controller,Model和View不能直接进行通信,这样会违背MVC设计模式。

4.简述同步和异步的区别?

同步是阻塞模式,异步是非阻塞模式。
同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率

5.简述WebService的概念 ?

WebService服务可以描述为可以在web上部署并可以被任何应用程序或其他服务调用的功能。所谓服务就是系统提供一组接口,并通过接口使用系统提供的功能,WebService服务可以提供任何企业到客户,企业到企业,点对点或部门对部门通讯所需的服务,比如一个公司可以通过网络连接到另一个公司的服务,从而直接传递订购单。

6.概述O/R Mapping 的原理

ORM,即Object-RelationlMapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。下面是在网上转载的一段文章中对它的描述:

让我们从O/R开始。字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

当你开发一个应用程序的时候(不使用O/RMapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。

如果打开你最近的程序,看看DAL代码,你肯定会看到很多近似的通用的模式。我们以保存对象的方法为例,你传入一个对象,为SqlCommand对象添加SqlParameter,把所有属性和对象对应,设置SqlCommand的CommandText属性为存储过程,然后运行SqlCommand。对于每个对象都要重复的写这些代码。

除此之外,还有更好的办法吗?有,引入一个O/R Mapping。实质上,一个O/R Mapping会为你生成DAL。与其自己写DAL代码,不如用O/RMapping。你用O/R Mapping保存,删除,读取对象,O/R Mapping负责生成SQL,你只需要关心对象就好。

7.值类型和引用类型的区别?

基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。

所有的值类型均隐式派生自 System.ValueType。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。

与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将null 赋给值类型。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。

值类型主要由两类组成:结构、枚举; 结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。

引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string

8.Override, Overload,的区别?

Override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。

Overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同。

9.Heap与stack的差别?

Heap是堆,空间是由手动操作分配和释放的,它的存储区很大的自由存储区。

Stack是栈,是由是操作系统自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数的传递也是在栈上进行的

10.简述怎么实现跨域请求 ?

1、jsonp
最常见的一种跨域方式,其背后原理就是利用了 script 标签不受同源策略的限制,在页面中动态插入了 script,script 标签的 src 属性就是后端 api 接口的地址,并且以 get 的方式将前端回调处理函数名称告诉后端,后端在响应请求时会将回调返还,并且将数据以参数的形式传递回去。jsonp 只能发送 get 请求。

2、CORS
Cross-Origin Resource Sharing(跨域资源共享)是一种允许当前域(origin)的资源(比如html/js/web service)被其他域(origin)的脚本请求访问的机制。
当使用 XMLHttpRequest 发送请求时,浏览器如果发现违反了同源策略就会自动加上一个请求头 origin,后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin,值就是发起请求的源地址(http://127.0.0.1:8888),浏览器得到响应会进行判断 Access-Control-Allow-Origin 的值是否和当前的地址相同,只有匹配成功后才进行响应处理。
现代浏览器中和移动端都支持 CORS(除了opera mini),IE 下需要8+
3、服务器跨域
在前后端分离的项目中可以借助服务器实现跨域,具体做法是:前端向本地服务器发送请求,本地服务器代替前端再向真实服务器接口发送请求进行服务器间通信,本地服务器其实充当个「中转站」的角色,再将响应的数据返回给前端
缺点:服务器跨域需要另起服务器
4、postmessage跨域
在 HTML5 中新增了 postMessage 方法,postMessage 可以实现跨文档消息传输 Cross Document Messaging,IE8,Firefox 3,Opera 9,Chrome 3 和 Safari 4 都支持 postMessage。
该方法可以通过绑定 window 的 message 事件来监听发送跨文档消息传输内容。
使用 postMessage 实现跨域的话原理就类似于 jsonp,动态插入 iframe标签,再从 iframe 里面拿回数据
,私认为用作跨页面通信更加适合
总结
当然还有其他实现跨域的方式比如在ie8、9下 XDR 跨域方案,flash 方案,以上是一些常用的跨域方案,都各有利弊,比如:jsonp 只能发送 get 请求、服务器跨域需要另起服务器等等,大家可以根据自己项目需求选择适合的解决方案

11.简述什么是REST?

REST,英文全称,Resource Representational State Transfer,对资源的访问状态的变化通过url的变化表述出来。
Resource:资源。资源是REST架构或者说整个网络处理的核心。
Representational:某种表现形式,比如用JSON,XML,JPEG等。
State Transfer:状态变化。通过HTTP method实现。
REST描述的是在网络中client和server的一种交互形式。用大白话来说,就是通过URL就知道要什么资源,通过HTTP method就知道要干什么,通过HTTP status code就知道结果如何。

举个例子:

GET /tasks 获取所有任务
POST /tasks 创建新任务
GET /tasks/{id} 通过任务id获取任务
PUT /tasks/{id} 更新任务
DELETE /tasks/{id} 删除任务
GET代表获取一个资源,POST代表添加一个资源,PUT代表修改一个资源,DELETE代表删除一个资源。

server提供的RESTful API中,URL中只使用名词来指定资源,原则上不使用动词。用HTTP Status Code传递server的状态信息。比如最常用的 200 表示成功,500 表示Server内部错误等。

12.简述什么是CDN ?

DN是什么?CDN其全称是Content Delivery Network,即内容分发网络。CDN是构建在网络上的内容分发网络,具备内容存储和分发两个关键要素。其基本原理是广泛采用各种缓存服务器,将这些缓存服务器分布到用户访问相对集中的地区或网络中,在用户访问网站时,利用全局负载技术将用户的访问指向距离最近的工作正常的缓存服务器上,由缓存服务器直接响应用户请求。比如说,北京的用户让他访问北京的节点,上海的用户让它访问上海的节点,而不是北京的用户访问上海的节点,上海的用户访问北京的节点,这样会极大增加用户的访问时长,及访问的成本。通过就近访问,加速用户对网站的访问,解决Internet网络拥堵状况,提高用户访问网络的响应速度。CDN就像网络中的快递小哥,把你网购的商品从最近的仓库拿出并选择最优的路线,并将包裹及时地送到指定收货地点。CDN就是扮演护航及加速的角色,使得每一个网络请求能够请求更快,时延更小,响应更快,带来更为极致的用户体验

13.MySQL 与Redis 的区别?

MySQL 与Redis 类型上:
mysql是关系型数据库,redis是缓存数据库(No-SQL数据库)

MySQL 与Redis 作用上:
mysql用于持久化的存储数据到硬盘,功能强大,速度较慢,基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高。
redis用于存储使用较为频繁的数据到缓存中,读取速度快,基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵。

MySQL 与Redis 需求上:
mysql和redis因为需求的不同,一般都是配合使用。
需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。
存储数据在MySQL和Redis之间做同步。

14.解释什么是事务,知道事务提交、回滚?

事务是并发控制单位,用户定义的一个操作序列。这些操作要么都做,要么都不做,是不可分割的的工作单位。通过事务,sql server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性,主要用于一些对操作过程的完整性比较高的程序。(事务的特性:原子性、一致性、隔离性、持久性)。

事务提交:是提交事务的所有操作:具体来说就是将所有对数据库的更新写回到磁盘上的物理数据库中,事务正常结束。

事务回滚:是数据库返回到事务开始的状态;事务在运行过程中发生某种故障,事务不能继续执行,系统将事务中对数据库的所有已完成的更新操作全部撤销,使数据回滚到事务开始时的状态。

15.什么是分布式系统架构?

1:互联网应用的特点是:高并发,海量数据。互联网应用的用户数是没有上限的(取决于其开放特性),这也是和传统应用的本质区别。高并发指系统单位时间内收到的请求数量(取决于使用的用户数),没有上限。海量数据包括:海量数据的存储和海量数据的处理。这两个工程难题都可以使用分布式系统来解决。
简单理解,分布式系统就是把一些计算机通过网络连接起来,然后协同工作。协同工作需要解决两个问题:
1)任务分解
把一个问题拆解成若干个独立任务,每个任务在一台节点上运行,实现多任务的并发执行。
2)节点通信
节点之间互相通信,需要设计特定的通信协议来实现。协议可以采用RPC或Message Queue等方式。

2:分布式和集群的关系
分布式:一个业务分拆多个子业务,部署在不同的服务器上
集群:同一个业务,部署在多个服务器上

16.解释什么是幂等性?

幂等性就是用户对同一操作发起一次请求或者多次请求的结果是一致的。不会因为多次点击二次产生副作用。简单的例子,就是支付,用户购买商品使用支付,支付扣款成功,但是返回结果的时候网络异常,此事钱已经扣了,用户再次点击,此时会产生二次扣款,结果返回成功,用户查询余额返现多扣钱了。流水记录变成了两条、这就是幂等性。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


  • 24
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值