qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

初学软件测试看什么书?

测试基础:
  1.软件测试   作者: (美)Ron Patton     译者:周予滨 姚静 等 机械工业出版社
  2. 软件测试方法和技术   朱少民 清华大学出版社
  3. 计算机软件测试(美)Cem Kaner,Jack Falk,Hung QuocNguyen 译者王峰   机工出版社
  4. 软件测试技术概论 古乐 史九林 清华大学出版社
  5. 计算机软件测试技术 郑人杰     编著    清华大学出版社
  自动化测试基础:
  软件测试自动化 作者:Daniel J.Mosley, Bruce A.Posey/著
  软件测试自动化技术与实例详解  Mark Fewster & Dorothy Graham  电子工业出版社
  测试进阶:
  《有效软件测试》 作者:[美]Elfriede Dustin/著 ;
  软件测试管理类:
  软件测试:经验与教训 作者: (美)Cem Kaner,James Bach,Bret Pettichord
  测试流程管理 作者: (美)Rex Black
  Web测试类:
  Web应用测试(第二版)作者: (美)Hung Q.Nguyen,Bob Johnson,Michael Hackett! R2 H: J8 o/ {$ H* I
  Web测试指南 [美] Lydia Ash 机械工业出版社
  安全性测试:
  Web安全测试 作者: (美)Steven Splaine8

posted @ 2013-11-28 11:36 顺其自然EVO 阅读(432) | 评论 (0)编辑 收藏

SoapUI学习(1)- WebService基础

WebService
  它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;
  它是一种新的web应用程序分支,是自包含、自描述、模块 化的应用,可以发布、定位、通过web调用。
  Web Service是一个应用组件,它逻辑性的为其他应用程序提供数据与服务.各应用程序通过网络协议和规定的一些标准数据格式(Http,XML,Soap)来访问Web Service,通过Web Service内部执行得到所需结果.
  Web Service可以执行从简单的请求到复杂商务处理的任何功能。一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。
  ------------------
  在构建和使用Web Service时,主要用到以下几个关键的技术和规则:
  1.XML:描述数据的标准方法.
  2.SOAP:表示信息交换的协议.
  3.WSDL:Web服务描述语言.
  4.UDDI通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。
  http://www.webxml.com.cn/zh_cn/index.aspx   这个网站中有不少免费的WebService可用
  ------------------我个人觉得下面的这个理解起来更容易些,甚至我都觉得他有点想API,只是放到web中了而已-------------------------
  1,什么是 Web Service ?
  Web Service 就是一个网络组件(一个可以通过网络访问的程序)。
  它有一个或多个端口(Port),这些端口用于接收客户端的请求,并返回响应
  请求和响应的 都是一种基于XML的消息。 不过这种消息遵循特定的格式(SOAP )。
  2,怎样调用 Web Service?
  可能这样说不太准确,应该是“怎样调用Web Service中定义的操作 ”
  每个Web Service 都有一个描述文件(WSDL ),
  它描述 一个 Web Service 的如下方面:
  (1)服务的端口(接收SOAP消息的端口)
  (2)服务提供的操作
  (3)操作的输入输出格式的定义(通过XMLSchema 定义输入输出格式)
  有了Web Service 的描述文件(WSDL ),我们就知道怎样调用这个Web Service 中定义的操作了。
  (1)通过服务提供的操作找到你想调用的操作
  (2)找到这个操作的输入格式的定义(XMLSchema ),按照这种输入格式构造一个SOAP消息
  (3)将这个SOAP消息发送到服务的指定端口
  (4)准备接收一个从Web Service服务器返回的 SOAP 响应吧 !
  3, Web Service服务器
  一个Web Service服务器,本质上和一个Web服务器是相同的。
  它主要做下面这些事:
  --> 监听网络端口(监听服务端口)
  --> 接收客户端请求(接收SOAP请求)
  --> 解析客户端请求(解析SOAP消息,将SOAP消息转换为数据对象)
  --> 调用业务逻辑 (调用Web Service实现类的特定操作,参数是由SOAP消息转换而来的数据对象)
  --> 生成响应 (将返回值转换为SOAP消息)
  --> 返回响应 (返回SOAP响应)

  XML
  什么是 XML?
  ·  XML 指可扩展标记语言(EXtensible Markup Language)
  ·  XML 是一种标记语言,很类似 HTML
  ·  XML 的设计宗旨是传输数据,而非显示数据
  ·  XML 标签没有被预定义。您需要自行定义标签。
  ·  XML 被设计为具有自我描述性。
  ·  XML 是 W3C 的推荐标准
  XML 与 HTML 的主要差异
  XML 不是 HTML 的替代。
  XML 和 HTML 为不同的目的而设计:
  XML 被设计为传输和存储数据,其焦点是数据的内容。
  HTML 被设计用来显示数据,其焦点是数据的外观。
  HTML 旨在显示信息,而 XML 旨在传输信息。
  没有任何行为的 XML。XML 是不作为的。也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
  下面是 John 写给 George 的便签,存储为 XML:
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
  这个标签有标题以及留言。它也包含了发送者和接受者的信息。但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。
  XML 仅仅是纯文本
  XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。
  不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。
  通过 XML 您可以发明自己的标签
  上例中的标签没有在任何 XML 标准中定义过(比如 <to> 和 <from>)。这些标签是由文档的创作者发明的。这是因为 XML 没有预定义的标签。在 HTML 中使用的标签(以及 HTML 的结构)是预定义的。HTML 文档只使用在 HTML 标准中定义过的标签(比如 <p> 、<h1> 等等)。XML 允许创作者定义自己的标签和自己的文档结构。
  XML 不是对 HTML 的替代
  XML 是对 HTML 的补充。XML 不是对 HTML 的替代,理解这一点很重要。在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。
  XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享。
  XML 把数据从 HTML 分离
  如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML。通过 XML,数据能够存储在独立的 XML 文件中。这样你就可以专注于使用 HTML 进行布局和显示,并确保修改底层数据不再需要对 HTML 进行任何的改变。通过使用几行 JavaScript,你就可以读取一个外部 XML 文件,然后更新 HTML 中的数据内容。
  XML 简化数据共享
  在真实的世界中,计算机系统和数据使用不兼容的格式来存储数据。XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。
  XML 简化数据传输
  通过 XML,可以在不兼容的系统之间轻松地交换数据。对开发人员来说,其中一项最费时的挑战一直是在因特网上的不兼容系统之间交换数据。由于可以通过各种不兼容的应用程序来读取数据,以 XML 交换数据降低了这种复杂性。
  XML 简化平台的变更
  升级到新的系统(硬件或软件平台),总是非常费时的。必须转换大量的数据,不兼容的数据经常会丢失。XML 数据以文本格式存储。这使得 XML 在不损失数据的情况下,更容易扩展或升级到新的操作系统、新应用程序或新的浏览器。
  XML 使您的数据更有用
  由于 XML 独立于硬件、软件以及应用程序,XML 使您的数据更可用,也更有用。不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从 XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。
  XML 用于创建新的 Internet 语言
  很多新的 Internet 语言是通过 XML 创建的:
  其中的例子包括:
  ·  XHTML - 最新的 HTML 版本
  ·  WSDL - 用于描述可用的 web service
  ·  WAP 和 WML - 用于手持设备的标记语言
  ·  RSS - 用于 RSS feed 的语言
  ·  RDF 和 OWL - 用于描述资源和本体
  ·  SMIL - 用于描述针针对 web 的多媒体
  假如开发人员都是理性的
  假如他们都是理性的,就让未来的应用程序使用 XML 来交换数据吧。
  未来也许会出现某种字处理软件、电子表格程序以及数据库,它们可以使用纯XML
 WSDL
  什么是 WSDL?
  ·  WSDL 指网络服务描述语言
  ·  WSDL 使用 XML 编写
  ·  WSDL 是一种 XML 文档
  ·  WSDL 用于描述网络服务
  ·  WSDL 也可用于定位网络服务
  ·  WSDL 还不是 W3C 标准
  WSDL 可描述网络服务(Web Services)
  WSDL 指网络服务描述语言 (Web Services Description Language)。
  WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。
  WSDL 文档仅仅是一个简单的 XML 文档。
  它包含一系列描述某个 web service 的定义。
  WSDL 文档结构
  WSDL 文档是利用这些主要的元素来描述某个 web service 的:
  元素
  定义
<portType>
web service 执行的操作
<message>
web service 使用的消息
<types>
web service 使用的数据类型
<binding>
web service 使用的通信协议
  一个 WSDL 文档的主要结构是类似这样的:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>
  PS:实际上以上的结构,可以用浏览器打开一个具体的webservice来看,比如以下查询手机归属地的wsdl格式的webservice
  http://fy.webxml.com.cn/webservices/EnglishChinese.asmx?wsdl
  WSDL 文档可包含其它的元素,比如 extension 元素,以及一个 service 元素,此元素可把若干个 web services 的定义组合在一个单一的 WSDL 文档中。
  WSDL 端口
  <portType> 元素是最重要的 WSDL 元素。 它可描述一个 web service、可被执行的操作,以及相关的消息。 可以把 <portType> 元素比作传统编程语言中的一个函数库(或一个模块、或一个类)。
  WSDL 消息
  <message> 元素定义一个操作的数据元素。 每个消息均由一个或多个部件组成。可以把这些部件比作传统编程语言中一个函数调用的参数。
  WSDL types
  <types> 元素定义 web service 使用的数据类型。 为了最大程度的平台中立性,WSDL 使用 XML Schema 语法来定义数据类型。
  WSDL Bindings
  <binding> 元素为每个端口定义消息格式和协议细节。
  WSDL 实例
  这是某个 WSDL 文档的简化的片段:
<message name="getTermRequest">
<part name="term" type="xs:string"/>
</message>
<message name="getTermResponse">
<part name="value" type="xs:string"/>
</message>
<portType name="glossaryTerms">
<operation name="getTerm">
<input message="getTermRequest"/>
<output message="getTermResponse"/>
</operation>
</portType>
  在这个例子中,<portType> 元素把 "glossaryTerms" 定义为某个端口的名称,把 "getTerm" 定义为某个操作的名称。
  操作 "getTerm" 拥有一个名为 "getTermRequest" 的输入消息,以及一个名为 "getTermResponse" 的输出消息。
  <message> 元素可定义每个消息的部件,以及相关联的数据类型。
  对比传统的编程,glossaryTerms 是一个函数库,而 "getTerm" 是带有输入参数 "getTermRequest" 和返回参数 getTermResponse 的一个函数。

posted @ 2013-11-28 11:33 顺其自然EVO 阅读(543) | 评论 (0)编辑 收藏

JMeter主要组件介绍(2)

  JMeter的组件主要包含:逻辑控制器,配置元件,定时器,前置处理器,Sampler,后置处理器,断言,监听器。刚开始学习,只能对他们有个大概的了解,以后慢慢使用了就会更熟悉些。
  1、逻辑控制器(LogicController)
  逻辑控制器主要用来控制JMeter发送请求(也就是采样器)的处理顺序,例如,它可以使从属于它一组请求它与Sampler结合使用可以模拟复杂的请求序列。


  2、采样器(Sampler)
  采样器也就是发送一个具体的请求到指定服务器,等待服务器的请求。一般,采样器会按照其在测试树中的顺序去执行,但是也会根据逻辑控制器来改变运行的次数和顺序。JMeter 采样器包含:
  FTP Request
  HTTP Request
  JDBC Request
  Java object request
  LDAP Request
  SOAP/XML-RPC Request
  WebService (SOAP) Request
  3、配置元件(Config Element)
  配置元件和它的名字一样,只是配置一些默认的属性和信息,它不向服务器发送任何的请求。配置元件仅对其所在的测试树分支有效。例如,HTTP请求默认值设置了服务器的名称,那么它所在的测试分支内的HTTP请求的服务器名称都是这个服务器,HTTP请求仅设置路径就可以访问网页了。配置元件主要有:
  CSV Data Set Config
  FTP请求缺省值
  HTTPCacheManager
  HTTPCookie管理
  HTTP信息头管理器
  HTTP授权管理器
  HTTP 请求默认值
  JAVA请求默认值
  LDAP请求默认值
  TCP请求默认值
  登录配置元件
  计数器
  但是有个例外,配置元件"用户定义的参数"无论它处于测试树的哪个位置,总是在测试的初始阶段执行。所以最好把它放在线程组的开始部分。
  4、监听器(Listener)
  监听器是把测试结果用数据进行处理并展示出来。 查看结果树,用表格查看结果,图形结果、、聚合报告,都是我们经常用到的元件。
  5、断言(Assertions)
  用于检查测试中得到的数据和我们预期的结果是否相同。
  6、前置处理器(Per Processors)
  在发出请求之前对请求进行特殊的处理。例如,HTTP URL重写修复符则可以实现URL重写,当RUL中有sessionID 一类的session信息时,可以通过该处理器填充发出请求的实际的sessionID 。
  7、后置处理器(Post Processors)
  对采样器 发出请求后得到的服务器响应进行处理。一般用来提取响应中的特定数据。例如,XPath  Extractor 可以提取响应数据中通过给定XPath 值获得的数据。
  元件的执行顺序
  在同一作用域名范围内,测试计划中的元件按照如下顺序执行。
  (1)配置元件(config elements )
  (2)前置处理程序(Per-processors)
  (3)定时器(timers )
  (4)取样器(Sampler)
  (5)后置处理程序(Post-processors) (除非Sampler 得到的返回结果为空)。
  (6)断言(Assertions)(除非Sampler 得到的返回结果为空)。
  (7)监听器(Listeners)(除非Sampler 得到的返回结果为空)。
相关文章:
JMeter的基本介绍和入门(1)

posted @ 2013-11-28 11:33 顺其自然EVO 阅读(289) | 评论 (0)编辑 收藏

JMeter的基本介绍和入门(1)

1. 介绍
  JMeter是Apache组织的开放源代码项目,能做功能测试性能测试。它能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC),还能以多种形式展现测试结果。我们初学者往往一看到很多的理论都很不耐烦,一般都喜欢通过举例子才会激起兴趣,有想往下学习的欲望。
  2. 测试环境搭建
  在官网 http://jmeter.apache.org/ 下载JMeter,解压到本地,在里面的bin目录下,找到jmeter.bat批处理文件,然后双击就出现了JMeter的工作环境:
  3. 测试实例
  JMeter里面的元件很多,逻辑控制器,配置元件,定时器,Sampler,监听器等等,先给出一个实例,慢慢了解元件的使用方法。测试一个网站,我们至少需要:用户,发送请求,查看结果这三个过程。
  3.1 添加线程组(用户)
  在“测试计划”上右键,选择“添加”---“Thread Users”---“线程组”,如下图所示:


  其中,对我们有影响的参数是线程数(设置发送请求的用户数目),Ramp-up period: 每个请求发生的总时间间隔,单位是秒,循环次数(请求发生的重复次数)。如果我们需要JMeter模拟五个请求者(也就是五个线程),每个请求者连续请求两次,则如下图设置:
  3.2 添加请求
  我们要访问一个网页,比如是百度首页,则是http请求,则添加http请求,在线程组上右键---“添加”---“Sampler”---“HTTP请求”
  http请求的属性值中“Web服务器名称或IP”填写www.baidu.com就可以了:如下图所示:
 3.3 添加监视器(查看结果)
  监视器的种类很多,根据自己的需要添加,我们选择“查看结果树”。在线程组上右键---“添加”---“监视器”---“查看结果树”,如下图所示:
  4. 运行
  可以查看结果:
  JMeter入门结束。

posted @ 2013-11-28 11:30 顺其自然EVO 阅读(386) | 评论 (0)编辑 收藏

LoadRunner的场景设置

 loadrunner场景设置的方法:
  1.逐步增加用户数,分多次去运行场景。比如:第一次运行50并发,第二次运行100并发……
  2.针对同一个脚本设置多个组,使用组策略(点击Edit Schedule按钮,选择Schedule by Group),第一个组为初始用户数,如100,第二个组以50或100递增。每个用户场景都持续稳定地运行一段时间,这样可以把几种用户场景下的测试在一次场景的运行过程中就一次性执行完毕,而且还有一个好处是可以把多个用户场景下的性能结果都整合到同一个结果中,也方便对比、分析。
  按组计划一般可用于比较复杂的业务流程中。比如,我们要实现用户注册系统,然后发贴,而论坛管理员认为这些帖子是非法的,需要将这些帖子删除。此时,我们就需要用到按组计划了。
  按组计划的优点是可以设置在同一场景中不同脚本执行的先后顺序,可以组合处复杂的业务逻辑。
  在Schedule by Group中方式,比按场景计划多了”Start Time”选项卡,Start Time中脚本有三种执行方式:
  第一个:在场景开始时启动;
  第二个:场景开始运行一段时间后开始,这种方式需要指定具体的开始时间;
  第三个:在某些特定虚拟用户组运行完成后开始,这种方式适用于具有耦合关系的虚拟用户组。
  通过后两种方式可以体现处不同组之间执行的先后关系。
  至于Ramp Up, Duration, Ramp Down的功能与 Schedule by scenario一样。
  按用户组计划的方式更加灵活,能够创建实际应用中那些有约束的场景。如果一组用户执行后产生的数据记录是另外一组用户的输入,那么就学要按照”用户组”的方式配置场景。
  可以通过选右边Graph中的不同场景的线来选择对象,也可只显示一个线条,再对各个场景关系进行设置!
  :Schedule by scenario是所有用户遵从场景的整体安排。

posted @ 2013-11-28 11:30 顺其自然EVO 阅读(405) | 评论 (0)编辑 收藏

产品经理的工作感想(1)

互联网产品设计的五个层次:战略,范围,结构,框架,表现。
  一个产品经理的信仰:好产品能改变世界。
  产品究竟是什么:
  官方解释:产品是一组将输入转化为输出的相互关联或相互作用的活动的结果。是过程的结果
  在经济领域中,通常也可理解为组织制造的任何制品或制品的组合。
  产品的侠义概念:被生产出来的物品。
  产品的广义概念:可以满足人们需求的载体。
  产品的直观概念:就是用来解决某个问题的东西。
  对于产品的理解
  典型的传统行业与互联网,软件行业的区别:
  第一,行业形态不同:成熟行业 VS 新兴行业。
  第二,产品形态与成本结构不同:实物 VS 虚拟物品。
  第三,生命周期不同:几年 VS 几个月。
  第四,盈利模式不同:单一卖产品赚钱 VS 多远盈利。
  第五,用户心态不同:花钱买 VS 免费用。
  管理的能力:
  “在资源不足的情况下把事情做成”的能力。
  这里的资源 在产品经理的工作中通常表现为一下几种形式:
  第一,信息不足以决策。时间有限,每次决策前不可能掌握所有信息。
  做决定时总是很头疼,我估计是“拍脑袋”拍的太多的原因,哈哈。
  第二,时间不足以安排周密的计划。总是接到3个月,一个月,甚至一个礼拜完成。
  某项目的命令,每次都让我们张大嘴巴说不出来,应承下来后的如何完成计划?不过又一次的实践表明,办法总比困难多。
  第三,人员不足以支持工作强度和难度。不但时间不足,人员也不足,就算数量够,能力也不够,能力够了,团队士气高不高?哪里公司不加班,有多少公司有加班工资?但还的完成任务,难不难?难。
  第四,资金不足以自由调配。俗话说钱要花在刀刃上,买机器要花钱,招人要花钱,产品推广要花钱,而花这些钱的前提是公司还低得赚钱,每花一分钱恨不得掰成两半用。
  以上四点还可以推广到生活的各方各面,凡是资源,总归不足_这是常态。
  既然不足,就需要学会分配资源,管理资源,比如说自己的时间,衣橱,工资。。。。。其实你已经每天都在做了,不是么?所以你已经是产品经理了。
  需要进一步明确一点,你是自己喜欢产品,到底是喜欢做用户,还是喜欢做产品经理?
  当你对一个产品感兴趣的时候,回想一下脑海中萦绕的问题是站在用户的角度,还是站在产品经理的角度。通常,用户回去想怎么用这个产品,才能带给自己更大的好处,产生更大的效用,而产品经理则习惯与绕过表象,从背后看问题的本质,思考怎么设计这个产品才能更好的平衡用户目标和商业目标。

posted @ 2013-11-28 11:29 顺其自然EVO 阅读(123) | 评论 (0)编辑 收藏

JAVA内存结构详解

Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等。
  下面分别介绍栈内存,堆内存,方法区各自一些特性:
  1、栈内存
  (1)一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
  (2)每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  (3)栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
  (4)当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
  (5)当数据使用完,所占空间会自动释放。
  2、堆内存
  (1)堆内存用于存放由new创建的对象和数组。
  (2)每一个实体都有一个内存地址值
  (3)实体中的变量都有默认初始化值
  (4)实体不再被使用,会在不确定的时间内被垃圾回收器回收
  补充:数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!
  3、方法区
  1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
  方法区存放装载的类数据信息包括:
  (1)基本信息:
  1)每个类的全限定名
  2)每个类的直接超类的全限定名(可约束类型转换)
  3)该类是类还是接口
  4)该类型的访问修饰符
  5)直接超接口的全限定名的有序列表
  (2)每个已装载类的详细信息:
  1)运行时常量池:
  存放该类型所用的一切常量(直接常量和对其它类型、字段、方法的符 号引用),它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。它是类文件(字节码)常量池的运行时表示。(还有一种静态常量池,在字节码文件中)。
  2)字段信息:
  类中声明的每一个字段的信息(名,类型,修饰符)。
  3)方法信息:
  类中声明的每一个方法的信息(名,返回类型,参数类型,修饰符,方法的字节码和异常表)。
  4)静态变量
  5)到类 classloader 的引用:即到该类的类装载器的引用。
  6)到类 class 的引用:  虚拟机为每一个被装载的类型创建一个 class 实例, 用来代表这个被装载的类
  以上为栈内存,堆内存,方法区的一些特性,其中
  栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 5;
int b = 5;



  编译器先处理int a = 5;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有5这个值,如果没找到,就将5存放进来,然后将a指向5。
  接着处理int b = 5;在创建完b的引用变量后,因为在栈中已经有5这个值,便将b直接指向5。这样,就出现了a与b同时均指向5的情况。
  这时,如果再令a=8;那么编译器会重新搜索栈中是否有8值,如果没有,则将8存放进来,并令a指向8;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
  注意:这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
  下面举例说明Java程序在内存中的分配:
  拿String举例,其中String是一个特殊的包装类数据。可以用:
  String str = new String("abc");
  String str = "abc";
  两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
  而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向"abc",如果已经有"abc" 则直接令str指向"abc"。
  比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
  String str1 = "abc";
  String str2 = "abc";
  System.out.println(str1==str2); //true
  //可以看出str1和str2是指向同一个对象的。
  String str1 =new String ("abc");
  String str2 =new String ("abc");
  System.out.println(str1==str2); // false
  //用new的方式是生成不同的对象。每一次生成一个。
  因此用第一种方式创建多个"abc"字符串,在内存中其实只存在一个对象而已.这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建对象。
  而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是有必要创建新对象,从而加重了程序的负担。
  另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。当心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
  内存图演示
  new String ("abc")内存图:

posted @ 2013-11-28 11:19 顺其自然EVO 阅读(228) | 评论 (0)编辑 收藏

Java实现字符串的匹配

 假设我们有一个一定个数的字母组成字串,我给每个字母分配一个素数,从2开始,往后类推。这样A将会是2,B将会是3,C将会是5,等等。现在我遍历第一个字串,把每个字母代表的素数相乘。你最终会得到一个很大的整数,对吧?
  然后——轮询第二个字符串,用每个字母除它。如果除的结果有余数,这说明有不匹配的字母。如果整个过程中没有余数,你应该知道它是第一个字串恰好的子集了。
  思路总结如下:
  1.定义最小的26个素数分别与字符'A'到'Z'对应。
  2.遍历长字符串,求得每个字符对应素数的乘积。
  3.遍历短字符串,判断乘积能否被短字符串中的字符对应的素数整除。
  4.输出结果。
  至此,如上所述,上述算法的时间复杂度为O(m+n),时间复杂度最好的情况为O(n)
package contcurrentandalgorithm;
/**
*
* @author Administrator
* zyyjiao@mail.ustc.edu.cn
*/
public class SushuStringFind {
public static void main(String[] args) {
int primeNumber[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101};
String strOne = "ABCDEFGHLMNOPQRS";
String strTwo = "ABCDEFGHL";
// 这里需要用到大整数
int product = 1;   //大整数除法的代码,下头给出。
// 遍历长字符串,得到每个字符对应素数的乘积
for (int i = 0; i < strOne.length(); i++) {
int index = strOne.charAt(i) - 'A';
product = product * primeNumber[index];
}
// 遍历短字符串
for (int j = 0; j < strTwo.length(); j++) {
int index = strTwo.charAt(j) - 'A';
// 如果余数不为0,说明不包括短字串中的字符,跳出循环
if (product % primeNumber[index] != 0) {
break;
}
if (strTwo.length() == j) //cout << "true" << endl;
{
System.out.println("true");
} else //cout << "false" << endl;
{
System.out.println("false");
}
}
}
}

posted @ 2013-11-28 11:18 顺其自然EVO 阅读(373) | 评论 (0)编辑 收藏

PL/SQL Developer导入导出数据库方法及说明

  PL/SQL Developer是Oracle数据库中用于导入或导出数据库的主要工具,本文主要介绍了利用PL/SQL Developer导入和导出数据库的过程,并对导入或导出时的一些注意事项进行了说明,接下来我们就一一介绍。
  导出步骤:
  1 tools ->export user object 选择选项,导出.sql文件。
  2 tools ->export tables-> Oracle Export 选择选项导出.dmp文件。
  导入步骤:
  注:导入之前最好把以前的表删除,当然导入另外数据库除外。
  1 tools->import tables->SQL Inserts 导入.sql文件。
  2 tools->import talbes->Oracle Import然后再导入dmp文件。
  一些说明:
  Tools->Export User Objects导出的是建表语句(包括存储结构)。
  Tools->Export Tables里面包含三种导出方式,三种方式都能导出表结构以及数据,如下:
  Oracle Export
  Sql Insert
  pl/sql developer
  第一种是导出为.dmp的文件格式,.dmp文件是二进制的,可以跨平台,还能包含权限,效率也很不错,用得最广 。
  第二种是导出为.sql文件的,可用文本编辑器查看,通用性比较好,但效率不如第一种,适合小数据量导入导出。尤其注意的是表中不能有大字段(blob,clob,long),如果有,会提示不能导出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)。
  第三种是导出为.pde格式的,.pde为Pl/sql developer自有的文件格式,只能用Pl/sql developer自己导入导出,不能用编辑器查看。

posted @ 2013-11-28 11:10 顺其自然EVO 阅读(209) | 评论 (0)编辑 收藏

从操作系统角度看可执行文件的装载和执行

进程的建立:
  创建一个进程,然后装载相应的可执行文件并执行。
  1.创建一个独立的虚拟地址空间。
  2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。
  3.将cpu的指令寄存器设置为可执行文件的入口地址,启动运行。
  1.创建虚拟地址空间
  创建一个虚拟地址空间并不是真正地创建空间而是创建映射函数所需要的相应的数据结构,在i386的linux下,创建虚拟地址实际上只是分配一个页目录(Page Directory)就可以了。这一步的映射关系式虚拟空间到物理内存的映射关系。
  2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系
  可执行文件与执行该可执行文件进程的虚拟空间的映射关系只是保存在操作系统内部的一个数据结构。windows中将进程虚拟空间中的一个段叫做虚拟段,在linux中叫虚拟内存区域(VMA)。操作系统创建进程后会在进程相应的数据结构中设置一个各个段的VMA。VMA是一个很重要的概念,它对于我们理解程序的执行很热闹操作系统如何管理进程虚拟空间有非常重要的帮助。操作系统在内部保存这种结构,很明显是因为当程序执行发生页错误时,它可以通过查找这样的一个数据结构来定位错误页在可执行文件中的位置。
  3.将cpu指令寄存器设置成可执行文件入口,启动运行。
  上面的3个步骤执行完后,其他可执行文件的真正指令和数据都没有被被装入内存中。操作系统只是通过可执行文件的头部信息建立起可执行文件和进程虚存之间的映射关系而已。假设程序的入口地址为0x08048000,即刚好是.text段的起始地址。当CPU开始打算执行这个地址的指令时,发现页面0x08048000---0x08049000是一个空页面,于是就认为这是一个页错误(page fault)。CPU将控制权交给操作系统,操作系统有专门的页错误处理机制例程来处理这种情况。这时候装载过程的第二部建立的数据结构气到了关键的作用,操作系统将查询这个数据结构,然后找到空页面所在的VMA,计算相应的页面在可执行文件中的偏移,然后再物理内存中分配一个物理页面,将进程中该虚拟页与分配的物理页之间建立映射关系,然后把控制权还给进程,进程从刚才页错误的位置重新开始执行。

posted @ 2013-11-28 11:07 顺其自然EVO 阅读(305) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 177 178 179 180 181 182 183 184 185 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜