MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看

时间:2019-05-12 19:54:08下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看》。

第一篇:MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看

MySQL基本语句和连接字符串

资料引用:http://

查询速度慢的原因很多,常见如下几种:

1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

2、I/O吞吐量小,形成了瓶颈效应。

3、没有创建计算列导致查询不优化。

4、内存不足

5、网络速度慢

6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。

9、返回了不必要的行和列

10、查询语句不好,没有优化 可以通过如下方法来优化查询 :

1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要.2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)

3、升级硬件

4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最

好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的

几个值的字段建单一索引如性别字段

5、提高网速;

6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大

小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内

存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算运行

Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的

物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚

拟内存大小设置的一半)。

7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是

MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消

耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT,DELETE还不能并行处理。

8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。like 'a%' 使

用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用

CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。

9、DB Server 和application Server 分离;OLTP和OLAP分离

10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协

作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支

持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'

分区视图')

a、在实现分区视图之前,必须先水平分区表 b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这

样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上

都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置

对应用程序是透明的。

11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE.设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法

上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:

1、查询语句的词法、语法检查

2、将语句提交给DBMS的查询优化器

3、优化器做代数优化和存取路径的优化

4、由预编译模块生成查询规划

5、然后在合适的时间提交给系统处理执行

6、最后将执行结果返回给用户其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K

(8060)字节,8个页面为一个盘区,按照B树存放。

12、Commit和rollback的区别 Rollback:回滚所有的事物。Commit:提交当前的事物.没有必要在动态

SQL里写事物,如果要写请写在外面如: begin tran exec(@s)commit trans 或者将动态SQL 写成函数

或者存储过程。

13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据,浪费了服务

器的I/O资源,加重了网络的负担降低性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访

问表,后果严重。

14、SQL的注释申明对执行没有任何影响

15、尽可能不使用光标,它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在 客户端循环,用临时表,Table变量,用子查询,用Case语句等等。游标可以按照它所支持的提取选项进

行分类: 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是

默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(Update),且在组成结

果集的行中没有锁。OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并

发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。

当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。如果用户试图修改

某一行,则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变,则服务器

就会知道其他人已更新了此行,并会返回一个错误。如果值是一样的,服务器就执行修改。选择这个并

发选项 OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其

中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server

中,这个性能由 timestamp 数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个

数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有 timestamp 列的行时,SQL

Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有 timestamp

列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对

没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。

SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应

用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在

事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。

如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行

。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁 的读取。滚动锁根据在游标定义的 SELECT 语句中指定的锁提示,这些游标并发选项可以生成滚动锁。

滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务

器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一

个提交或回滚操作之后。如果提交时关闭游标的选项为关,则 COMMIT 语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项

和游标 SELECT 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定

未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更

新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提

示将使指定了该提示的表在游标内是只读的。

16、用PRofiler来跟踪查询,得到查询所需的时间,找出SQL的问题所在;用索引优化器优化索引

17、注意UNion和UNion all 的区别。UNION all好

18、注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。重复的记录在查询里是没

有问题的

19、查询时不要返回不需要的行、列

20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消

耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。SET

LOCKTIME设置锁的时间

21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行

22、在SQL2000以前,一般不要用如下的字句: “IS NULL”, “<>”, “!=”, “!>”, “!<”, “NOT”, “NOT

EXISTS”, “NOT IN”, “NOT LIKE”, and “LIKE '%500'”,因为他们不走索引全是表扫描。也不要在WHere

字句中的列名加函数,如Convert,substring等,如果必须用函数的时候,创建计算列再创建索引来替代

.还可以变通写法:WHERE SUBSTRING(firstname,1,1)= 'm'改为WHERE firstname like 'm%'(索引扫

描),一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表,使用EXISTS、NOT EXISTS,IN , LEFT OUTER JOIN 来替代,特别是左连接,而Exists比IN更快,最慢的是NOT操作.如

果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是IS NULL,“NOT”,“NOT EXISTS”, “NOT IN”能优化她,而“<>”等还是不能优化,用不到索引。

23、使用Query Analyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据

了80%的资源,我们优化的重点是这些慢的地方。

24、如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM

PersonMember(INDEX = IX_Title)WHERE processid IN('男','女')

25、将需要查询的结果预先计算好放在表中,查询的时候再SELECT。这在SQL7.0以前是最重要的手段。

例如医院的住院费计算。

26、MIN()和 MAX()能使用到合适的索引。

27、数据库有一个原则是代码离数据越近越好,所以优先选择Default,依次为Rules,Triggers,Constraint(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),Procedure.这样不

仅维护工作小,编写程序质量高,并且执行的速度快。

28、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知java是否)

。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换

成二进制值.存储过程就没有这些动作: 方法:Create procedure p_insert as insert into table

(Fimage)values(@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。

29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别

。select * from chineseresume where title in('男','女')Select * from chineseresume where

between '男' and '女' 是一样的。由于in会在比较多次,所以有时会慢些。

30、在必要是对全局或者局部临时表创建索引,有时能够提高速度,但不是一定会这样,因为索引也耗

费大量的资源。他的创建同是实际表一样。

31、不要建没有作用的事物例如产生报表时,浪费资源。只有在必要使用事物时使用它。

32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有

关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成

UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。

33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特

别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上 的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从

表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。

34、没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。

这同UNION 和UNION ALL一样的道理。

select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar

(10),ad.postDate,120)as postDate1,workyear,degreedescription FROM

jobcn_query.dbo.COMPANYAD_query ad where referenceID in

('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345', 'JCNAD00333138','JCNAD00303570','JCNAD00303569', 'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933', 'JCNAD00254567','JCNAD00254585','JCNAD00254608', 'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618', 'JCNAD00279196','JCNAD00268613')order by postdate desc

35、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。

36、当用SELECT INTO时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创

建临时表时用显示申明语句,而不是select INTO.drop table t_lxh begin tran select * into

t_lxh from chineseresume where name = 'XYZ'--commit 在另一个连接中SELECT * from sysobjects

可以看到 SELECT INTO 会锁住系统表,Create table 也会锁系统表(不管是临时表还是系统表)。所以

千万不要在事物内使用它!!这样的话如果是经常要用的临时表请使用实表,或者临时表变量。

37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他

们的执行顺序应该如下最优:select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。这样Group By 个Having的开销小,查询快.对于大的数据行进行分组

和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快

38、一次更新多条记录比分多次更新每次一条快,就是说批处理好

39、少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好

40、在SQL2000下,计算字段是可以索引的,需要满足的条件如下:

a、计算字段的表达是确定的

b、不能用在TEXT,Ntext,Image数据类型

c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….41、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优

化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句,是控制流语言的集合,速度当然快

。反复执行的动态SQL,可以使用临时存储过程,该过程(临时表)被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支

持UDFs,现在支持复杂的数学计算,函数的返回值不要太大,这样的开销很大。用户自定义函数象光标一

样执行的消耗大量的资源,如果返回大的结果采用存储过程

42、不要在一句话里再三的使用相同的函数,浪费资源,将结果放在变量里再调用更快

43、SELECT COUNT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别: select count

(Field of null)from Table 和 select count(Field of NOT null)from Table 的返回值是不同的!

44、当服务器的内存够多时,配制线程数量 = 最大连接数+5,这样能发挥最大的效率;否则使用 配制

线程数量<最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务

器的性能。

45、按照一定的次序来访问你的表。如果你先锁住表A,再锁住表B,那么在所有的存储过程中都要按照

这个顺序来锁定它们。如果你(不经意的)某个存储过程中先锁定表B,再锁定表A,这可能就会导致一

个死锁。如果锁定顺序没有被预先详细的设计好,死锁很难被发现

46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如

果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。

Process:

1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在

运行的为比标准间隔优先权低的间隔)。由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间

百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间

百分比的平均忙时。

2、%Processor Time计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或

换一个更快的处理器。

3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操

纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它

是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换

成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率

高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显

示。

4、% User Time表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可

考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。Physical Disk: Curretn

Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。

SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。注意该参数值

是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。

47、分析select emp_name form employee where salary > 3000 在此语句中若salary是Float类型的,则优化器对其进行优化为Convert(float,3000),因为3000是个整数,我们应在编程时使用3000.0而不要

等运行时让DBMS进行转化。同样字符和整型数据的转换。

48、查询的关联同写的顺序

select a.personMemberID, * from chineseresume a,personmember b where personMemberID =

b.referenceid and a.personMemberID = 'JCNPRH39681'(A = B ,B = '号码')

select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID =

b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681'(A =

B ,B = '号码',A = '号码')

select a.personMemberID, * from chineseresume a,personmember b where b.referenceid =

'JCNPRH39681' and a.personMemberID = 'JCNPRH39681'(B = '号码',A = '号码')

49、(1)IF 没有输入负责人代码 THEN code1=0 code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL

语句为: SELECT 负责人名 FROM P2000 WHERE 负责人代码>=:code1 AND负责人代码 <=:code2

(2)IF 没有输入负责人代码 THEN SELECT 负责人名 FROM P2000 ELSE code= 负责人代码 SELECT 负

责人代码 FROM P2000 WHERE 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用

了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条

件;在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运

算是最快的查询运算。我们写程序不要怕麻烦

50、关于JOBCN现在查询分页的新方法(如下),用性能优化器分析性能的瓶颈,如果在I/O或者网络的

速度上,如下的方法优化切实有效,如果在CPU或者内存上,用现在的方法更好。请区分如下的方法,说

明索引越小越好。

begin

DECLARE @local_variable table(FID int identity(1,1),ReferenceID varchar(20))

insert into @local_variable(ReferenceID)

select top 100000 ReferenceID from chineseresume order by ReferenceID

select * from @local_variable where Fid > 40 and fid <= 60 end 和

begin

DECLARE @local_variable table(FID int identity(1,1),ReferenceID varchar(20))

insert into @local_variable(ReferenceID)

select top 100000 ReferenceID from chineseresume order by updatedate

select * from @local_variable where Fid > 40 and fid <= 60

end 的不同

begin

create table #temp(FID int identity(1,1),ReferenceID varchar(20))

insert into #temp(ReferenceID)

select top 100000 ReferenceID from chineseresume order by updatedate

select * from #temp where Fid > 40 and fid <= 60 drop table #temp end

资料引用:http:// 最近在做MS SQL Server转换成MySQL的工作,总结了点经验,跟大家分享一下。同时这些也会在不断更新。也希望大家补充。

MySQL支持enum,和set类型,SQL Server不支持 MySQL不支持nchar,nvarchar,ntext类型 MySQL的递增语句是AUTO_INCREMENT,而MS SQL是identity(1,1)MS SQL默认到处表创建语句的默认值表示是((0)),而在MySQL里面是不允许带两括号的 MySQL需要为表指定存储类型 MS SQL识别符是[],[type]表示他区别于关键字,但是MySQL却是 `,也就是按键1左边的那个符号 MS SQL支持getdate()方法获取当前时间日期,但是MySQL里面可以分日期类型和时间类型,获取当前日期是cur_date(),当前完整时间是 now()函数 MS SQL不支持replace into 语句,但是在最新的sql20008里面,也支持merge语法 MySQL支持insert into table1 set t1 = ‘’, t2 = ‘’ ,但是MS SQL不支持这样写 MySQL支持insert into tabl1 values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1)MS SQL不支持limit语句,是非常遗憾的,只能用top 取代limt 0,N,row_number()over()函数取代limit N,M MySQL在创建表时要为每个表指定一个存储引擎类型,而MS SQL只支持一种存储引擎 MySQL不支持默认值为当前时间的datetime类型(MS SQL很容易做到),在MySQL里面是用timestamp类型 MS SQL里面检查是否有这个表再删除,需要这样:

if exists(select *

from

dbo.sysobjects

where id = object_id(N'uc_newpm')and OBJECTPROPERTY(id,N'IsUserTable')=1)但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;

但是在MySQL里面只需要 DROP TABLE IF EXISTS cdb_forums;MySQL支持无符号型的整数,那么比不支持无符号型的MS SQL就能多出一倍的最大数存储 MySQL不支持在MS SQL里面使用非常方便的varchar(max)类型,这个类型在MS SQL里面既可做一般数据存储,也可以做blob数据存储 MySQL创建非聚集索引只需要在创建表的时候指定为key就行,比如:KEY displayorder(fid,displayorder)在MS SQL里面必须要:

create MySQL text字段类型不允许有默认值

19MySQL的一个表的总共字段长度不超过65XXX。

20一个很表面的区别就是MySQL的安装特别简单,而且文件大小才110M(非安装版),相比微软这个庞然大物,安装进度来说简直就是.....21MySQL的管理工具有几个比较好的,MySQL_front,和官方那个套件,不过都没有SSMS的使用方便,这是MySQL很大的一个缺点。

22MySQL的存储过程只是出现在最新的版本中,稳定性和性能可能不如MS SQL。同样的负载压力,MySQL要消耗更少的CPU和内存,MS SQL的确是很耗资源。

24php连接MySQL和MS SQL的方式都差不多,只需要将函数的MySQL替换成MS SQL即可。

25MySQL支持date,time,year类型,MS SQL到2008才支持date和time。unique nonclustered

indexindex_uc_protectedmembers_username_appid

on dbo.uc_protectedmembers(username asc,appid asc)-

资料引用:http:// 经典sql语句,实现了修改,增加,删除,判断表字段

create database test1 use test1 create table admin(id int PRimary key ,name varchar(50),pwd varchar(50),)insert into admin values(1,'aa','aa')alter table

admin

add

tel varchar(50)

NULL select * from admin

select * from admin

if

exists

(select

*

from

syscolumns

where

id=object_id('admin')

and

name='mms')

print

'已经存在该字段' alter table

admin

add

tel varchar(50)

NULL

alter table admin alter column name set bbs varchar(50)null alter table tablename drop column oldfield

EXEC sp_rename 'admin.sss', 'tel', 'COLUMN'

资料引用:http://

查询重复值,显示出不重复的部分

select distinct(employeeid)from orders

------------------

查询两个表之间相同数据

select orders.EmployeeID,Employees.EmployeeID from orders INNER JOIN Employees on Employees.EmployeeID=orders.EmployeeID

实现目的,一个表存放用户编号和用户名,在另一个表中可以根据用户编号,把用户名直接引用过去,节省数据库空间

SQL创建数据库、表、存储过程及调用--如果存在数据库PRogrammerPay 就删除

if exists(select * from sysdatabases where name='programmerPay')drop database programmerPay go

--创建数据库programmerPay create database programmerPay on primary(name ='programmerPay_data', filename='D:programmerPayprogrammerPay_data.mdf', maxsize=3mb, filegrowth=15%)log on(name ='programmerPay_log', filename='D:programmerPayprogrammerPay_log.ldf', maxsize=1mb, filegrowth=15%)go

use programmerPay go--创建表prowage create table prowage(id int identity(1,1)not null,--主键 标识列 Pname char(10)not null,--程序员姓名 wage int not null--程序员工资)go

--为表prowage id 字段添加主键约束 alter table prowage

add constraint PK_id primary key(id)--插入测试数据

insert into prowage(pname,wage)values('张三',5000)insert into prowage(pname,wage)values('李四',1200)insert into prowage(pname,wage)values('二月',1700)insert into prowage(pname,wage)values('蓝天',5700)insert into prowage(pname,wage)values('阳光',8700)insert into prowage(pname,wage)values('神州',1100)insert into prowage(pname,wage)values('曾经藏',1300)insert into prowage(pname,wage)values('ruo',1200)insert into prowage(pname,wage)values('chend',1400)

--如果存在存储过程proc_addWage1 就删除

if exists(select * from sysobjects where name='proc_addWage1')drop procedure proc_addWage1 go

--创建存储过程proc_addWage1 create procedure proc_addWage1 as set nocount on declare @firstwage int

select @firstwage=sum(wage)from prowage while(1=1)

begin

declare @notpass int, @count int--定义两个变量 没达到2200的人数和总人数

select @notpass=count(*)from prowage where wage<2200

select @count =count(*)from prowage

if(@notpass*2>@count)

update prowage set wage=wage+100

else

break

end declare @endwage int

select @endwage=sum(wage)from prowage print'一共加薪'+convert(varchar(5),@endwage-@firstwage)print'加薪后的程序员工资列表:' select ID ,Pname,wage from prowage go

--如果存在存储过程proc_addWage2 就删除

if exists(select * from sysobjects where name='proc_addWage2')drop procedure proc_addWage2 go

--创建存储过程proc_addWage2 create procedure proc_addWage2 as set nocount on while(1=1)

begin

declare @avgwage int--定义变量平均工资

select @avgwage =avg(wage)from prowage

if(@avgwage<4500)

update prowage set wage=wage+200

else

break

end go

exec proc_addWage1--调用存储过程 proc_addWage1 exec proc_addwage2--调用存储过程 proc_addwage2

资料引用:http://

-JAVA程序员JAVA工程师面试必看

第二篇:JAVA时间格式化处理-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看

JAVA时间格式化处理 日期格式化

import java.util.Date;import java.text.SimpleDateFormat;class dayTime { public static void main(String args[]){ Date nowTime=new Date();System.out.println(nowTime);SimpleDateFormat time=new SimpleDateFormat(“yyyy MM dd HH mm ss”);System.out.println(time.format(nowTime));} }

2007-05-17 09:54 转载地址

http://tb.blog.csdn.net/TrackBack.aspx?PostId=3809041、通过MessageFormat转化

String dateTime = MessageFormat.format(“{0,date,yyyy-MM-dd-HH-mm:ss:ms}” , new Object[] { new java.sql.Date(System.currentTimeMillis())});说明: yyyy-MM-dd-HH-mm:ss:ms 年yyyy 月MM 日dd 时(大写为24进制,小写为12进制)分mm 秒ss 微妙ms

2、修改数据库时用

queryDataSet.setDate(“dateField”, new java.sql.Date(new java.util.Date().getTime()));queryDataSet.setDate(“dateField”, new java.sql.Date.valueOf(“2005-05-03”));

3、通过SimpleDateFormat 转化

SimpleDateFormat dateFm = new SimpleDateFormat(“yyyy-MM-dd”);//格式化当前系统日期 String dateTime = dateFm.format(new java.util.Date());

4、具体讨论

Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象.我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算.我们将讨论下面的类:

1、具体类(和抽象类相对)java.util.Date

2、抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat

3、抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar

具体类可以被实例化, 但是抽象类却不能.你首先必须实现抽象类的一个具体子类.Date 类从Java 开发包(JDK)1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年.这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它.这种改进旨在更好的处理日期数据的国际化格式.就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.一、创建一个日期对象

让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子.这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.//-----------------------import java.util.Date;

public class DateExample1 { public static void main(String[] args){ // Get the system date/time Date date = new Date();

System.out.println(date.getTime());} } //-----------------------

在星期六, 2001年9月29日, 下午大约是6:50的样子, 上面的例子在系统输出设备上显示的结果是 1001803809710.在这个例子中,值得注意的是我们使用了Date 构造函数创建一个日期对象, 这个构造函数没有接受任何参数.而这个构造函数在内部使用了System.currentTimeMillis()方法来从系统获取日期.那么, 现在我们已经知道了如何获取从1970年1月1日开始经历的毫秒数了.我们如何才能以一种用户明白的格式来显示这个日期呢? 在这里类java.text.SimpleDateFormat 和它的抽象基类 java.text.DateFormat 就派得上用场了.二、日期数据的定制格式 假如我们希望定制日期数据的格式, 比方星期六-9月-29日-2001年.下面的例子展示了如何完成这个工作:

//-----------------------import java.text.SimpleDateFormat;import java.util.Date;

public class DateExample2 {

public static void main(String[] args){

SimpleDateFormat bartDateFormat = new SimpleDateFormat(“EEEE-MMMM-dd-yyyy”);

Date date = new Date();

System.out.println(bartDateFormat.format(date));} } //-----------------------

只要通过向SimpleDateFormat 的构造函数传递格式字符串“EEE-MMMM-dd-yyyy”, 我们就能够指明自己想要的格式.你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分.EEEE是星期, MMMM是月, dd是日, yyyy是年.字符的个数决定了日期是如何格式化的.传递“EE-MM-dd-yy”会显示 Sat-09-29-01.请察看Sun 公司的Web 站点获取日期格式化选项的完整的指示.三、将文本数据解析成日期对象

假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象.我们将再次以格式化字符串“MM-dd-yyyy” 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据.我们的例子, 显示在下面, 将解析文本字符串“9-29-2001”并创建一个值为001736000000 的日期对象.//-----------------------import java.text.SimpleDateFormat;import java.util.Date;

public class DateExample3 {

public static void main(String[] args){ // Create a date formatter that can parse dates of // the form MM-dd-yyyy.SimpleDateFormat bartDateFormat = new SimpleDateFormat(“MM-dd-yyyy”);

// Create a string containing a text date to be parsed.String dateStringToParse = “9-29-2001”;

try { // Parse the text version of the date.// We have to perform the parse method in a // try-catch construct in case dateStringToParse // does not contain a date in the format we are expecting.Date date = bartDateFormat.parse(dateStringToParse);

// Now send the parsed date as a long value // to the system output.System.out.println(date.getTime());} catch(Exception ex){ System.out.println(ex.getMessage());} } } //-----------------------

四、使用标准的日期格式化过程

既然我们已经可以生成和解析定制的日期格式了, 让我们来看一看如何使用内建的格式化过程.方法 DateFormat.getDateTimeInstance()让我们得以用几种不同的方法获得标准的日期格式化过程.在下面的例子中, 我们获取了四个内建的日期格式化过程.它们包括一个短的, 中等的, 长的, 和完整的日期格式.//-----------------------import java.text.DateFormat;import java.util.Date;

public class DateExample4 {

public static void main(String[] args){ Date date = new Date();

DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT);

DateFormat mediumDateFormat = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);

DateFormat longDateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG);

DateFormat fullDateFormat = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);

System.out.println(shortDateFormat.format(date));System.out.println(mediumDateFormat.format(date));System.out.println(longDateFormat.format(date));System.out.println(fullDateFormat.format(date));} } //-----------------------

注意我们在对 getDateTimeInstance的每次调用中都传递了两个值.第一个参数是日期风格, 而第二个参数是时间风格.它们都是基本数据类型int(整型).考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL.要知道获取时间和日期格式化过程的更多的方法和选项, 请看Sun 公司Web 站点上的解释.运行我们的例子程序的时候, 它将向标准输出设备输出下面的内容: 9/29/01 8:44 PM Sep 29, 2001 8:44:45 PM September 29, 2001 8:44:45 PM EDT Saturday, September 29, 2001 8:44:45 PM EDT

五、Calendar 类

我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类.就如我们前面提到的那样, Calendar 类中的方法替代了Date 类中被人唾骂的方法.假设你想要设置, 获取, 和操纵一个日期对象的各个部分, 比方一个月的一天或者是一个星期的一天.为了演示这个过程, 我们将使用具体的子类 java.util.GregorianCalendar.考虑下面的例子, 它计算得到下面的第十个星期五是13号.//-----------------------import java.util.GregorianCalendar;import java.util.Date;import java.text.DateFormat;

public class DateExample5 {

public static void main(String[] args){ DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);

// Create our Gregorian Calendar.GregorianCalendar cal = new GregorianCalendar();

// Set the date and time of our calendar // to the system&s date and time cal.setTime(new Date());

System.out.println(“System Date: ” + dateFormat.format(cal.getTime()));

// Set the day of week to FRIDAY cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);System.out.println(“After Setting Day of Week to Friday: ” + dateFormat.format(cal.getTime()));

int friday13Counter = 0;

while(friday13Counter <= 10){

// Go to the next Friday by adding 7 days.cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

// If the day of month is 13 we have // another Friday the 13th.if(cal.get(GregorianCalendar.DAY_OF_MONTH)== 13){ friday13Counter++;System.out.println(dateFormat.format(cal.getTime()));} } } } //-----------------------

在这个例子中我们作了有趣的函数调用: cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY);和: cal.add(GregorianCalendar.DAY_OF_MONTH, 7);

set 方法能够让我们通过简单的设置星期中的哪一天这个域来将我们的时间调整为星期五.注意到这里我们使用了常量 DAY_OF_WEEK 和 FRIDAY来增强代码的可读性.add 方法让我们能够在日期上加上数值.润年的所有复杂的计算都由这个方法自动处理.我们这个例子的输出结果是: System Date: Saturday, September 29, 2001 当我们将它设置成星期五以后就成了: Friday, September 28, 2001 Friday, September 13, 2002 Friday, December 13, 2002 Friday, June 13, 2003 Friday, February 13, 2004 Friday, August 13, 2004 Friday, May 13, 2005 Friday, January 13, 2006 Friday, October 13, 2006 Friday, April 13, 2007 Friday, July 13, 2007 Friday, June 13, 2008

六、时间掌握在你的手里

有了这些Date 和Calendar 类的例子, 你应该能够使用 java.util.Date, java.text.SimpleDateFormat, 和 java.util.GregorianCalendar 创建许多方法了.5、具体讨论2 这里只讨论java中对日期的几个简单类: 1.java.util.Date 2.java.text.DateFormat(Abstract),java.text.SimpleDateFormat 3.java.util.Calendar(Abstract),java.util。GregorianCalendar 首先看一下Date类,Date中只提供了几个获得本地时间的方法,具体用法见下: import java.util.Date; public class DateFormatTest { public DateFormatTest(){ }

public static void main(String[] args){ Date dt=new Date();

String localeString=dt.toLocaleString(); String gmtString=dt.toGMTString(); System.out.println(localeString); System.out.println(gmtString); System.out.println(dt.getTime());

System.out.println(System.currentTimeMillis()); } } 输出结果为: 2004-12-31 9:34:04 31 Dec 2004 01:34:04 GMT 1104456844281 1104456844500 从结果中可以看到,dt.getTime()与System.currentTimeMillis()这两个方法得到的时间是相同的。因为Date的构造函数中调用了System.currentTimeMillis()方法来从系统获得当前时间。其结果实际上是从1970年1月1日开始到当前所经历的毫秒数。以下的例子展示的是一个简单的格式化日期的代码: import java.text.*; import java.util.Locale; import java.util.Date; public class DateFormatTest { public DateFormatTest(){ }

public static void main(String[] args){ DateFormat df=DateFormat.getDateInstance();

SimpleDateFormat defaultSDF=new SimpleDateFormat(); SimpleDateFormat sdf=new SimpleDateFormat(“yyyy-MM-dd”); System.out.println(new Date());

System.out.println(df.format(new Date())); System.out.println(defaultSDF.format(new Date())); System.out.println(sdf.format(new Date())); }}

输出结果是:

Fri Dec 31 09:48:19 CST 2004 2004-12-31 04-12-31 上午9:48 2004-12-31

SimpleDateFormat的构造函数中String中字符的含义列如下表: Letter Date or Time Component Presentation Examples G Era designator Text AD y Year Year 1996; 96 M Month in year Month July; Jul; 07 w Week in year Number 27 W Week in month Number 2 D Day in year Number 189 d Day in month Number 10 F Day of week in month Number 2 E Day in week Text Tuesday; Tue a Am/pm marker Text PM H Hour in day(0-23)Number 0 k Hour in day(1-24)Number 24 K Hour in am/pm(0-11)Number 0 h Hour in am/pm(1-12)Number 12 m Minute in hour Number 30 s Second in minute Number 55 S Millisecond Number 978 z Time zone General time zone Pacific Standard Time; PST; GMT-08:00 Z Time zone RFC 822 time zon 上面展示的例子是将Date格式化成我们想要的格式,通常还会遇到需要将有些已经格式好的String再解析成Date的问题。在下面的文章中将会讲到。import java.text.*;import java.util.Locale;import java.util.Date;public class DateFormatTest { public DateFormatTest(){ } public static void main(String[] args){ String dateToparse=“30-12-2004”;

SimpleDateFormat sdf=new SimpleDateFormat(“dd-MM-yyyy”)Date dt=new Date()try{ dt=sdf.parse(dateToparse)System.out.print(dt)}catch(Exception e){ e.printStackTrace();}}}-JAVA程序员JAVA工程师面试必看

第三篇:Java之reference-JAVA程序员JAVA工程师面试必看

-JAVA程序员JAVA工程师面试必看

Reference

Java世界泰山北斗级大作《Thinking In Java》切入Java就提出“Everything is Object”。在Java这个充满Object的世界中,reference是一切谜题的根源,所有的故事都是从这里开始的。

Reference是什么?

如果你和我一样在进入Java世界之前曾经浪迹于C/C++世界,就一定不会对指针陌生。谈到指针,往日种种不堪回首的经历一下子涌上心头,这里不是抱怨的地方,让我们暂时忘记指针的痛苦,回忆一下最初接触指针的甜蜜吧!还记得你看过的教科书中,如何讲解指针吗?留在我印象中的一种说法是,指针就是地址,如同门牌号码一样,有了地址,你可以轻而易举找到一个人家,而不必费尽心力的大海捞针。

C++登上历史舞台,reference也随之而来,容我问个小问题,指针和reference区别何在?我的答案来自于在C++世界享誉盛名的《More Effective C++》。

1.2.3.4.没有null reference。reference必须有初值。使用reference要比使用指针效率高。因为reference不需要测试其有效性。指针可以重新赋值,而reference总是指向它最初获得的对象

设计选择:

当你指向你需要指向的某个东西,而且绝不会改指向其它东西,或是当你实作一个运算符而其语法需要无法有指针达成,你就应该选择reference。其它任何时候,请采用指针。

这和Java有什么关系?

初学Java,鉴于reference的名称,我毫不犹豫的将它和C++中的reference等同起来。不过,我错了。在Java中,reference可以随心所欲的赋值置空,对比一下上面列出的差异,就不难发现,Java的reference如果要与C/C++对应,它不过是一个穿着reference外衣的指针而已。

于是,所有关于C中关于指针的理解方式,可以照搬到Java中,简而言之,reference就是一个地址。我们可以把它想象成一个把手,抓住它,就抓住了我们想要操纵的数据。如同掌握C的关键在于掌握指针,探索Java的钥匙就是reference。

一段小程序

我知道,太多的文字总是令人犯困,那就来段代码吧!

public class ReferenceTricks {

public static void main(String[] args){

ReferenceTricks r = new ReferenceTricks();

// reset integer

r.i = 0;

System.out.println(“Before changeInteger:” + r.i);

changeInteger(r);

System.out.println(“After changeInteger:” + r.i);

// just for format

System.out.println();

// reset integer

r.i = 0;

System.out.println(“Before changeReference:” + r.i);

changeReference(r);

System.out.println(“After changeReference:” + r.i);

}

private static void changeReference(ReferenceTricks r){

r = new ReferenceTricks();

r.i = 5;

System.out.println(“In changeReference: ” + r.i);

}

private static void changeInteger(ReferenceTricks r){

r.i = 5;

System.out.println(“In changeInteger:” + r.i);

}

public int i;

}

对不起,我知道,把一个字段设成public是一种不好的编码习惯,这里只是为了说明问题。

如果你有兴趣自己运行一下这个程序,我等你!

OK,你已经运行过了吗?结果如何?是否如你预期?下面是我在自己的机器上运行的结果:

Before changeInteger:0

In changeInteger:5

After changeInteger:5

Before changeReference:0

In changeReference: 5

After changeReference:0

这里,我们关注的是两个change——changeReference和changeInteger。从输出的内容中,我们可以看出,两个方法在调用前和调用中完全一样,差异出现在调用后的结果。

糊涂的讲解

先让我们来分析一下changeInteger的行为。

前面说过了,Java中的reference就是一个地址,它指向了一个内存空间,这个空间存放着一个对象的相关信息。这里我们暂时不去关心这个内存具体如何排布,只要知道,通过地址,我们可以找到r这个对象的i字段,然后我们给它赋成5。既然这个字段的内容得到了修改,从函数中返回之后,它自然就是改动后的结果了,所以调用之后,r对象的i字段依然是5。下图展示了changeInteger调用前后内存变化。

Reference +--------+Reference +--------+

---------->| i = 0|---------->| i = 5|

|--------||--------|

| Memory || Memory |

||||

||||

+--------++--------+

调用changeInteger之前调用changeInteger之后

让我们把目光转向changeReference。

从代码上,我们可以看出,同changeInteger之间的差别仅仅在于多了这么一句。

r = new ReferenceTricks();

这条语句的作用是分配一块新的内存,然后将r指向它。

执行完这条语句,r就不再是原来的r,但它依然是一个ReferenceTricks的对象,所以我们依然可以对这个r的i字段赋值。到此为止,一切都是那么自然。

Reference +--------++--------+

---------->| i = 0|| i = 0|

|--------||--------|

| Memory || Memory |

||Reference |--------|

||---------->| i = 5|

+--------++--------+

调用changeReference之前调用changeReference之后

顺着这个思路继续下去的话,执行完changeReference,输出的r的i字段,那么应该是应该是新内存中的i,所以应该是5。至于那块被我们抛弃的内存,Java的GC功能自然会替我们善后的。

事与愿违。

实际的结果我们已经看到了,输出的是0。

肯定哪个地方错了,究竟是哪个地方呢?

参数传递的秘密

知道方法参数如何传递吗?

记得刚开始学编程那会儿,老师教导,所谓参数,有形式参数和实际参数之分,参数列表中写的那些东西都叫形式参数,在实际调用的时候,它们会被实际参数所替代。

编译程序不可能知道每次调用的实际参数都是什么,于是写编译器的高手就出个办法,让实际参数按照一定顺序放到一个大家都可以找得到的地方,以此作为方法调用的一种约定。所谓“没有规矩,不成方圆”,有了这个规矩,大家协作起来就容易多了。这个公共数据区,现在编译器的选择通常是“栈”,而所谓的顺序就是形式参数声明的顺序。

显然,程序运行的过程中,作为实际参数的变量可能遍布于内存的各个位置,而并不一定要老老实实的呆在栈里。为了守“规矩”,程序只好将变量复制一份到栈中,也就是通常所说的将参数压入栈中。

打起精神,谜底就要揭晓了。

我刚才说什么来着?将变量复制一份到栈中,没错,“复制”!

这就是所谓的值传递。

C语言的旷世经典《The C Programming Language》开篇的第一章中,谈到实际参数时说,“在C中,所有函数的实际参数都是传„值‟的”。

马上会有人站出来,“错了,还有传地址,比如以指针传递就是传地址”。

不错,传指针就是传地址。在把指针视为地址的时候,是否考虑过这样一个问题,它也是一个变量。前面的讨论中说过了,参数传递必须要把参数压入栈中,作为地址的指针也不例外。所以,必须把这个指针也复制一份。函数中对于指针操作实际上是对于这个指针副本的操作。

Java的reference等于C的指针。所以,在Java的方法调用中,reference也要复制一份压入堆栈。在方法中对reference的操作就是对这个reference副本的操作。

谜底揭晓

好,让我们回到最初的问题上。

在changeReference中对于reference的赋值实际上是对这个reference的副本进行赋值,而对于reference的本尊没有产生丝毫的影响。

回到调用点,本尊醒来,它并不知道自己睡去的这段时间内发生过什么,所以只好当作什么都没发生过一般。就这样,副本消失了,在方法中对它的修改也就烟消云散了。

也许你会问出这样的问题,“听了你的解释,我反而对changeInteger感到迷惑了,既然是对于副本的操作,为什么changeInteger可以运作正常?”

呵呵,很有趣的大脑短路现象。

好,那我就用前面的说法解释一下changeInteger的运作。

所谓复制,其结果必然是副本完全等同于本尊。reference复制的结果必然是两个reference指向同一块内存空间。

虽然在方法中对于副本的操作并不会影响到本尊,但对内存空间的修改确实实实在在的。

回到调用点,虽然本尊依然不知道曾经发生过的一切,但它按照原来的方式访问内存的时候,取到的确是经过方法修改之后的内容。

于是方法可以把自己的影响扩展到方法之外。

多说几句

这个问题起源于我对C/C++中同样问题的思考。同C/C++相比,在changeReference中对reference赋值可能并不会造成什么很严重的后果,而在C/C++中,这么做却会造成臭名昭著的“内存泄漏”,根本的原因在于Java拥有了可爱的GC功能。即便这样,我仍不推荐使用这种的手法,毕竟GC已经很忙了,我们怎么好意思再麻烦人家。

在C/C++中,这个问题还可以继续引申。既然在函数中对于指针直接赋值行不通,那么如何在函数中修改指针呢?答案很简单,指针的指针,也就是把原来的指针看作一个普通的数据,把一个指向它的指针传到函数中就可以了。

同样的问题到了Java中就没有那么美妙的解决方案了,因为Java中可没有reference的reference这样的语法。可能的变通就是将reference进行封装成类。至于值不值,公道自在人心。

 

  评论 09:50浏览(171)评论(1)分类:收藏相关推荐

2008-06-27

public class ReferenceTricks {

public static void main(String[] args){

ReferenceTricks r = new ReferenceTricks();

// reset integer

r.i = 0;

System.out.println(“Before changeInteger:” + r.i);

changeInteger(r);

System.out.println(“After changeInteger:” + r.i);

// just for format

System.out.println();

// reset integer

r.i = 0;

System.out.println(“Before changeReference:” + r.i);

changeReference(r);

System.out.println(“After changeReference:” + r.i);

}

private static void changeReference(ReferenceTricks r){

r = new ReferenceTricks();

r.i = 5;

System.out.println(“In changeReference: ” + r.i);

}

private static void changeInteger(ReferenceTricks r){

r.i = 5;

System.out.println(“In changeInteger:” + r.i);

}

public

举的例子不太相符,用来理解java传 参机制倒是不错的例子

-JAVA程序员JAVA工程师面试必看

第四篇:java工程师面试

精通java语言及面向对象思想 具有扎实的java编程基础和良好的编程规范

精通 jsp语言 html语言 javascript脚本以及css 样式

熟练掌握sqlserver oracle 数据库

熟练使用Spring+Hibernate+Struts 以及 Spring+JDBC+Struts开发

精通Struts+jdbc开发 精通MVC框架开发

精通tomcat运用服务器 熟悉weblogic运用服务器 并可配合eclipse进行开发 熟练使用ant log4j junit 等辅助开发工具

熟练使用CVS/VSS项目同步工具

对factory DAO singleton 等软件设计模式有很好的理解

对oracle数据库性能及oracle代码的规范性和java代码执行效率以及java缺陷有很好的理解与掌握

熟悉大型项目的开发流程 对业务需求能很好的细致理解,熟练书写概要设计 需求分析 详细设计等文档

2年多累积java代码30000行 数据库代码10000行 具有实际大型项目(江苏电信)开发经验和个人独自完成小项目的能力

具备强烈的学习欲望,工作认真负责,且具有很强的责任心和进取心,与人为善善于沟通,有很好的团队合作精有神。

江苏移动秘书 12580 负责个人电话本和呼叫信息增删查改的开发

负责江苏移动秘书两个版本IVR接口csp3.0以及csp6.0的切换开发,录音放音的控件的使用,使用rational rose绘制UML用例图,类图,时序图等在项目中熟练使用cvs和vss开发同步工具,灵活运用ajax特效,buffalo特效,熟练书写存储过程,函数,等ORACLE代码以及基于定时器的函数。

第五篇:JAVA程序员面试技巧

java程序员面试题 第一部分:选择题 question no: 1

1、public class test { public static void changestr(string str){ } public static void main(string[] args){ string str=1234;changestr(str);system.out.println(str);} } please write the output result : question no:2 1.public class test { 2.static boolean foo(char c){ 3.system.out.print(c);4.return true;5.} 6.public static void main(string[] argv){ 7.int i =0;8.for(foo(a);foo(b)&&(i<2);foo(c)){ 9.i++;10.foo(d);12.} 13.} 14.} what is the result? a.abdcbdcb b.abcdabcd d.an exception is thrown at runtime.question no: 3 1.class a { 2.protected int method1(int a, int b){ return 0;} 3.} which two are valid in a class that extends class a?(choose two)a.public int method1(int a, int b){ return 0;} b.private int method1(int a, int b){ return 0;} c.private int method1(int a, long b){ return 0;} d.public short method1(int a, int b){ return 0;} e.static protected int method1(int a, int b){ return 0;} question no: 4 1.public class outer{ 2.public void someoutermethod(){ 3.// line 3 4.} 5.public class inner{} 6.public static void main(string[]argv){ 7.outer o = new outer();8.// line 8 9.} 10.} which instantiates an instance of inner? a.new inner();// at line 3 b.new inner();// at line 8 c.new o.inner();// at line 8 d.new outer.inner();// at line 8//new outer().new inner()question no: 5 which method is used by a servlet to place its session id in a url that is written to the servlet’s response output stream? question no: 6 which two are equivalent?(choose two)a.b.c.d.e.f.g.question no: 7 which of the following statements regarding the lifecycle of a session bean are correct? 1.java.lang.illegalstateexception is thrown if sessioncontext.getejbobject()is invoked when a stateful session bean instance is passivated.2.sessioncontext.getrollbackonly()does not throw an exception when a session bean with bean-managed transaction demarcation is activated.3.an exception is not thrown when sessioncontext.getusertransaction()is called in the afterbegin method of a bean with container-managed transactions.5.accessing resource managers in the sessionsynchronization.afterbegin method of a stateful session bean with bean-managed transaction does not throw an exception.第二部分:概念题

1.描述struts体系结构?对应各个部分的开发工作主要包括哪些? 3.jsp有哪些内置对象和动作?它们的作用分别是什么?

4、sql问答题

select * from table 和

select * from table where name like %% and addr like %% and(1_addr like %% or 2_addr like %% or 3_addr like %% or 4_addr like %%)的检索结果为何不同?

5、sql问答题

表结构:

1、表名:g_cardapply 字段(字段名/类型/长度): g_applyno varchar 8;//申请单号(关键字)g_applydate bigint 8;//申请日期 g_state varchar 2;//申请状态

2、表名:g_cardapplydetail 字段(字段名/类型/长度): g_applyno varchar 8;//申请单号(关键字)g_name varchar 30;//申请人姓名 g_idcard varchar 18;//申请人身份证号 g_state varchar 2;//申请状态

其中,两个表的关联字段为申请单号。

题目:

1、查询身份证号码为***的申请日期

2、查询同一个身份证号码有两条以上记录的身份证号码及记录个数

3、将身份证号码为***的记录在两个表中的申请状态均改为07

4、删除g_cardapplydetail表中所有姓李的记录

华为java笔试题

一、单项选择题

1.java是从()语言改进重新设计。a.ada b.c++ c.pasacal d.basic篇二:java程序员面试注意事项

一、回答问题的思路

先正面叙述一些基本的核心知识,然后描述一些特殊的东西,最后再来一些锦上添花的东西。要注意有些不是锦上添花,而是画蛇添足的东西,不要随便写上。把答题像写书一样写。我要回答一个新技术的问题大概思路和步骤是:我们想干什么,干这个遇到了什么问题,现在用什么方式来解决。其实我们讲课也是这样一个思路。

答题时,先答是什么,再答有什么作用和要注意什么(这部分最重要,展现自己的心得)。答案的层次分明,条理清楚都非常重要,从这些表面的东西也可以看出一个人的习惯、办事风格、条理等。要讲你做出答案的思路过程,或者说你记住答案的思想都写下来。把答题想着是辩论赛。答题就是给别人讲道理、摆事实。答题不局限于什么格式和形式,就是要将自己的学识展现出来!

另外,不要因为人家题目本来就模棱两可,你就心里胆怯和没底气了,不敢回答了。你要大胆地指出对方题目很模糊和你的观点,不要把面试官想得有多高,其实他和你就是差不多的,你想想,如果他把你招进去了,你们以后就是同事了,可不是差不多的吗?

二、关于就业薪水

如果你是应届生,那不能要高工资,好比大饼的故事,要拿高工资,就去中关村!少数人基础确实很好,在校期间确实又做过一些项目,那仍然是可以要到相对高的工资的。

初级程序员薪水:2000-4500 中级程序员薪水:4000-7000 高级程序员薪水:7000以上

公司招聘程序员更看重的要用到的编码技术、而不是那些业务不太相关的所谓项目经历:

三、公司想招什么样的人

对于一些公司接到了一些项目,想招聘一些初中级的程序员过来帮助写代码,完成这个项目,你更看重的是他的专业技术功底,还是以前做过几个项目的经历呢?我们先排除掉那些编码技术功底好,又正好做过相似项目的情况,实际上,这种鱼和熊掌兼得的情况并不常见。其实公司很清楚,只要招聘进来的人技术真的很明白,那他什么项目都可以做出来,公司招人不是让你去重复做你以前的项目,而是做一个新项目,业务方面,你只要进了项目团队,自然就能掌握。所以,大多数招聘单位在招聘那些编码级别的程序员时也没指望能招聘到做过类似项目的人,也不会刻意去找做过类似项目的人,用人单位也不是想把你招进,然后把你以前做过的项目重做一遍,所以,用人单位更看重招进来的人对要用到的编码技术的功底到底怎样,技术扎实不扎实,项目则只要跟着开发团队走,自然就没问题。除非是一些非常专业的行业,要招聘特别高级的开发人员和系统分析师,招聘单位才特别注重他的项目经验和行业经验,要去找到行业高手,公司才关心项目和与你聊项目的细节,这样的人通常都不是通过常规招聘渠道去招聘进来的,而是通过各种手段挖过来的,这情况不再我今天要讨论的范围中。

四、公司面试会问什么,.技术学得明白不明白,人家几个问题就把你的深浅问出来了,只要问一些具体的技术点,就很容易看出你是真懂还是假懂,很容看出你的技术深度和实力,所以,技术是来不得半点虚假的,必须扎扎实实。

由于项目的种类繁多,涉及到现实生活中的各行各业,什么五花八门的业务都有,例如,酒店房间预定管理,公司车辆调度管理,学校课程教室管理,超市进销存管理,知识内容管理,等等……成千上万等等,但是,不管是什么项目,采用的无非都是我们学习的那些目前流行和常用的技术。技术好、经验丰富,则项目做出来的效率高些,程序更稳定和更容易维护些;技术差点,碰碰磕磕最后也能把项目做出来,无非是做的周期长点、返工的次数多点,程序代码写得差些,用的技术笨拙点。如果一个人不是完完全全做过某个项目,他是不太关心该项目的业务的,对其中的一些具体细节更是一窍不知,(如果我招你来做图书管理,你项目经历说你做过汽车调度,那我能问你汽车调度具体怎么回事吗?不会,所以,你很容易蒙混过去的)而一个程序员的整个职业生涯中能实实在在和完完整整做出来的项目没几个,更别说在多个不同行业的项目了,有的程序员更是一辈子都只是在做某一个行业的项目,结果他就成了这个行业的专家(专门干一件事的家伙)。所以,技术面试官通常没正好亲身经历过你简历写的那些项目,他不可能去问你写的那些项目的具体细节,而是只能泛泛地问你这个项目是多少人做的,做了多长时间,开发的过程,你在做项目的过程中有什么心得和收获,用的什么技术等面上的问题,所以,简历上的项目经历可以含有很多水分,很容易作假,技术面试官也无法在项目上甄别你的真伪。

五、简历怎么写

简历该怎么写:精通哪些技术,有一些什么项目经历

六、怎样达到简历上的标准(培训中心教项目的目的)教项目是为了巩固和灵活整合运用技术,增强学习的趣味性,熟悉做项目的流程,或得一些专业课程中无法获得的特有项目经验,增强自己面试的信心。讲的项目应该真实可靠才有价值,否则,表面上是项目,实际上还是知识点的整合,对巩固技术点和增强学习的趣味性,但无法获得实际的项目经验。

下载MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看word格式文档
下载MySQL基本语句和连接字符串-JAVA程序员JAVA工程师面试必看.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    java程序员面试必读

    Java程序员,面试必读☆★☆★快来!!10月25日读者见面会☆★☆★ 清华大学出版社《Java程序员,上班那点事儿》作者:钟声 章节:1.2.2: 面试是一个“简单”而又“复杂”的事情,正因为......

    java程序员面试要点

    第一,谈谈final, finally, finalize的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。finally是异常处理语句结构的一部分,表示总是执行。fina......

    Java程序员面试(大全5篇)

    Java程序员面试三十二问第一,谈谈final, finally, finalize的区别。 Fanal 修饰符 可以修饰类,属性和方法。 被修饰的类不可以派生子类,不能被作为父类被继承。它修饰的属性......

    程序员面试个人简历(JAVA)

    个人简历 基本信息: 姓名:张三 性别:女 年 龄:23 工作经验:2年 专业:软件技术 教育程度:专科 联系电话:xxxxxxxxx E-mail: xxxxxxxxxxx@126.com 职业技能与特长: 熟练掌握java语言,......

    Java程序员面试干货

    有了这些,还害怕面试么? 不管你是学生还是工作者,多多少少都对面试感到困扰和无奈,为啥你总是被拒绝?为何面试官屡屡刁难让你不知所措?原因是因为你不知道回答的技巧,怎样回答面试......

    java程序员面试必备问答汇总

    什么是类与对象? 所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。 类是具备某些共同特征的实体的集合,它......

    Java程序员面试注意事项(模版)

    Java程序员面试注意事项 随着Java框架的逐渐成熟,其功能越来越强大,使用越来越简便,其使用范围越来越广,使用人数也越来越多。Java在带来方便的同时,无形中也带了不便,作为软件开......

    Java程序员面试宝典

    第3章Java语法基础 基础类型和语法 1、变量及其作用范围 Java变量可以分为:静态变量、成员变量和局部变量3种。 静态变量:在类中用static修饰的变量,它的生存周期是由类来决定......