硬盘初始化时出现io错误怎么办?

以下文字资料是由(历史新知网)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

1.硬盘无法识别如何修复

这个有可能是外因也有可能是内因,需要一开始一个个排除。下面爱特数据恢复给出一些可能出现的原因和解决办法,作为参考:

1.可能是硬盘数据线和电源线松动、氧化或断针.

解决方法:尝试重新插拔硬盘数据线和电源线,或更换电源接头、数据线接口。

2.主板关闭了sata接口,而电脑使用的是sata硬盘,这样就导致电脑找不到硬盘。

解决方法:开机按DEL键进入BIOS,在BIOS中把sata接口打开。

解决方法:进入BIOS,将该选项设置为auto即可。

4.硬盘和其他IDE设备共用数据线,并都将跳线设成了“master”或“slave”

解决方法:更改其中的一个ide跳线即可,或者都设置成cs。

5.硬盘没有设置活动分区

解决方法:手动或者借助软件,将硬盘的某个分区设置为活动分区。

6.长时间在潮湿环境下不使用电脑,导致硬盘上的元件受潮

解决方法:断开电源,用吹风机均匀的给硬盘加热去湿。

7.电脑上的ide设备过多导致其初始化时间增加,但相应的自检时间没有增加,造成系统无法检测到硬盘或检测超。

解决方法:在bios中找到“boot delay time”选项或“ide delay time”,将时间延长即可。如果BIOS中没有此选项,也可以将内存自检次数设为3次,延长自检时间。

8.硬盘长期使用后,背面电路板的金手指上的氧化导致接触不良.

解决方法:拆下电路板,清楚金手指上的氧化物,建议找专门的维修人员清理。

解决方法:如果上述方法都不能解决问题,那硬盘本身可能真的是坏了,最好送厂维修了。如果硬盘本身存储有很重要的数据,建议一定要先找专业的数据恢复机构去恢复数据,然后再拿去维修。

2.误操作,硬盘无法正常识别怎么办

看到你问题的补充……可以看出你对电脑多少懂些。那我就用正常点词语给你说明一下。

为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。

如果你删除MBR,就等于毁掉了目录。

那些书对于你来说就变成未知的存在,数据也一样。那些数据用常规手段无法读取了,然后我们就可以理解成删除了。重写覆盖点就OK了。

就像你上面的操作,格式化到一般(烧掉目录烧了一半)。结果就是可想而知,你只能认到一般的内容。因此你就只识别到了那么一点点的硬盘。

这个MBR有些是系统可以修改的,有些则是需要用其他软件来修改的。所识别到的东西也不一样。

因此你的PQ就报错了。

这种时候我们需要一点技巧,那就是利用一张XP的系统盘。XP安装版的系统每次安装都会提示你划分磁盘分区并格式化,那个分区工具很底层而且很强大(或者用暴力来解释)。

我们可以就用那个功能当做一个恢复MBR的工具。首先用它把整个硬盘上还残留的分区表删除后,再创建一个或两个系统分区,剩余空间暂留进到系统再分也不迟(因为XP的这个分区工具比较底层,它只能分主分区。而一块硬盘只能写4个主分区)然后退出。

3.硬盘读取异常是怎么回事

应该是硬盘有坏道了,简单的说就是硬盘有故障了,只是还不严重,所以你还能进系统。

像这种情况,你可以在网上下载硬盘扫描软件,看是不是有坏道,并且坏道在什么地方,然后你可以用分区软件把坏道前后一定的空间划成一个分区,然后把该分区隐藏起来,应该就可以解决。以上方法只针对极少数坏道,或坏道集中在一定的小范围内,相应的软件网上多得很,不过操作起来很麻烦,没基础还是自己不要动手,找个熟悉的朋友帮你。

如果扫描出来有不同位置的多个坏道,那就抓紧时间备份重要数据,准备换硬盘吧,软件修复已经没有意义。

最后提醒你,硬盘出现坏道后,只会越来越多,所以即使能软件修复也只能多用段时间,建议你趁还能使用赶快备份重要数据。修理的话,恐怕国内能修的不多,一般都是返厂,即使修好也用不了多久,所以还是换了好。

要全盘备份其实很简单,你买硬盘的时候把电脑带去,请他们帮你备份,并帮你安装好,一般的商家都愿意的。

自己操作的话就需要个USB接口的移动硬盘盒,先划好分区,再逐盘备份。

你先扫描了有结果再追问吧

4.电脑硬盘不能识别,能修复么

在系统无法正确的识别到硬盘后,我们首先要做的就是要排除硬盘自身故障,确定硬盘是完好并能够正常使用的还是硬盘已经出现了严重的毁坏。

我们可以通过听取硬盘转动时所发生的声音来判断硬盘的机械部分是否出现问题。 硬盘只要一加电,就在不停的运转着, 目前台式机的硬盘都达到了7200RPM的转速,机械部分在工作时发出声音是很正常的,因此在出现故障后通过听取硬盘转动的声音来判断机械故障也是可行 的。

细心的朋友可能会留意,在机器开机自检时,硬盘一般会发出“哒…哒…哒……”的声音,然后就恢复了平静,这种声音是比较正常的,听到这种声音就有比较 大的把握判断硬盘大概没有问题;如果声音是“哒…哒…哒……”,然后又是连续几次发出“咔哒…咔哒”的声响的话,有很大的可能是硬盘出问题了。最坏的情况 是自检时硬盘出现“达、达、达”之类的周期性噪音,则表明硬盘的机械控制部分或传动臂有问题,或者盘片有严重损伤。

为了进一步判断,您可以将硬盘拆下来,接在其他的电脑上,然后进入到CMOS中检测一下,如果也是检测不到的话,那就可以断定, 真的是硬盘问题了。 硬盘能够发出声音还算是相当不错的了,在有些情况下,硬盘由于电路板部分烧毁,系统就根本无法自检到 硬盘。

硬盘电路板烧毁一般是由于电源反接造成的,出现的机率一般比较小,但也不能够完全排除。电路板烧毁后主板的BIOS中是认不出硬盘的,这种情况一般 不会伤及盘体,只要能找到相同型号的电路板更换(运气好的话只需更换电路板上的某个元件),硬盘修复的可能性应在80%以上,一般修复后数据都还在。

若无 法修复,盘上数据又确实宝贵,可以找专业人士将硬盘拆开,取出盘片,只要盘体无损伤,大部分数据可用专门的读盘机将内容读出。硬盘电路板烧毁,属于电脑配 件的“非正常损坏”, 无论什么原因都不属于保修范围,只有自认倒霉。

主板BIOS设置出错导致系统无法识别硬盘。如果BIOS里硬盘参数设置不对,自检不会通过,硬盘 是无法正常使用的。

这类问题一般是更换主板或是重新安装系统后引起的。目前的大部分主板一般都提供两个IDE接口和两个SATA接口,对于865PE芯片 组的主板,一般情况下BIOS设置中是将SATA接口给关闭的,如果此时使用SATA硬盘则系统无法正确识别。

而对于大部分NF4和9*5系统芯片组的主 板,一般默认情况下SATA与IDE接口都是打开的,但也不排除个别主板在设置上的不同,可以视情况的不同,我们将主板的IDE与SATA端口打开与关 闭,一般情况下打开即可。 除此之外,BIOS中电源设置也会影响到硬盘的使用。

比如有些时候电脑会出现硬盘忽然停转,然后又立即启动,可以明显听到硬马达起动的声音。如 果硬盘没有别的毛病话,那应该是BIOS设置的问题,请检查BIOS设置中,“power management”中的“ HDD PowerDown”项,并将其打开。

在BIOS中Power Manager Setup 选项中曾改过东西,进入CMOS中发现 Power Management Setup 中的Power Management被设置成MAX Saving(硬盘在1分钟内无数据读写就进入Power Down供电停止状态),这表示有时当读写命令传输时,有时硬盘已处于停止状态,需要重新“启动”进入工作状态,所以硬盘表现为时快时慢。 硬盘出现问题后,我们还可以根据系统的提示来判断硬盘的故障。

开机后系统自检失败并出现:“primary masterharddiskfail”提示,而有时能检测通过正常启动。检测失败后有时在BIOS中能用AUTO DETECT重新设置,有时AUTO DETECT又找不到硬盘。

出现这种情况后,我们一般情况下怀疑数据线的问题和主板接口的问题,这时首先做的是换条好的数据线,检查数据线连接是否正常,如果不是数据线的问题,那么 请将硬盘取出放在别的机器上进行检查,一般情况下都可能检查到问题。另外电源供电也会出现此类的提示, 如果将硬盘换到机器上能用的话,就应该怀疑是以上的问题,如果不能用,则是硬盘本身出现了问题。

如果主板检测到了硬盘的话,请先确认一下检测到的硬盘的容量和其他的参数是否和实际的硬盘参数是相同的。若检测到的硬盘容量和实际的不同,说明系统一定出现故障了,这种情况的发生可能是硬盘、主板、甚至是硬盘数据线。

可以用替换法加以确认。 目前硬盘都采取了多项容错技术,其中应 用最普遍的是S.M.A.R.T技术。

这是S.M.A.R.T技术诊测到你的硬盘可能出现了故障或不稳定情况,警告你需要立即备份数据并更换硬盘。出现这种提示后,除了更换新盘外,没其他解决 方法。

有些情况下是硬盘在超频后可能出现“硬盘读写失败”,很多硬盘在高外频下工作会有一些问题,轻则无法启动,重则数据丢失。因为硬盘超频后对系统的整体提升并不算大,并且稳定性极差,因此极不推荐对硬盘进行超频。

5.电脑识别不出硬盘怎么办

什么硬盘啊 P还是S?这个比较详细 一、硬盘常见故障的判断 一般来说,硬盘的故障可以分为纯硬件故障和软件故障。

相对来说,软件引起的硬件故障比较复杂,因为硬盘牵涉到系统软件和应用软件,但是解决的方式有时候却比较简单,比如主引导扇区被非法修改导致系统无法启动、非正常关机后引起的逻辑坏道等,一般通过重新分区格式化即可解决。而纯硬件的故障就比较棘手——硬件故障又可以分为系统引起的,例如主板的IDE接口松动、与其他硬件设备不兼容、电源不稳定等等,而另一个就是硬盘本身的故障了,当然我们可以通过眼睛观察一下电路板是否有芯片被烧毁,用耳朵仔细听听启动时是否有异常响声等方式来判断。

硬盘故障包括了磁头损坏、电路板问题、芯片信息丢失、马达不转等,最直观的现象就是进入主板BIOS设置后,无法识别硬盘。 根据电脑开机后的出错提示也是可以确定硬盘故障大致类型的。

specification",系统不认硬盘,一般是CMOS中的硬盘设置参数丢失或硬盘类型设置错误造成的。开机后屏幕显示:"Invalid partition table",硬盘不能启动,若从软盘启动则认C盘,一般是由于硬盘主引导记录中的分区表有错误而造成的。

System"表明硬盘的主引导记录被破坏,或者分区的结束标志遭到破坏,还有可能是由于CMOS重硬盘参数设置错误引起的,造成这种现象的原因有:CMOS参数被改动;硬盘下的系统文件IO.SYS和MSDOS.SYS遭到破坏;硬盘DOS引导记录(BOOT)遭到严重破坏,或者DOS引导记录的结束标志(01FF的55 AA)丢失;也可能是硬盘的主引导数据被破坏,或主引导结束标志(080。081的55

而系统显示"TRACK 0 BAD,DISK UNUSABLE",意思为"零磁道损坏,硬盘无法使用"或用磁盘扫描程序扫描其它硬盘时其0扇区出现红色"B"。硬盘0扇区损坏,是大家比较头痛的故障,一般情况下也就判了硬盘死刑,很难修复了。

这是S.M.A.R.T技术诊测到你的硬盘可能出现了故障或不稳定情况,警告你需要立即备份数据并更换硬盘。出现这种提示后,除了更换新盘外,没其他解决方法。

二、硬盘常见安装故障的处理 硬盘安装不当会导致无法正常使用的故障。比如IDE接口与硬盘接的电缆线未连接好;或是IDE电缆接头处接触不良或再现断裂;硬盘未接上电源或电源接头未插牢;跳线设置不当等都会导致在BIOS中检测不到硬盘,或无法识别全部容量。

如果检测时硬盘灯亮几下,但BIOS仍然报告没有发现硬盘,则可能是硬盘电路板上某个部件损坏或者是主板IDE接口及IDE控制器出现故障。另外,使用了不合格的信号线(未按要求使用80针信号线)或未安装主板芯片组驱动(补丁)程序,将会导致不能打开DMA模式的故障。

有些朋友在新加了一个硬盘后,WIN98就无法启动了,取下新加的硬盘后一切又正常了。这是因为你的WIN98装在原硬盘的非C盘(如D盘)上,而加装双硬盘后在原硬盘存在多分区的情况下,要引起盘符交错,导致原硬盘的盘符发生了变化,WIN98在启动时找不到安装时默认的相关系统文件及众多应用程序,自然不可能正常启动。

在多分区的情况下,硬盘分区的排列顺序是这样的:主硬盘的主分区仍被计算机认为是C盘,而第二硬盘的主分区则被认为是D盘,接下来是第一硬盘的其他分区依次从E盘开始排列,然后是第二硬盘的其他分区接着第一硬盘的最后盘符依次排列。要使加上第二硬盘后盘符不发生变化,解决的办法有两个:如果你只使用WIN98的话,比较简单,在CMOS中将第二硬盘设为NONE即可,但在纯DOS下不认第二个硬盘。

第二种方法是接上双硬盘后,给第二个硬盘重新分区,删掉其主DOS分区,只分扩展分区。这样盘符也不会交错。

当然若第一硬盘只有一个分区的话,也就不会存在盘符交错的问题了。另外还有一个常见的硬盘安装故障就是在老主板上不能正确使用大容量硬盘,解决的方法很多,比如升级主板BIOS或使用EZ等特殊分区软件分区。

SATA硬盘电源接口与传统的IDE硬盘所使用的端口大不相同,目前普通电源很少能直接支持Serial ATA硬盘,需使用专门的转接头。不过也有少数Serial ATA硬盘采用了双电源设计,除了Serial ATA标准的15针电源接口外,还有传统的电源接口,使用起来就更加方便了。

另外,Serial ATA硬盘对电源供电质量要求比并行接口硬盘更严格,使用Serial ATA硬盘的朋友,最好配一个功率足够的好电源。还要注意的是,由于Serial ATA硬盘对主板AGP/PCI频率很敏感,如果你进行了超频操作,就可能会出现无法识别硬盘或使用不稳定的现象。

6.电脑硬盘无法识别的原因有哪些

当笔记本电脑硬盘出现故障后,会表现为无法读取数据,无法识别硬盘等故障。如果真的出现故障,该如何确定这些故障产生的原因呢?

当接通电源,启动笔记本电脑后,发现硬盘没有任何反应,在BIOS中也不能找到硬盘。如果出现这种情况,大部分是由于硬盘电机出现问题引起的。这时候,应该找专业的维修人员进行维修。

2.硬盘发出“哒哒”的声音

当笔记本电脑硬盘发出“哒哒”的声音或其他不正常的声音时,说明磁头出现了问题。这时候,应当立即关闭笔记本电脑,将笔记本电脑带到专业维修地点维修。否则,你的珍贵数据将一去不返。

3.无法访问数据和无法复制数据

当进入操作系统后,能够看到硬盘中的数据,但是,却无法访问这些数据,而且不能复制粘贴数据。出现这种情况,基本上可以确定为硬盘上有坏道,也有可能是硬盘固件有问题。可以用查坏道的软件,测试硬盘是否出现了坏道。

4.硬盘运行正常,BIOS 无法检测

当启动笔记本电脑后,在BIOS中检测不到硬盘,但是,硬盘却能正常运行。这种情况基本上是由固件问题造成的,也有可能是硬盘初始化信息丢失。如果出现上述情况,数据基本上无法挽救。

当在使用笔记本电脑时,发现BIOS中检测到的笔记本电脑硬盘与实际硬盘有区别。这种情况是由于硬盘磁头偏移造成的,也有可能是硬盘固件出现了问题,造成硬盘误识别。

7.移动硬盘无法识别读取怎么办

移动硬盘使用中的问题 1、移动硬盘盒和硬盘连接,首先请将硬盘的跳线方式设置在主盘的位置,跳线方法可以参见硬盘图例。

连接方式先连接外接电源,硬盘正常工作转动后连接USB数据线。如在USB2.0接口无法识别,USB1.1接口可以正常使用,可以安装主板自带的USB2.0的驱动程序。

2、USB移动硬盘在连接到电脑之后,系统没有弹出“发现USB设备”的提示。 在BIOS中没有为USB接口分配中断号,从而导致系统无法正常地识别和管理USB设备。

3、移动硬盘建议在电脑的后置主板的USB接口连接,移动硬盘在电脑前置USB接口连接,而前置USB接口一般采用延长线连接,把板载的USB接口引到计算机外壳前端,所以增大的电源的消耗,使硬盘无法正常工作,系统无法正常检测出正确名称设备或只检测出移动硬盘盒的设备,自然无法选择安装驱动程序,有可能无法识别。

应将USB传输线连接到计算机后面的USB接口上,同时使用PS/2辅助供电电源线,连接在电脑的键盘或鼠标接口上,进行测试。连接PS/2接口需要在关机的状态下连接,电脑启动后连接USB接口。

注:因计算机BIOS版本不同,具体设置请参阅计算机所附带的主板说明书。 4、假如你是在nForce的主板上碰到这个问题的话,则可以先安装最新的nForce专用USB2.0驱动和补丁、最新的主板补丁和操作系统补丁,还是不行的话尝试着刷新一下主板的BIOS一般都能解决。

5、在WIN98/ME下用FDISK格式化时不能正确识别移动硬盘的容量,在WIN2000/XP下不能把硬盘格式化为FAT32格式的文件系统。 先到设备管理器中“磁盘驱动器”下找到移动硬盘,将其“属性可删除”选项改为不选中状态,重新启动计算机即可;我们的驱动程序在安装时默认是不选中状态,但如果使用过其它USB设备则有可能已将这个选项改为选中状态。

因为2000,XP操作系统不支持大于30G的FAT32的格式化,所以如果想对其格式化,可以到98系统对其格式化或利用PQ等软件。98系统不支持大容量硬盘的分区,所以您也要到WIN2000或XP下对其进行分区。

6、接入移动硬盘后,计算机没有反应。 如按正常操作连接上USB硬盘后,计算机中不显示该移动硬盘。

应检查“我的电脑\控制面板\系统\设备管理器”中是否有“通用串行总线控制器”这一项,如果没有该项,必须重新启动计算机,并在启动时按住Del键,进入CMOS设置中,在“CHIPSET FEATURES SETUP”或“INTEGRATED PERIPHERALS”中将“USB Control”设置为“Enabled”,保存并启动计算机。 注:因计算机BIOS版本不同,具体设置请参阅计算机所附带的主板说明书。

7、移动硬盘在win98/win me下,驱动安装正确,但没有盘符现象的解决方法。 请确认在“设备管理器”中USB移动硬盘此项设备工作正常。

如果正常,进入“设备管理器”里的“磁盘驱动器”,选中移动硬盘,单击“属性”,将“设置”中“可删除”选项打勾,重新启动计算机。 8、启动计算机前接入移动硬盘,在计算机会出现双倍的盘符,内容相同或无法访问。

因为有些主板BIOS中支持对USB设备的检测,在接入移动硬盘后,主板BIOS检测到所接入USB设备,自动对其分配设备号;但操作系统启动时,系统检测到USB设备,再次加载USB外挂设备分配设备号,所以在操作系统中出现双盘符现象。解决方法:计算机启动完成后再接入设备。

因为计算机方面一般无法关闭此项功能,但USB产品支持热插拔功能,可以在计算机出现操作桌面时接入产品。 9、为什么在2003上,接上移动硬盘后,找不到盘符。

操作系统下移动硬盘的分区是必须手动指定盘符的。您先确定设备安装正常。

(移动硬盘设备工作不正常请参照说明安装方法及注意事项)。您可以在“我的电脑”上单击右键,在出现的“计算机管理”窗口中,选择“磁盘管理”。

在窗口的右下角中,应有“磁盘0”“磁盘1”(或更多)。其中“磁盘1”项(应为您实际的移动硬盘),后面长条形块中显示为您的移动硬盘的分区情况及各分区情况,但各分区无盘符。

您只有分别添加“驱动器号”。在相应的分区条形块上右键单击出现下拉菜单,选中菜单中的“更换驱动号和路径”选项。

按照屏幕提示指定驱动号后,即可完成。 10、晃动移动硬盘有轻微响声,是否有元器件脱落。

这是由于平衡珠和盘片之间有一定的间距,在晃动时造成一定的响声是正常的。 11、移动硬盘的速度问题。

u *** 2.0的移动硬盘,但传输速度却是和1.1的差不多。 如果是2.0的移动硬盘,只有计算机的USB口也是2.0的才能发挥出来,如果是计算机上的USB接口是1.1的,他的传输速率也是按1.1的传输。

一般1.1的传输速率在1M/S以下,如果超过1M/S一般就是2.0的传输速度,随着计算机配置的不同,传输速度也不同。如果您的计算机主板的USB口是2.0的,请查看设备管理器的通用串行总线控制器中2.0的驱动是否安装正确。

另外,在BIOS中的USB端口装置设定,传输模式里面有。

移动硬盘故障的几种原因分析

为了能够便捷地存储大容量文件,很多朋友都购买了USB接口的移动硬盘,可是在使用的时候却发现系统无法识别移动硬盘。这是为什么呢?

对于从来没有使用过USB外接设备的朋友来说,即使正确安装了驱动程序也有可能出现系统无法检测USB硬盘的情况,这主要是由于主板默认的CMOS端口是关闭的,如果没有将其设置为开启状态,那么Windows自然无法检测到移动硬盘了。为了解决这个问题,我们可以重新开机,进入CMOS设置窗口,并且在 “PNP/PCI CONFIGURATION”栏目中将“Assign IRQ For USB”一项设置为“Enable”,这样系统就可以给USB端口分配可用的中断地址了。

由于USB硬盘在工作的时候也需要消耗一定的电能,如果直接通过USB接口来取电,很有可能出现供电不足。因此,几乎所有的移动硬盘都附带了单独的外接电源或者是通过键盘取电的PS2转接口,这时只要事先连接好外接电源或者通过PS2转接线与键盘连接好,确保给移动硬盘提供足够的电能之后再试试,这时应该可以正常使用了吧。需要特别提醒大家注意的是,建议使用移动硬盘之前都确保有足够的供电,否则很可能由于供电不足导致硬盘损坏。

除去上述两方面原因之外还有可能是USB接口类型不符导致移动硬盘无法使用。比如计算机配置的USB接口是1.1标准的,而购买的移动硬盘是USB 2.0标准的接口,这就要求连接计算机和移动硬盘的连接线必须支持USB 2.0标准。因为高速移动设备插入低速集线器,该设备可能不被正常安装,而有些朋友在使用移动硬盘的同时还使用优盘,为了方便就直接使用优盘附送的USB 1.1标准连接线,这样就导致USB 2.0标准的移动硬盘无法正确识别。只要将连接线更换为USB 2.0标准的即可解决此故障。

对于一些还在使用Windows 95或者Windows 97系统的朋友来说,即使计算机配备了USB接口,但是由于Windows 98之前的操作系统不支持USB外设,因此无论如何安装驱动程序、设定CMOS参数都无法让移动硬盘正常使用。对于这种情况,一种解决方法是将操作系统升级到Windows 98以上,另外一种方法就是到微软官方站点下载相应的补丁程序让Windows 95/97能够识别移动硬盘。

对于一些Windows 98用户来说,在安装好驱动程序之后,可以从设备管理器中查看到移动硬盘图标,但是在资源管理器中却没有相应的盘符标识,这就是系统设置不当所致。在设备管理器中双击移动硬盘图标,并且点击弹出窗口中的“属性”按钮,此时可以看见断开、可删除、同步数据传输和Int 13单元四个选项,其中“可删除”一项前面系统默认是没有打勾的,只要勾选这个选项之后重新启动计算机,就可以在资源管理器中看见新增的移动硬盘盘符了。

虽然移动硬盘无法识别的故障原因比较多,但一般都不是USB接口或者移动硬盘本身的故障,因此需要大家在排除的时候多从周围关联部分考虑,相信你也可以顺利使用移动硬盘的。

@[TOC]C++后端面试必会知识点前言 秋招面试结束了,我的专业是机械工程,有幸也能拿到互联网后端的offer,在此总结一下C++后端面试必会的面试知识,当然前提是要系统学习相关知识。提示:以下是个人经验,可供参考 一、学习方式 做C++后端必须会的知识点有如下几块:C++基…


秋招面试结束了,我的专业是机械工程,有幸也能拿到互联网后端的offer,在此总结一下C++后端面试必会的面试知识,当然前提是要系统学习相关知识。


提示:以下是个人经验,可供参考

做C++后端必须会的知识点有如下几块:C++基础、操作系统、计算机网络、数据库、算法与数据结构、设计模式。
操作系统、计算机网络、数据库都要看书看视频、然后自己也要做相关的项目。当然面试不是全考,在此总结一下学习的途径。

二.定义一个只能在栈上生成的类
想法一:要想只在栈上定义对象,就不能使用new,也不能定义全局和静态变量,我们可以通过以下的方式实现:将构造函数设为私有或者保护,然后写一个公有方法去获取对象,但是不能使用new这个操作符。

想法二:只能在栈上开辟对象,也就是说不能在堆上开辟了。产生堆对象的唯一方法就是使用new,而禁止使用new也就是不能在堆上产生对象了。由于new执行时会调用operator new, 而operator new是可重载的, 所以将operator new和operator delete重载为私有即可。

通常情况下,内核是不会调用用户层的代码,要想实现这逆向的转移,一般做法是在用户进程的核心栈(tss->esp0)压入用户态的SS,ESP,EFLAGS,CS,EIP,伪装成用户进程是通过陷阱门进入核心态,之后通过iret返回用户态。

const在编译器中怎么实现

对于这段程序,g++是把constant放到了常量区,也就是经常有人问起的保存char *s="abc"的地方。
这块内存是不允许修改的,所以试图赋值的时候就会segment fault

有的时候,编译器有可能把const int做优化,直接替换成立即数而不给分配内存。不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高,同时,这也是它取代预定义语句的重要基础。

static在编译器中怎么实现?

static的实现是通过将这个变量初始化在全局变量区实现的,但与全局变量不同,它具有可见性(也可以说隐藏性)

lock前缀实现原子性的两种方式:

  • 锁bus:性能消耗大,在intel 486处理器上用此种方式实现
  • 锁cache:在现代处理器上使用此种方式,但是在无法锁定cache的时候(如果锁驻留在不可缓存的内存中,或者如果锁超出了划分cache line 的cache boundy),仍然会去锁定总线。

英特尔处理器提供LOCK#信号,该信号在某些关键内存操作期间会自动断言,以锁定系统总线或等效链接。在断言该输出信号时,来自其他处理器或总线代理的控制总线的请求将被阻止。此度量标准度量总线周期的比率,在此期间,在总线上声明LOCK#信号。当由于不可缓存的内存,跨越两条缓存行的锁定操作以及来自不可缓存的页表的页面遍历而导致存在锁定的内存访问时,将发出LOCK#信号。

在这里,锁定进入操作由总线上的一条消息组成,上面写着“好,每个人都退出总线一段时间”(出于我们的目的,这意味着“停止执行内存操作”)。然后,发送该消息的内核需要等待所有其他内核完成正在执行的内存操作,然后它们将确认锁定。只有在其他所有内核都已确认之后,尝试锁定操作的内核才能继续进行。最终,一旦锁定被释放,它再次需要向总线上的每个人发送一条消息,说:“一切都清楚了,您现在就可以继续在总线上发出请求了”。

epoll支持水平触发和边缘触发,最大的特点在于边缘触发,它只告诉进程哪些fd刚刚变为就需态,并且只会通知一次。还有一个特点是,epoll使用“事件”的就绪通知方式,通过epoll_ctl注册fd,一旦该fd就绪,内核就会采用类似callback的回调机制来激活该fd,epoll_wait便可以收到通知。

1)支持一个进程打开大数目的socket描述符(FD)

select最不能忍受的是一个进程所打开的FD是有一定限制的,由FD_SETSIZE设置,默认值是。对于那些需要支持的上万连接数目的IM服务器来说显然太少了。这时候你一是可以选择修改这个宏然后重新编译内核。不过 epoll则没有这个限制,它所支持的FD上限是最大可以打开文件的数目,这个数字一般远大于2048,举个例子,在1GB内存的机器上大约是10万左右,具体数目可以cat

2)IO效率不随FD数目增加而线性下降

传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合,不过由于网络延时,任一时间只有部分的socket是"活跃"的,但是select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"活跃"的socket进行操作—这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在Linux内核。

3)使用mmap加速内核与用户空间的消息传递。

这点实际上涉及到epoll的具体实现了。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核与用户空间mmap同一块内存实现的。

\2. 相对select来说 还是用起来还是复杂了一些, 不过和IOCP比起来 增加了一点点的复杂度却基本上达到了IOCP的并发量和性能, 而复杂度远远小于IOCP.
\3. 相对IOCP来说 对多核/多线程的支持不够好, 性能也因此在性能要求比较苛刻的情况下不如IOCP

1.切换页目录以使用新的地址空间
2.切换内核栈和硬件上下文。

对于linux来说,线程和进程的最大区别就在于地址空间。
对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。 所以明显是进程切换代价大

线程上下文切换和进程上下文切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。

进程切换要保存的信息有哪些?

4、过程和系统调用参数及调用地址信息

1.保存被切换进程的正文部分至有关存储区

2.操作系统进程中有关调度和资源分配程序执行

3.将被选中进程的原来被保存的正文部分从有关存储区中取出,并送至有关寄存器与堆栈中,激活被选中进程执行。

1、进程间通讯——生产者消费者模式

一个现场负责产生数据,一个现场负责处理数据,那么我们可以用主线程作为生产者,从键盘获取数据写入共享缓冲区,另一个线程作为消费者,从共享缓冲区读取数据,并打印。当然,这里要解决互斥的问题

由fork()产生的子进程和父进程不共享内存区,所以父子进程间的通讯也可以共享内存,以POSAX共享内存为例:父进程启动后使用MAP_SHARED建立内存映射,并返回指针ptr。fork()结束后,子进程也会有指针ptr的拷贝,并指向同一个文件映射。这样父子进程便共享了ptr指向的内存区

3、进程间共享——只读模式

经常碰到一种场景,进程需要加载一份配置文件,可能这个文件有100K大,那如果这台机器上多个进程都要加载这份配置文件时,比如有200个进程,那内存开销合计为20M,但如果文件更多或者进程数更多时,这种对内存的消耗就是一种严重的浪费。比较好的解决办法是,由一个进程负责把配置文件加载到共享内存中,然后所有需要这份配置的进程只要使用这个共享内存即可。

1、POSIX共享内存对象

  • 进程重启共享内存中数据不会丢失,即持续性

2、POSIX内存映射文件

  • 访问速度比内存区对象慢。

以上就是今天要讲的内容,本文仅仅简单介绍了学习途径和个人面试一些不会的题目,觉得有帮助可以点赞收藏关注。

1、面向对象的特征有哪些方面

抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。

继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

10、 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

可以。如果这个类的修饰符是public,其类名与文件名必须相同。

11、写几个线程安全类,不安全的,支持排序的类名?

12、 排序都有哪几种方法?请列举。用JAVA实现一个快速排序?

排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)

13、 什么是类的返射机制?

14、 类的反射机制中的包及核心类?

stop()是因为它不安全。它会解除由线程获取的所有锁定,当在一个线程对象上调用stop()方法时,这个线程对象所运行的线程就会立即停止,假如一个线程正在执行:synchronized void { x = 3; y = 4;} 由于方法是同步的,多个线程访问时总能保证x,y 被同时赋值,而如果一个线程正在执行到x = 3;时,被调用了stop()方法,即使在同步块中,它也干脆地stop 了,这样就产生了不完整的残废数据。而多线程编程中最最基础的条件要保证数据的完整性,所以请忘记线程的stop 方法,以后我们再也不要说“停止线程”了。而且如果对象处于一种不连

贯状态,那么其他线程能在那种状态下检查和修改它们。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。

17、静态变量和实例变量的区别?

静态变量属于类,不用实例化就已经存在,所有的实例共享同一个静态变量,可以通过类名和实例名来访问。实例变量属于实例,每个实例都有自己的这个变量,只能通过实例名来访问。

18、什么是构造器,构造器的特征

方法名必须和类名相同,无返回值,不能显示被调用,实例化时自动调用。完成初始化工作。系统会默认提供了一个默认的无参构造器。初始化子类时,会先调用父类的构造器,可以在方法中通过supper()指定调用父类的哪一个构造器。

19、在一个主方法类可不可以调用一个非静态的方法?

如果在同一个类中,实例方法可以直接使用方法名调用,静态方法不能直接调用非静态方法,需要实例化后,通过对象再调用。

如果在不同类中,实例方法需要先实例化,然后通过对象调用,静态方法,直接通过类名.方法调用。

20、说一下垃圾回收的原理,可以直接从内存中回收吗?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

21、Java 的异常有哪几种,有什么区别?

异常是指java程序运行时(非编译)所发生的非正常情况或错误,与现实生活中的事件很相似,现实生活中的事件可以包含事件发生的时间、地点、人物、情节等信息,可以用一个对象来表示,Java使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题,程序只有死的份了,例如,说内存溢出和线程死锁等系统问题。Exception表示程序还能够克服和恢复的问题,其中又分为系统异常和普通异常,系统异常是软件本身缺陷所导致的问题,也就是软件开发人员考虑不周所导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件系统继续运行或者让软件死掉,例如,数组脚本越界(ArrayIndexOutOfBoundsException),空指针异常(NullPointerException)、类转换异常(ClassCastException);普通异常是运行环境的变化或异常所导致的问题,是用户能够克服的问题,例如,网络断线,硬盘空间不够,发生这样的异常后,程序不应该死掉。

java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不强制用try..catch处理或用throws声明,所以系统异常也称为unchecked异常。

int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

1.Java 反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。

在运行时构造任意一个类的对象。

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法

2、Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public,

尽管Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。这种“看透class”的能力(the

java中,无论生成某个类的多少个对象(实例),这些对象都会对应同一个Class对象。

3、在JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中

–Class类:代表一个类(这个类很特殊,位于java.lang包下)。

–Field 类:代表类的成员变量(成员变量也称为类的属性)。

–Method类:代表类的方法。

–Array类:提供了动态创建数组,以及访问数组的元素的静态方法

clone():创建并返回此对象的一个副本。

equals(Object obj):指示某个其他对象是否与此对象“相等”。

finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

getClass():返回一个对象的运行时类。

notify():唤醒在此对象监视器上等待的单个线程。

notifyAll():唤醒在此对象监视器上等待的所有线程。

toString():返回该对象的字符串表示。

2.Error 是 Throwable 的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath 错误是一个“正规”的条件,但它也是 Error 的子类,因为大多数应用程序都不应该试图捕获它。在执行该方法期间,无需在其 throws 子句中声明可能抛出但是未能捕获的 Error 的任何子类,因为这些错误可能是再也不会发生的异常条件。

2.表示一个由程序员导致的错误

3.应该在应用程序级被处理

2.经常用来用于表示系统错误或低层资源的错误

3.如何可能的话,应该在系统级被捕捉

28、静态的多态和动态的多态的区别?

静态多态性指的是程序在编译时,系统就能决定调用哪个函数,如重载。

动态多态性指在运行中才能动态确定操作指针所指的对象,主要通过虚函数和重写来实现。

java 的多态机制遵循一个原则:当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法

概念理解起来有点抽象。还是看个例子吧。

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?

jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了,而且以后不会再执行这段静态代码了。

Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象

32、接口是否可继承接口抽象类是否可实现(implements)接口抽象类是否可继承具体类

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承具体类。抽象类中可以有静态的main方法。

记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

33、char 型变量中能不能存贮一个中文汉字?为什么?

无法存储。因为char型具有的空间比汉字占有的空间要小。char型变量,占用空间为一个字节。汉字根据不同编码方式,最少需要两个字节,最多可能有三个字节甚至6个字节。所以单个char变量是无法存储下中文汉字的。

34、clone()方法时,通常都有一行代码,是什么?

35、说说常用集合类有哪些?有哪些方法?

不可以。因为非static 方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static 方法调用时不需要创建对象,可以直接调用。

Math 类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil 的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor 的英文意义是

38、多线程有几种实现方法?同步有几种实现方法?

a. wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

c. notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM 确定唤醒哪个线程,而且不是按优先级。

d. allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

39、内部类可以引用成员吗?有没有什么限制?

完全可以。如果不是静态内部类,那没有什么限制!如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通

成员变量,而只能访问外部类中的静态成员。

40、Java 类实现序列化的方法(二种)?如在collection 框架中实现排序,要实现什么样的接口

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable 接口,该接口没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(

那么在另一端,通过ObjectInputStream 对象的readObject(Object obj)获取到字节流数据后,要将字节流转换成原对象,这叫反序列化,以便将数据存储在文件中或在网络传输。Serializable 接口描述启用其序列化功能,未实现此接口的类将无法使其任何状态序列化或反序列化。Serializable 接口没有方法或字段,仅用于标识可序列化的语义,标识实现了该接口的对象属性可被序列化

42、Java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

1、事件直接驱动模式。它的特点是直接而且快,是必须经常使用的,主要适合于迅速处理前台的命令,通常就是我们说的command(命令)模式。

2.监控式事件模式。主要借助第三者来监控和触发事件,就是通常我们说的观察者模式。特点是: 有一个观察者置身事外在定期独立运行着,我们将我们要监听的事件向这个观察者注册,这样观察者就代替我们来监听这个事件,应用客户端通过观察者来获得事件状况。

45、SOCKET 中有几中连接方式,各有什么区别?

Sockets 有两种主要的操作方式:面向连接(TCP/IP)的和无连接(UDP)的。无连接的操作使用数据报协议,无连接的操作是快速的和高效的,但是数据安全性不佳. 面向连接的操作使用TCP 协议.面向连接的操作比无连接的操作效率更低,但是数据的安全性更高

通过节点的关键码确定节点的存储位置,即给定节点的关键码k,通过一定的函数关系H(散列函数),得到函数值H(k),将此值解释为该节点的存储地址

预编译语句java.sql. ,扩展自Statement,不但具有Statement的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql 语句。这样,sql 语句就会被系统进行预编译,执行的速度会有所增加,

尤其是在执行大语句的时候,效果更加理想

sleep() 方法:线程主动放弃CPU,使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测

试,直到条件满足为止。

wait( ) :与notify()配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,当指定时间参数时对应的notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的notify() 被调用

49、概述反射和序列化

的所有信息,并可于运行时改变fields 内容或唤起methods。序列化:就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时的问题。

是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。

abstract的method 不可以是static的,因为抽象的方法是要被子类实现的native方法表示该方法要用另外一种依赖平台的编程语言实现的,不存在着被子类实现的问题,所以,它也不能是抽象的,不能与abstract混用;

关于synchronized与abstract合用的问题,我觉得也不行,因为在我几年的学习和开发中,从来没见到过这种情况,并且我觉得synchronized应该是作用在一个具体的方法上才有意义。而且,方法上的synchronized同步所使用的同步锁对象是this,而抽象方法上无法确定this是什么。

52、 如何唤起类中的一个方法?

产生一个Class数组,说明方法的参数

54、 如何去小数点前两位,并四舍五入。

doubleDouble 引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。

57、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

Collection是集合类的上级接口,继承与他的接口主要有Set 和List。Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

63、什么是OOP?什么是类?请对比类和对象实例之间的关系

类是具有相同属性和行为的对象的结合;

对象是某个类的一个实例,类有0或多个对象;

int是基本数据类型,Integer是封装类;

66、 类加载的初始化顺序

final修饰属性、方法、类:属性不可改变、方法不可重写、类不可继承;

finally在异常处理时进行清除操作,不管是否捕捉到异常,finaly块中的代码都会执行;

finalize方法是在垃圾收集器删除对象之前对这个对象调用的。

68、线程的基本概念、线程的基本状态以及状态之间的关系

一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码,即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main 方法执行的那个线程。如果只是一个cpu,它怎么能够同时执行多段程序呢?这是从宏观上来看的,cpu 一会执行a 线索,一会执行b 线索,切换时间很快,给人的感觉是a,b 在同时执行,好比大家在同一个办公室上网,只有一条链接到外部网线,其实,这条网线一会为a 传数据,一会为b 传数据,由于切换时间很短暂,所以,大家感觉都在同时上网。状态:就绪,运行,synchronize 阻塞,wait 和sleep 挂起,结束。wait 必须在synchronized内部调用。调用线程的start 方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized 语句时,由运行状态转为阻塞,当synchronized 获得锁后,由阻塞转为运行,在这种情况可以调用wait 方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。  

重载:同一个类中,方法名相同,参数不同

重写:父子类中,方法名相同、参数相同、返回值类型原则上要求相同,但子类的方法权限不允许小于父类,不允许抛出比父类更多的异常。

 位置方法名参数表返回值访问修饰符

方法重写子类相同相同相同或是其子类不能比父类更严格

方法重载同类相同不相同无关无关

声明方法的存在而不去实现它的类叫抽象类。不能创建抽象类的实例;然而可以创建安一个变量,其类型是一个抽象类,并让他指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。

接口是抽象类的变体,接口中所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口只可以定义static final成员变量

没有返回值、方法名与类名相同、不能由编程人员调用、可以定义多个构造方法,如果没有,编译时系统会自动插入一个无参构造方法,这个构造方法不执行任何代码、可以重载。

75、 Final可以修饰什么?修饰后具有什么特点

变量:常量,只能被赋值一次,值不可改变

类:不可继承,没有子类

76、 接口是否可继承接口

78、抽象类是否可继承实体类?

可以继承,但是和实体类的继承一样,也要求父类可继承,并且拥有子类可访问到的构造器。

不是,它是final类型的。

2个,一个是String对象池中的“xyz”,一个是堆中的对象,指向池中的“xyz”至于s,是放在栈中的引用,不是对象。

String是不可变的对象,每次对String类型进行改变的时候其实是产生了一个新的String对象,然后指针指向新的String对象;

StringBuffer是线程安全的可变字符序列,需要同步,则使用。

StringBuilder线程不安全,速度更快,单线程使用。

(String是一个类,但却是不可变的,所以String创建的算是一个字符串常量,StringBuffer和StringBuilder都是可变的。所以每次修改String对象的值都是新建一个对象再指向这个对象。而使用StringBuffer则是对StringBuffer对象本身进行操作。所以在字符串经常改变的情况下,使用StringBuffer要快得多。)

82、是否可以继承String类,为什么

java垃圾回收器,Java是由C++发展来的。它摈弃了C++中一些繁琐容易出错的东西。其中有一条就是这个GC。

GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

84、 异常的体系结构,从类与类之间的关系来回答

RuntimeException和非运行时异常,非运行时异常需要处理。

Try:执行部分,产生异常

Finally:不管有没有异常都执行

Throws:在方法声明处声明要抛出的异常,调用者必须对其进行处理。

在try中可以抛出异常,一般与声明的异常相同。

error是错误,程序基本无能为力。exception是因为程序设计的瑕疵而引起的问题或者一般性问题,是程序必须处理的。

89、 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

goto是java保留字,但没有实现;但是有label

会执行,在return前执行

93、 Java有几种访问权限控制,请分别详细说明控制范围

94、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

核心就是这个方法, 把参数is理解成一个数组就是了:

声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口

栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆是栈的一个组成元素

99、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

不能,一个对象的一个synchronized方法只能由一个线程访问。

100、请说出你所知道的线程同步的方法?

wait():使一个线程处于等待状态,并且释放所持有的对象的lock。sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

101、 char型变量中能不能存贮一个中文汉字?为什么?

能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的

102、 如何取得年月日,小时分秒?

103、 如何取得从1970年到现在的毫秒数

104、 如何获取某个日期是当月的最后一天?

当前日期加一天,若当前日期与结果的月份不相同,就是最后一天。

取下一个月的第一天,下一个月的第一天-1

//把日期转化为字符串

//将字符串转化为日期

106、 编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。

New了一个,”XYZ”本来又是一个,两个。

109、 静态变量和实例变量的区别?

静态方法可以调用静态变量。

实现方法可以调用静态变量、实例变量

110、是否可以从一个static方法内部发出对非static方法的调用?

不可以,如果其中包含对象的method();不能保证对象初始化。

assertion (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个 boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。

112、 从接口、类的角度简述集合框架体系结构

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

Collection是集合类的上级接口,继承于它的借口主要有Set和List;

Collections是针对集合类的一个帮助类,他提供了一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作;

HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。

最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供额外同步。

116、 Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?

Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

117、 集合排序的常见二种写法?

在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式。

118、如何将数组转换成集合,集合转换成数组?

119、 如何对各种集合进行迭代?

122、 JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

123、 字节流与字符流的转换方法?

124、 JavaIO流基础分类方式(字节流、字符流与基本流、过滤流)及他们之间的关系?

126、多线程有几种实现方法?

128、如何实现线程同步?

synchronized:在同一时刻,只能被一个线程访问。要求对象先持有对象上的锁。代码执行完会自动释放锁。

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

130、 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时, 就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

131、虚拟机如何启动一个线程?

132、线程有哪些状态,这些状态是如何转换的?

可运行状态:Runnable,start方法启动线程后,分配了除cpu外的其他资源yield方法后,IO完成、join中断、sleep借宿、同步锁被释放

运行中状态:Running,占有cpu,系统真正执行run方法

死亡状态:Dead,run运行结束或者异常退出

Java多线程面试问题

1. 进程和线程之间有什么不同?

一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。

2. 多线程编程的好处是什么?

在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。多个线程共享堆内存(heap memory),因此创建多个线程去执行一些任务会比创建多个进程更好。举个例子,Servlets比CGI更好,是因为Servlets支持多线程而CGI不支持。

3. 用户线程和守护线程有什么区别?

当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。

4. 我们如何创建一个线程?

有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。若想了解更多可以阅读这篇关于如何在的文章。

5. 有哪些不同的线程生命周期?

当我们在Java程序中新建一个线程时,它的状态是New。当我们调用线程的start()方法时,状态被改变为Runnable。线程调度器会为Runnable线程池中的线程分配CPU时间并且讲它们的状态改变为Running。其他的线程状态还有Waiting,Blocked 和Dead。读这篇文章可以了解更多关于的知识。

当然可以,但是如果我们调用了Thread的run()方法,它的行为就会和普通的方法一样,为了在新的线程中执行我们的代码,必须使用Thread.start()方法。

7. 如何让正在运行的线程暂停一段时间?

我们可以使用Thread类的Sleep()方法让线程暂停一段时间。需要注意的是,这并不会让线程终止,一旦从休眠中唤醒线程,线程的状态将会被改变为Runnable,并且根据线程调度,它将得到执行。

8. 你对线程优先级的理解是什么?

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个int变量(从1-10),1代表最低优先级,10代表最高优先级。

线程调度器是一个操作系统服务,它负责为Runnable状态的线程分配CPU时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的CPU时间分配给可用的Runnable线程的过程。分配CPU时间可以基于线程优先级或者线程等待的时间。线程调度并不受到Java虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。

上下文切换是存储和恢复CPU状态的过程,它使得线程执行能够从中断点恢复执行。上下文切换是多任务操作系统和多线程环境的基本特征。

11. 你如何确保main()方法所在的线程是Java程序最后结束的线程?

我们可以使用Thread类的joint()方法来确保所有程序创建的线程在main()方法退出前结束。这里有一篇文章关于。

12.线程之间是如何通信的?

当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。Object类中wait()\notify()\notifyAll()方法可以用于线程间通信关于资源的锁的状态。点击有更多关于线程wait, notify和notifyAll.

Java的每个对象中都有一个锁(monitor,也可以成为监视器) 并且wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。在Java的线程中并没有可供任何对象使用的锁和同步器。这就是为什么这些方法是Object类的一部分,这样Java的每一个类都有用于线程间通信的基本方法

当一个线程需要调用对象的wait()方法的时候,这个线程必须拥有该对象的锁,接着它就会释放这个对象锁并进入等待状态直到其他线程调用这个对象上的notify()方法。同样的,当一个线程需要调用对象的notify()方法时,它会释放这个对象的锁,以便其他在等待的线程就可以得到这个对象锁。由于所有的这些方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

Thread类的sleep()和yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。

16.如何确保线程安全?

在Java中可以有很多方法来保证线程安全——同步,使用原子类(atomic concurrent classes),实现并发锁,使用volatile关键字,使用不变类和线程安全类。在中,你可以学到更多。

当我们使用volatile关键字去修饰变量的时候,所以线程都会直接读取该变量并且不缓存它。这就确保了线程读取到的变量是同内存中是一致的。

18. 同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

19.如何创建守护线程?

ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。

每个线程都会拥有他们自己的Thread变量,它们可以使用get()\set()方法去获取他们的默认值或者在线程内部改变他们的值。ThreadLocal实例通常是希望它们同线程状态关联起来是private static属性。在这篇文章中你可以看到一个关于ThreadLocal的小程序。

ThreadGroup是一个类,它的目的是提供关于线程组的信息。

线程转储是一个JVM活动线程的列表,它对于分析系统瓶颈和死锁非常有用。有很多方法可以获取线程转储——使用Profiler,Kill -3命令,jstack工具等等。我更喜欢jstack工具,因为它容易使用并且是JDK自带的。由于它是一个基于终端的工具,所以我们可以编写一些脚本去定时的产生线程转储以待分析。读这篇文档可以了解更多关于的知识。

23. 什么是死锁(Deadlock)?如何分析和避免死锁?

死锁是指两个以上的线程永远阻塞的情况,这种情况产生至少需要两个以上的线程和两个以上的资源。

分析死锁,我们需要查看Java应用程序的线程转储。我们需要找出那些状态为BLOCKED的线程和他们等待的资源。每个资源都有一个唯一的id,用这个id我们可以找出哪些线程已经拥有了它的对象锁。

避免嵌套锁,只在需要的地方使用锁和避免无限期等待是避免死锁的通常办法,阅读这篇文章去学习。

24. 什么是Java Timer类?如何创建一个有特定时间间隔的任务?

java.util.Timer是一个工具类,可以用于安排一个线程在未来的某个特定时间执行。Timer类可以用安排一次性任务或者周期任务。

java.util.TimerTask是一个实现了Runnable接口的抽象类,我们需要去继承这个类来创建我们自己的定时任务并使用Timer去安排它的执行。

25. 什么是线程池?如何创建一个Java线程池?

一个线程池管理了一组工作线程,同时它还包括了一个用于放置等待执行的任务的队列。

原子操作是指一个不受其他操作影响的操作任务单元。原子操作是在多线程环境下避免数据不一致必须的手段。

int++并不是一个原子操作,所以当一个线程读取它的值并加1时,另外一个线程有可能会读到之前的值,这就会引发错误。

为了解决这个问题,必须保证增加操作是原子的,在JDK1.5之前我们可以使用同步技术来做到这一点。到JDK1.5,java.util.concurrent.atomic包提供了int和long类型的装类,它们可以自动的保证对于他们的操作是原子的并且不需要使用同步。可以阅读这篇文章来了解。

Lock接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。

可以使线程在等待锁的时候响应中断

可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间

可以在不同的范围,以不同的顺序获取和释放锁

无限制的创建线程会引起应用程序内存溢出。所以创建一个线程池是个更好的的解决方案,因为可以限制线程的数量并且可以回收再利用这些线程。利用Executors框架可以非常方便的创建一个线程池,阅读这篇文章可以了解。

4. 什么是阻塞队列?如何使用阻塞队列来实现生产者-消费者模型?

java.util.concurrent.BlockingQueue的特性是:当队列是空的时,从队列中获取或删除元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。

阻塞队列不接受空值,当你尝试向队列中添加空值的时候,它会抛出NullPointerException。

阻塞队列的实现都是线程安全的,所有的查询方法都是原子的并且使用了内部锁或者其他形式的并发控制。

Callable接口使用泛型去定义它的返回类型。Executors类提供了一些有用的方法去在线程池中执行Callable内的任务。由于Callable任务是并行的,我们必须等待它返回的结果。java.util.concurrent.Future对象为我们解决了这个问题。在线程池提交Callable任务后返回了一个Future对象,使用它我们可以知道Callable任务的状态和得到Callable返回的执行结果。Future提供了get()方法让我们可以等待Callable结束并获取它的执行结果。

阅读这篇文章了解更多。

FutureTask是Future的一个基础实现,我们可以将它同Executors使用处理异步任务。通常我们不需要使用FutureTask类,单当我们打算重写Future接口的一些方法并保持原来基础的实现是,它就变得非常有用。我们可以仅仅继承于它并重写我们需要的方法。阅读,学习如何使用它。

7.什么是并发容器的实现?

Java集合类都是快速失败的,这就意味着当集合被改变且一个线程在使用迭代器遍历集合的时候,迭代器的next()方法将抛出ConcurrentModificationException异常。

并发容器支持并发的遍历和并发的更新。

Executors可以用于方便的创建线程池。

TCP:面向连接,流的形式进行数据传递,更可靠;Socket,ServerSocket

我要回帖

更多关于 硬盘io错误不能识别 的文章

 

随机推荐