百度账号怎么改名字在火线精英保存名字

拥有1个小站,订阅1个话题,关注1个小站
每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题。虽然一般没有什么大问题,但是最好别这样做。另外这里提到的很多问题其实也可以通过Findbugs来帮我们进行检查出来。
字符串连接误用错误的写法:
Strings=&&;
&&&&&&&&&&&&& 每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题。虽然一般没有什么大问题,但是最好别这样做。另外这里提到的很多问题其实也可以通过Findbugs来帮我们进行检查出来。
字符串连接误用错误的写法:
String&s&=&""; &
for&(Person&p&:&persons)&{ &
&&&&s&+=&",&"&+&p.getName(); &
s&=&s.substring(2);&//remove&first&comma&
正确的写法:
StringBuilder&sb&=&new&StringBuilder(persons.size()&*&16);&//&well&estimated&buffer &
for&(Person&p&:&persons)&{ &
&&&&if&(sb.length()&&&0)&sb.append(",&"); &
&&&&sb.append(p.getName); &
错误的使用StringBuffer 错误的写法:
StringBuffer&sb&=&new&StringBuffer(); &
sb.append("Name:&"); &
sb.append(name&+&'\n'); &
sb.append("!"); &
String&s&=&sb.toString();&
问题在第三行,append char比String性能要好,另外就是初始化StringBuffer没有指定size,导致中间append时可能重新调整内部数组大小。如果是JDK1.5最好用StringBuilder取代StringBuffer,除非有线程安全的要求。还有一种方式就是可以直接连接字符串。缺点就是无法初始化时指定长度。正确的写法:
StringBuilder&sb&=&new&StringBuilder(100); &
sb.append("Name:&"); &
sb.append(name); &
sb.append("\n!"); &
String&s&=&sb.toString();&
或者这样写:
String&s&=&"Name:&"&+&name&+&"\n!";&
测试字符串相等性错误的写法:
if&(pareTo("John")&==&0)&... &
if&(name&==&"John")&... &
if&(name.equals("John"))&... &
if&("".equals(name))&...&
上面的代码没有错,但是不够好。compareTo不够简洁,==原义是比较两个对象是否一样。另外比较字符是否为空,最好判断它的长度。正确的写法:
if&("John".equals(name))&... &
if&(name.length()&==&0)&... &
if&(name.isEmpty())&...&
数字转换成字符串错误的写法:
""&+&set.size() &
new&Integer(set.size()).toString()&&
正确的写法:
String.valueOf(set.size())&
利用不可变对象(Immutable) 错误的写法:
zero&=&new&Integer(0); &
return&Boolean.valueOf("true");&
正确的写法:
zero&=&Integer.valueOf(0); &
return&Boolean.TRUE;&
请使用XML解析器错误的写法:
int&start&=&xml.indexOf("&name&")&+&"&name&".length(); &
int&end&=&xml.indexOf("&/name&"); &
String&name&=&xml.substring(start,&end);&
正确的写法:
SAXBuilder&builder&=&new&SAXBuilder(false); &
Document&doc&=&doc&=&builder.build(new&StringReader(xml)); &
String&name&=&doc.getRootElement().getChild("name").getText();&
请使用JDom组装XML 错误的写法:
String&name&=&... &
String&attribute&=&... &
String&xml&=&"&root&"&
&&&&&&&&&&&&+"&name&att=\""+&attribute&+"\"&"+&name&+"&/name&"&
&&&&&&&&&&&&+"&/root&";&
正确的写法:
Element&root&=&new&Element("root"); &
root.setAttribute("att",&attribute); &
root.setText(name); &
Document&doc&=&new&Documet(); &
doc.setRootElement(root); &
XmlOutputter&out&=&new&XmlOutputter(Format.getPrettyFormat()); &
String&xml&=&out.outputString(root);&
XML编码陷阱错误的写法:
String&xml&=&FileUtils.readTextFile("my.xml");&
因为xml的编码在文件中指定的,而在读文件的时候必须指定编码。另外一个问题不能一次就将一个xml文件用String保存,这样对内存会造成不必要的浪费,正确的做法用InputStream来边读取边处理。为了解决编码的问题, 最好使用XML解析器来处理。
未指定字符编码错误的写法:
Reader&r&=&new&FileReader(file); &
Writer&w&=&new&FileWriter(file); &
Reader&r&=&new&InputStreamReader(inputStream); &
Writer&w&=&new&OutputStreamWriter(outputStream); &
String&s&=&new&String(byteArray);&//&byteArray&is&a&byte[] &
byte[]&a&=&string.getBytes();&
这样的代码主要不具有跨平台可移植性。因为不同的平台可能使用的是不同的默认字符编码。正确的写法:
Reader&r&=&new&InputStreamReader(new&FileInputStream(file),&"ISO-8859-1"); &
Writer&w&=&new&OutputStreamWriter(new&FileOutputStream(file),&"ISO-8859-1"); &
Reader&r&=&new&InputStreamReader(inputStream,&"UTF-8"); &
Writer&w&=&new&OutputStreamWriter(outputStream,&"UTF-8"); &
String&s&=&new&String(byteArray,&"ASCII"); &
byte[]&a&=&string.getBytes("ASCII");&
未对数据流进行缓存错误的写法:
InputStream&in&=&new&FileInputStream(file);& &
while&((b&=&in.read())&!=&-1)&{& &
上面的代码是一个byte一个byte的读取,导致频繁的本地JNI文件系统访问,非常低效,因为调用本地方法是非常耗时的。最好用BufferedInputStream包装一下。曾经做过一个测试,从/dev/zero下读取1MB,大概花了1s,而用BufferedInputStream包装之后只需要60ms,性能提高了94%! 这个也适用于output stream操作以及socket操作。正确的写法:
InputStream&in&=&new&BufferedInputStream(new&FileInputStream(file));&&
无限使用heap内存错误的写法:
byte[]&pdf&=&toPdf(file);&&
这里有一个前提,就是文件大小不能讲JVM的heap撑爆。否则就等着OOM吧,尤其是在高并发的服务器端代码。最好的做法是采用Stream的方式边读取边存储(本地文件或database)。正确的写法:
File&pdf&=&toPdf(file);&&
另外,对于服务器端代码来说,为了系统的安全,至少需要对文件的大小进行限制。
不指定超时时间错误的代码:
Socket&socket&=&...& &
socket.connect(remote);& &
InputStream&in&=&socket.getInputStream();& &
int&i&=&in.read();&&
这种情况在工作中已经碰到不止一次了。个人经验一般超时不要超过20s。这里有一个问题,connect可以指定超时时间,但是read无法指定超时时间。但是可以设置阻塞(block)时间。正确的写法:
Socket&socket&=&...& &
socket.connect(remote,&20000);&//&fail&after&20s& &
InputStream&in&=&socket.getInputStream();& &
socket.setSoTimeout(15000);& &
int&i&=&in.read();&&
另外,文件的读取(FileInputStream, FileChannel, FileDescriptor, File)没法指定超时时间, 而且IO操作均涉及到本地方法调用, 这个更操作了JVM的控制范围,在分布式文件系统中,对IO的操作内部实际上是网络调用。一般情况下操作60s的操作都可以认为已经超时了。为了解决这些问题,一般采用缓存和异步/消息队列处理。
频繁使用计时器错误代码:
for&(...)&{& &
long&t&=&System.currentTimeMillis();& &
long&t&=&System.nanoTime();& &
Date&d&=&new&Date();& &
Calendar&c&=&new&GregorianCalendar();& &
每次new一个Date或Calendar都会涉及一次本地调用来获取当前时间(尽管这个本地调用相对其他本地方法调用要快)。如果对时间不是特别敏感,这里使用了clone方法来新建一个Date实例。这样相对直接new要高效一些。正确的写法:
Date&d&=&new&Date();& &
for&(E&entity&:&entities)&{& &
entity.doSomething();& &
entity.setUpdated((Date)&d.clone());& &
如果循环操作耗时较长(超过几ms),那么可以采用下面的方法,立即创建一个Timer,然后定期根据当前时间更新时间戳,在我的系统上比直接new一个时间对象快200倍:
private&volatile&long&& &
Timer&timer&=&new&Timer(true);& &
time&=&System.currentTimeMillis();& &
timer.scheduleAtFixedRate(new&TimerTask()&{& &
public&void&run()&{& &
time&=&System.currentTimeMillis();& &
},&0L,&10L);&//&granularity&10ms& &
for&(E&entity&:&entities)&{& &
entity.doSomething();& &
entity.setUpdated(new&Date(time));& &
}&finally&{& &
timer.cancel();& &
捕获所有的异常错误的写法:
Query&q&=&...& &
Person&p;& &
p&=&(Person)&q.getSingleResult();& &
}&catch(Exception&e)&{& &
p&=&null;& &
这是EJB3的一个查询操作,可能出现异常的原因是:结果不唯一;没有结果;数据库无法访问,而捕获所有的异常,设置为null将掩盖各种异常情况。正确的写法:
Query&q&=&...& &
Person&p;& &
p&=&(Person)&q.getSingleResult();& &
}&catch(NoResultException&e)&{& &
p&=&null;& &
忽略所有异常错误的写法:
doStuff();& &
}&catch(Exception&e)&{& &
log.fatal("Could&not&do&stuff");& &
doMoreStuff();&&
这个代码有两个问题, 一个是没有告诉调用者, 系统调用出错了. 第二个是日志没有出错原因, 很难跟踪定位问题。正确的写法:
doStuff();& &
}&catch(Exception&e)&{& &
throw&new&MyRuntimeException("Could&not&do&stuff&because:&"+&e.getMessage,&e);& &
重复包装RuntimeException错误的写法:
doStuff();& &
}&catch(Exception&e)&{& &
throw&new&RuntimeException(e);& &
正确的写法:
doStuff();& &
}&catch(RuntimeException&e)&{& &
throw&e;& &
}&catch(Exception&e)&{& &
throw&new&RuntimeException(e.getMessage(),&e);& &
doStuff();& &
}&catch(IOException&e)&{& &
throw&new&RuntimeException(e.getMessage(),&e);& &
}&catch(NamingException&e)&{& &
throw&new&RuntimeException(e.getMessage(),&e);& &
不正确的传播异常错误的写法:
}&catch(ParseException&e)&{& &
throw&new&RuntimeException();& &
throw&new&RuntimeException(e.toString());& &
throw&new&RuntimeException(e.getMessage());& &
throw&new&RuntimeException(e);& &
主要是没有正确的将内部的错误信息传递给调用者. 第一个完全丢掉了内部错误信息, 第二个错误信息依赖toString方法, 如果没有包含最终的嵌套错误信息, 也会出现丢失, 而且可读性差. 第三个稍微好一些, 第四个跟第二个一样。正确的写法:
}&catch(ParseException&e)&{& &
throw&new&RuntimeException(e.getMessage(),&e);& &
用日志记录异常错误的写法:
}&catch(ExceptionA&e)&{& &
log.error(e.getMessage(),&e);& &
throw&e;& &
}&catch(ExceptionB&e)&{& &
log.error(e.getMessage(),&e);& &
throw&e;& &
一般情况下在日志中记录异常是不必要的, 除非调用方没有记录日志。
异常处理不彻底错误的写法:
is&=&new&FileInputStream(inFile);& &
os&=&new&FileOutputStream(outFile);& &
}&finally&{& &
is.close();& &
os.close();& &
}&catch(IOException&e)&{& &
/*&we&can't&do&anything&*/& &
is可能close失败, 导致os没有close正确的写法:
is&=&new&FileInputStream(inFile);& &
os&=&new&FileOutputStream(outFile);& &
}&finally&{& &
try&{&if&(is&!=&null)&is.close();&}&catch(IOException&e)&{/*&we&can't&do&anything&*/}& &
try&{&if&(os&!=&null)&os.close();&}&catch(IOException&e)&{/*&we&can't&do&anything&*/}& &
捕获不可能出现的异常错误的写法:
...&do&risky&stuff&...& &
}&catch(SomeException&e)&{& &
//&never&happens& &
...&do&some&more&...&&
正确的写法:
...&do&risky&stuff&...& &
}&catch(SomeException&e)&{& &
//&never&happens&hopefully& &
throw&new&IllegalStateException(e.getMessage(),&e);&//&crash&early,&passing&all&information& &
...&do&some&more&...&&
transient的误用错误的写法:
public&class&A&implements&Serializable&{& &
private&String&someS& &
private&transient&Log&log&=&LogFactory.getLog(getClass());& &
public&void&f()&{& &
log.debug("enter&f");& &
这里的本意是不希望Log对象被序列化. 不过这里在反序列化时, 会因为log未初始化, 导致f()方法抛空指针, 正确的做法是将log定义为静态变量或者定位为具备变量。正确的写法:
public&class&A&implements&Serializable&{& &
private&String&someS& &
private&static&final&Log&log&=&LogFactory.getLog(A.class);& &
public&void&f()&{& &
log.debug("enter&f");& &
public&class&A&implements&Serializable&{& &
private&String&someS& &
public&void&f()&{& &
Log&log&=&LogFactory.getLog(getClass());& &
log.debug("enter&f");& &
不必要的初始化错误的写法:
public&class&B&{& &
private&int&count&=&0;& &
private&String&name&=&null;& &
private&boolean&important&=&false;& &
这里的变量会在初始化时使用默认值:0, null, false, 因此上面的写法有些多此一举。正确的写法:
public&class&B&{& &
private&int&& &
private&String&& &
private&boolean&& &
最好用静态final定义Log变量
private&static&final&Log&log&=&LogFactory.getLog(MyClass.class);&&
这样做的好处有三:
可以保证线程安全
静态或非静态代码都可用
不会影响对象序列化
选择错误的类加载器错误的代码:
Class&clazz&=&Class.forName(name);& &
Class&clazz&=&getClass().getClassLoader().loadClass(name);&&
这里本意是希望用当前类来加载希望的对象, 但是这里的getClass()可能抛出异常, 特别在一些受管理的环境中, 比如应用服务器, web容器, Java WebStart环境中, 最好的做法是使用当前应用上下文的类加载器来加载。正确的写法:
ClassLoader&cl&=&Thread.currentThread().getContextClassLoader();& &
if&(cl&==&null)&cl&=&MyClass.class.getClassLoader();&//&fallback& &
Class&clazz&=&cl.loadClass(name);&&
反射使用不当错误的写法:
Class&beanClass&=&...& &
if&(beanClass.newInstance()&instanceof&TestBean)&...&&
这里的本意是检查beanClass是否是TestBean或是其子类, 但是创建一个类实例可能没那么简单, 首先实例化一个对象会带来一定的消耗, 另外有可能类没有定义默认构造函数. 正确的做法是用Class.isAssignableFrom(Class) 方法。正确的写法:
Class&beanClass&=&...& &
if&(TestBean.class.isAssignableFrom(beanClass))&...&&
不必要的同步错误的写法:
Collection&l&=&new&Vector();& &
for&(...)&{& &
l.add(object);& &
Vector是ArrayList同步版本。正确的写法:
Collection&l&=&new&ArrayList();& &
for&(...)&{& &
l.add(object);& &
错误的选择List类型根据下面的表格数据来进行选择
&ArrayListLinkedList
add (append)O(1) or ~O(log(n)) if growingO(1)
insert (middle)O(n) or ~O(n*log(n)) if growingO(n)
remove (middle)O(n) (always performs complete copy)O(n)
iterateO(n)O(n)
get by indexO(1)O(n)
&HashMap size陷阱错误的写法:
Map&map&=&new&HashMap(collection.size()); &
for&(Object&o&:&collection)&{ &
&&map.put(o.key,&o.value); &
这里可以参考guava的Maps.newHashMapWithExpectedSize的实现. 用户的本意是希望给HashMap设置初始值, 避免扩容(resize)的开销. 但是没有考虑当添加的元素数量达到HashMap容量的75%时将出现resize。正确的写法:
Map&map&=&new&HashMap(1&+&(int)&(collection.size()&/&0.75));&
对Hashtable, HashMap 和 HashSet了解不够这里主要需要了解HashMap和Hashtable的内部实现上, 它们都使用Entry包装来封装key/value, Entry内部除了要保存Key/Value的引用, 还需要保存hash桶中next Entry的应用, 因此对内存会有不小的开销, 而HashSet内部实现其实就是一个HashMap. 有时候IdentityHashMap可以作为一个不错的替代方案. 它在内存使用上更有效(没有用Entry封装, 内部采用Object[]). 不过需要小心使用. 它的实现违背了Map接口的定义. 有时候也可以用ArrayList来替换HashSet.这一切的根源都是由于JDK内部没有提供一套高效的Map和Set实现。
对List的误用建议下列场景用Array来替代List:
list长度固定,比如一周中的每一天
对list频繁的遍历,比如超过1w次
需要对数字进行包装(主要JDK没有提供基本类型的List)
比如下面的代码。错误的写法:
List&Integer&&codes&=&new&ArrayList&Integer&(); &
codes.add(Integer.valueOf(10)); &
codes.add(Integer.valueOf(20)); &
codes.add(Integer.valueOf(30)); &
codes.add(Integer.valueOf(40));&
正确的写法:
int[]&codes&=&{&10,&20,&30,&40&};&
错误的写法:
//&horribly&slow&and&a&memory&waster&if&l&has&a&few&thousand&elements&(try&it&yourself!) &
List&Mergeable&&l&=&...; &
for&(int&i=0;&i&&&l.size()-1;&i++)&{ &
&&&&Mergeable&one&=&l.get(i); &
&&&&Iterator&Mergeable&&j&=&l.iterator(i+1);&//&memory&allocation! &
&&&&while&(j.hasNext())&{ &
&&&&&&&&Mergeable&other&=&l.next(); &
&&&&&&&&if&(one.canMergeWith(other))&{ &
&&&&&&&&&&&&one.merge(other); &
&&&&&&&&&&&&other.remove(); &
&&&&&&&&} &
正确的写法:
//&quite&fast&and&no&memory&allocation &
Mergeable[]&l&=&...; &
for&(int&i=0;&i&&&l.length-1;&i++)&{ &
&&&&Mergeable&one&=&l[i]; &
&&&&for&(int&j=i+1;&j&&&l.&j++)&{ &
&&&&&&&&Mergeable&other&=&l[j]; &
&&&&&&&&if&(one.canMergeWith(other))&{ &
&&&&&&&&&&&&one.merge(other); &
&&&&&&&&&&&&l[j]&=&null; &
&&&&&&&&} &
实际上Sun也意识到这一点, 因此在JDK中, Collections.sort()就是将一个List拷贝到一个数组中然后调用Arrays.sort方法来执行排序。
用数组来描述一个结构错误用法:
*&@returns&[1]:&Location,&[2]:&Customer,&[3]:&Incident& &
Object[]&getDetails(int&id)&{...&&
这里用数组+文档的方式来描述一个方法的返回值. 虽然很简单, 但是很容易误用, 正确的做法应该是定义个类。正确的写法:
Details&getDetails(int&id)&{...}& &
private&class&Details&{& &
public&Location&& &
public&Customer&& &
public&Incident&& &
对方法过度限制错误用法:
public&void&notify(Person&p)&{& &
sendMail(p.getName(),&p.getFirstName(),&p.getEmail());& &
class&PhoneBook&{& &
String&lookup(String&employeeId)&{& &
Employee&emp&=&...& &
return&emp.getPhone();& &
第一个例子是对方法参数做了过多的限制, 第二个例子对方法的返回值做了太多的限制。正确的写法:
public&void&notify(Person&p)&{& &
sendMail(p);& &
class&EmployeeDirectory&{& &
Employee&lookup(String&employeeId)&{& &
Employee&emp&=&...& &
return&& &
对POJO的setter方法画蛇添足错误的写法:
private&String&& &
public&void&setName(String&name)&{& &
this.name&=&name.trim();& &
public&void&String&getName()&{& &
return&this.& &
有时候我们很讨厌字符串首尾出现空格, 所以在setter方法中进行了trim处理, 但是这样做的结果带来的副作用会使getter方法的返回值和setter方法不一致, 如果只是将JavaBean当做一个数据容器, 那么最好不要包含任何业务逻辑. 而将业务逻辑放到专门的业务层或者控制层中处理。正确的做法:
person.setName(textInput.getText().trim());&&
日历对象(Calendar)误用错误的写法:
Calendar&cal&=&new&GregorianCalender(TimeZone.getTimeZone("Europe/Zurich"));& &
cal.setTime(date);& &
cal.add(Calendar.HOUR_OF_DAY,&8);& &
date&=&cal.getTime();&&
这里主要是对date, time, calendar和time zone不了解导致. 而在一个时间上增加8小时, 跟time zone没有任何关系, 所以没有必要使用Calendar, 直接用Date对象即可, 而如果是增加天数的话, 则需要使用Calendar, 因为采用不同的时令制可能一天的小时数是不同的(比如有些DST是23或者25个小时)正确的写法:
date&=&new&Date(date.getTime()&+&8L&*&3600L&*&1000L);&//&add&8&hrs&&
TimeZone的误用错误的写法:
Calendar&cal&=&new&GregorianCalendar();& &
cal.setTime(date);& &
cal.set(Calendar.HOUR_OF_DAY,&0);& &
cal.set(Calendar.MINUTE,&0);& &
cal.set(Calendar.SECOND,&0);& &
Date&startOfDay&=&cal.getTime();&&
这里有两个错误, 一个是没有没有将毫秒归零, 不过最大的错误是没有指定TimeZone, 不过一般的桌面应用没有问题, 但是如果是服务器端应用则会有一些问题, 比如同一时刻在上海和伦敦就不一样, 因此需要指定的TimeZone.正确的写法:
Calendar&cal&=&new&GregorianCalendar(user.getTimeZone());& &
cal.setTime(date);& &
cal.set(Calendar.HOUR_OF_DAY,&0);& &
cal.set(Calendar.MINUTE,&0);& &
cal.set(Calendar.SECOND,&0);& &
cal.set(Calendar.MILLISECOND,&0);& &
Date&startOfDay&=&cal.getTime();&&
时区(Time Zone)调整的误用错误的写法:
public&static&Date&convertTz(Date&date,&TimeZone&tz)&{& &
Calendar&cal&=&Calendar.getInstance();& &
cal.setTimeZone(TimeZone.getTimeZone("UTC"));& &
cal.setTime(date);& &
cal.setTimeZone(tz);& &
return&cal.getTime();& &
这个方法实际上没有改变时间, 输入和输出是一样的. 关于时间的问题可以参考这篇文章: http://www.odi.ch/prog/design/datetime.php 这里主要的问题是Date对象并不包含Time Zone信息. 它总是使用UTC(世界统一时间). 而调用Calendar的getTime/setTime方法会自动在当前时区和UTC之间做转换。
Calendar.getInstance()的误用错误的写法:
Calendar&c&=&Calendar.getInstance();& &
c.set(2009,&Calendar.JANUARY,&15);&&
Calendar.getInstance()依赖local来选择一个Calendar实现, 不同实现的2009年是不同的, 比如有些Calendar实现就没有January月份。正确的写法:
Calendar&c&=&new&GregorianCalendar(timeZone);& &
c.set(2009,&Calendar.JANUARY,&15);&&
Date.setTime()的误用错误的写法:
account.changePassword(oldPass,&newPass);& &
Date&lastmod&=&account.getLastModified();& &
lastmod.setTime(System.currentTimeMillis());&&
在更新密码之后, 修改一下最后更新时间, 这里的用法没有错,但是有更好的做法: 直接传Date对象. 因为Date是Value Object, 不可变的. 如果更新了Date的值, 实际上是生成一个新的Date实例. 这样其他地方用到的实际上不在是原来的对象, 这样可能出现不可预知的异常. 当然这里又涉及到另外一个OO设计的问题, 对外暴露Date实例本身就是不好的做法(一般的做法是在setter方法中设置Date引用参数的clone对象). 另外一种比较好的做法就是直接保存long类型的毫秒数。正确的做法:
account.changePassword(oldPass,&newPass);& &
account.setLastModified(new&Date());&&
SimpleDateFormat非线程安全误用错误的写法:
public&class&Constants&{& &
public&static&final&SimpleDateFormat&date&=&new&SimpleDateFormat("dd.MM.yyyy");& &
SimpleDateFormat不是线程安全的. 在多线程并行处理的情况下, 会得到非预期的值. 这个错误非常普遍! 如果真要在多线程环境下公用同一个SimpleDateFormat, 那么做好做好同步(cache flush, lock contention), 但是这样会搞得更复杂, 还不如直接new一个实在。
使用全局参数配置常量类/接口
public&interface&Constants&{& &
String&version&=&"1.0";& &
String&dateFormat&=&"dd.MM.yyyy";& &
String&configFile&=&".apprc";& &
int&maxNameLength&=&32;& &
String&someQuery&=&"SELECT&*&FROM&...";& &
很多应用都会定义这样一个全局常量类或接口, 但是为什么这种做法不推荐? 因为这些常量之间基本没有任何关联, 只是因为公用才定义在一起. 但是如果其他组件需要使用这些全局变量, 则必须对该常量类产生依赖, 特别是存在server和远程client调用的场景。比较好的做法是将这些常量定义在组件内部. 或者局限在一个类库内部。
忽略造型溢出(cast overflow)错误的写法:
public&int&getFileSize(File&f)&{& &
long&l&=&f.length();& &
return&(int)&l;& &
这个方法的本意是不支持传递超过2GB的文件. 最好的做法是对长度进行检查, 溢出时抛出异常。正确的写法:
public&int&getFileSize(File&f)&{& &
long&l&=&f.length();& &
if&(l&&&Integer.MAX_VALUE)&throw&new&IllegalStateException("int&overflow");& &
return&(int)&l;& &
另一个溢出bug是cast的对象不对, 比如下面第一个println. 正确的应该是下面的那个。
long&a&=&System.currentTimeMillis();& &
long&b&=&a&+&100;& &
System.out.println((int)&b-a);& &
System.out.println((int)&(b-a));&&
对float和double使用==操作错误的写法:
for&(float&f&=&10f;&f!=0;&f-=0.1)&{& &
System.out.println(f);& &
上面的浮点数递减只会无限接近0而不会等于0, 这样会导致上面的for进入死循环. 通常绝不要对float和double使用==操作. 而采用大于和小于操作. 如果java编译器能针对这种情况给出警告. 或者在java语言规范中不支持浮点数类型的==操作就最好了。正确的写法:
for&(float&f&=&10f;&f&0;&f-=0.1)&{& &
System.out.println(f);& &
用浮点数来保存money错误的写法:
float&total&=&0.0f;& &
for&(OrderLine&line&:&lines)&{& &
total&+=&line.price&*&line.& &
double&a&=&1.14&*&75;&//&85.5&将表示为&85.4999...& &
System.out.println(Math.round(a));&//&输出值为85& &
BigDecimal&d&=&new&BigDecimal(1.14);&//造成精度丢失&&
这个也是一个老生常谈的错误. 比如计算100笔订单, 每笔0.3元, 最终的计算结果是29.9999971. 如果将float类型改为double类型, 得到的结果将是30.896. 出现这种情况的原因是, 人类和计算的计数方式不同. 人类采用的是十进制, 而计算机是二进制.二进制对于计算机来说非常好使, 但是对于涉及到精确计算的场景就会带来误差. 比如银行金融中的应用。因此绝不要用浮点类型来保存money数据. 采用浮点数得到的计算结果是不精确的. 即使与int类型做乘法运算也会产生一个不精确的结果.那是因为在用二进制存储一个浮点数时已经出现了精度丢失. 最好的做法就是用一个string或者固定点数来表示. 为了精确, 这种表示方式需要指定相应的精度值.BigDecimal就满足了上面所说的需求. 如果在计算的过程中精度的丢失超出了给定的范围, 将抛出runtime exception.正确的写法:
BigDecimal&total&=&BigDecimal.ZERO;& &
for&(OrderLine&line&:&lines)&{& &
BigDecimal&price&=&new&BigDecimal(line.price);& &
BigDecimal&count&=&new&BigDecimal(line.count);& &
total&=&total.add(price.multiply(count));&//&BigDecimal&is&immutable!& &
total&=&total.setScale(2,&RoundingMode.HALF_UP);& &
BigDecimal&a&=&(new&BigDecimal("1.14")).multiply(new&BigDecimal(75));&//&85.5&exact& &
a&=&a.setScale(0,&RoundingMode.HALF_UP);&//&86& &
System.out.println(a);&//&correct&output:&86& &
BigDecimal&a&=&new&BigDecimal("1.14");&&
不使用finally块释放资源错误的写法:
public&void&save(File&f)&throws&IOException&{& &
OutputStream&out&=&new&BufferedOutputStream(new&FileOutputStream(f));& &
out.write(...);& &
out.close();& &
public&void&load(File&f)&throws&IOException&{& &
InputStream&in&=&new&BufferedInputStream(new&FileInputStream(f));& &
in.read(...);& &
in.close();& &
上面的代码打开一个文件输出流, 操作系统为其分配一个文件句柄, 但是文件句柄是一种非常稀缺的资源, 必须通过调用相应的close方法来被正确的释放回收. 而为了保证在异常情况下资源依然能被正确回收, 必须将其放在finally block中. 上面的代码中使用了BufferedInputStream将file stream包装成了一个buffer stream, 这样将导致在调用close方法时才会将buffer stream写入磁盘. 如果在close的时候失败, 将导致写入数据不完全. 而对于FileInputStream在finally block的close操作这里将直接忽略。如果BufferedOutputStream.close()方法执行顺利则万事大吉, 如果失败这里有一个潜在的bug(/view_bug.do?bug_id=6335274): 在close方法内部调用flush操作的时候, 如果出现异常, 将直接忽略. 因此为了尽量减少数据丢失, 在执行close之前显式的调用flush操作。下面的代码有一个小小的瑕疵: 如果分配file stream成功, 但是分配buffer stream失败(OOM这种场景), 将导致文件句柄未被正确释放. 不过这种情况一般不用担心, 因为JVM的gc将帮助我们做清理。
//&code&for&your&cookbook& &
public&void&save()&throws&IOException&{& &
File&f&=&...& &
OutputStream&out&=&new&BufferedOutputStream(new&FileOutputStream(f));& &
out.write(...);& &
out.flush();&//&don't&lose&exception&by&implicit&flush&on&close& &
}&finally&{& &
out.close();& &
public&void&load(File&f)&throws&IOException&{& &
InputStream&in&=&new&BufferedInputStream(new&FileInputStream(f));& &
in.read(...);& &
}&finally&{& &
try&{&in.close();&}&catch&(IOException&e)&{&}& &
数据库访问也涉及到类似的情况:
Car&getCar(DataSource&ds,&String&plate)&throws&SQLException&{& &
Car&car&=&null;& &
Connection&c&=&null;& &
PreparedStatement&s&=&null;& &
ResultSet&rs&=&null;& &
c&=&ds.getConnection();& &
s&=&c.prepareStatement("select&make,&color&from&cars&where&plate=?");& &
s.setString(1,&plate);& &
rs&=&s.executeQuery();& &
if&(rs.next())&{& &
car&=&new&Car();& &
car.make&=&rs.getString(1);& &
car.color&=&rs.getString(2);& &
}&finally&{& &
if&(rs&!=&null)&try&{&rs.close();&}&catch&(SQLException&e)&{&}& &
if&(s&!=&null)&try&{&s.close();&}&catch&(SQLException&e)&{&}& &
if&(c&!=&null)&try&{&c.close();&}&catch&(SQLException&e)&{&}& &
return&& &
finalize方法误用错误的写法:
public&class&FileBackedCache&{& &
private&File&backingS& &
protected&void&finalize()&throws&IOException&{& &
if&(backingStore&!=&null)&{& &
backingStore.close();& &
backingStore&=&null;& &
这个问题Effective Java这本书有详细的说明. 主要是finalize方法依赖于GC的调用, 其调用时机可能是立马也可能是几天以后, 所以是不可预知的. 而JDK的API文档中对这一点有误导:建议在该方法中来释放I/O资源。正确的做法是定义一个close方法, 然后由外部的容器来负责调用释放资源。
public&class&FileBackedCache&{& &
private&File&backingS& &
public&void&close()&throws&IOException&{& &
if&(backingStore&!=&null)&{& &
backingStore.close();& &
backingStore&=&null;& &
在JDK 1.7 (Java 7)中已经引入了一个AutoClosable接口. 当变量(不是对象)超出了try-catch的资源使用范围, 将自动调用close方法。
try&(Writer&w&=&new&FileWriter(f))&{&//&implements&Closable& &
w.write("abc");& &
//&w&goes&out&of&scope&here:&w.close()&is&called&automatically&in&ANY&case& &
}&catch&(IOException&e)&{& &
throw&new&RuntimeException(e.getMessage(),&e);& &
Thread.interrupted方法误用错误的写法:
Thread.sleep(1000);& &
}&catch&(InterruptedException&e)&{& &
while&(true)&{& &
if&(Thread.interrupted())&break;& &
这里主要是interrupted静态方法除了返回当前线程的中断状态, 还会将当前线程状态复位。正确的写法:
Thread.sleep(1000);& &
}&catch&(InterruptedException&e)&{& &
Thread.currentThread().interrupt();& &
while&(true)&{& &
if&(Thread.currentThread().isInterrupted())&break;& &
在静态变量初始化时创建线程错误的写法:
class&Cache&{& &
private&static&final&Timer&evictor&=&new&Timer();& &
Timer构造器内部会new一个thread, 而该thread会从它的父线程(即当前线程)中继承各种属性。比如context classloader, threadlocal以及其他的安全属性(访问权限)。 而加载当前类的线程可能是不确定的,比如一个线程池中随机的一个线程。如果你需要控制线程的属性,最好的做法就是将其初始化操作放在一个静态方法中,这样初始化将由它的调用者来决定。正确的做法:
class&Cache&{& &
private&static&Timer&& &
public&static&setupEvictor()&{& &
evictor&=&new&Timer();& &
已取消的定时器任务依然持有状态错误的写法:
final&MyClass&callback&=&this;& &
TimerTask&task&=&new&TimerTask()&{& &
public&void&run()&{& &
callback.timeout();& &
timer.schedule(task,&300000L);& &
doSomething();& &
}&finally&{& &
task.cancel();& &
上面的task内部包含一个对外部类实例的应用, 这将导致该引用可能不会被GC立即回收. 因为Timer将保留TimerTask在指定的时间之后才被释放. 因此task对应的外部类实例将在5分钟后被回收。正确的写法:
TimerTask&task&=&new&Job(this);& &
timer.schedule(task,&300000L);& &
doSomething();& &
}&finally&{& &
task.cancel();& &
static&class&Job&extends&TimerTask&{& &
private&MyClass&& &
public&Job(MyClass&callback)&{& &
this.callback&=&& &
public&boolean&cancel()&{& &
callback&=&null;& &
return&super.cancel();& &
public&void&run()&{& &
if&(callback&==&null)&return;& &
callback.timeout();& &
原文链接:
  1.背包系统  背包系统是指玩家选择自己喜欢的装备捆绑成一个背包,每次开始新回合或复活时都可以通过更换背包来换取合适的整套装备的系统。该系统有效弥补了游戏结束为止只能用一个武器进行到底的单调性。现以调整到每人最多可使用五个背包,但是你使用了其中的任何一件物品就无法转换(包括一颗子弹),大大提高了游戏的趣味性。
2.人物个性装扮  目前在线FPS游戏...&
&  1.背包系统&  背包系统是指玩家选择自己喜欢的装备捆绑成一个背包,每次开始新回合或复活时都可以通过更换背包来换取合适的整套装备的系统。该系统有效弥补了游戏结束为止只能用一个武器进行到底的单调性。现以调整到每人最多可使用五个背包,但是你使用了其中的任何一件物品就无法转换(包括一颗子弹),大大提高了游戏的趣味性。&
2.人物个性装扮&  目前在线FPS游戏的玩家越来越渴望个性装扮来展现自我,crossfire里可以让玩家根据自己的军衔和成绩装扮出与众不同的自己。&  3.支持多种功能&  社区战队、好友系统、拒绝目录等基础的社区功能外,还有通过方便的好友间聊天了解对方的位置信息,形成及维持紧密的社区。&  4.多种便利系统&  战斗时可以确认对方的受伤状态,对战时也可以怎么杀死对方的、是否是连杀等。观战模式中也给玩家提供了多种有利信息。&  5.强制退出系统&  关于强行退出类型&  1.外挂/非法软件(无限子弹\手雷,隐身,加速,透视,稳枪,遁地,显刀,无后坐力,放大呼吸,自动瞄准,自动开枪,自动爆头等)&  2.恶意使用BUG(卡墙缝、箱子等)&  3.辱骂及诽谤他人&  4.长时间挂机&  5.其他&  以上是常见的强行退出类型,但70%都是被误踢。&  6.游戏内投诉功能&  如果发现有人使用各种外挂、利用地图BUG获利或恶意辱骂等不正当的游戏行为,玩家可以马上进行投诉。&  我们将参考玩家投诉的情况,进一步证实后,对被投诉者采取一定的处罚。&  但请玩家注意:证实为恶意或虚假投诉则投诉者有可能被封号处理。&  投诉具体操作如下:&  1.在游戏进行中按ESC键,弹出窗口,点击&投诉&。&  2.在弹出的投诉窗口中选择投诉事项。&  3.在弹出的投诉窗口中选择要投诉的玩家(单选)。&  4.在弹出的投诉窗口中简要填写投诉内容。&  5.点击&保存&按钮。&  7.推荐道具购买功能&  玩家在频道选择画面中的推荐道具可以查看推荐道具的说明,并可以直接购买相应道具。&  8.全新徽章系统&  1.什么是徽章:徽章是一种在达成游戏规定的目标(数值)时给玩家赋予荣誉属性的象征。&  2.徽章的种类:穿越火线中的徽章分为五大类:3徽章越高也就越强&  狙击兵徽章擅长使用狙击枪的玩家有机会获得。&  侦察兵徽章擅长使用冲锋枪和散弹枪的玩家有机会获得。&  突击兵徽章擅长使用步枪和机枪的玩家有机会获得。&  精英徽章同时获得徽章、徽章、突击兵徽章的玩家即可获。&  特种兵徽章擅长使用刀、手枪和投掷类武器的玩家有机会获得。&  3.徽章的等级 每种徽章分为C/B/A三个级别,每个级别又分为1、2、3三个子级别。
  AWM是CF中威力最大的GP狙击枪,它的子弹能够轻松杀死身穿盔甲的敌人。而无论距离长短,它的准确率都非常高,这主要归功于它强大的瞄准镜。按一下右键,它的视野射程将会放大两倍。
  ① AWM的资料:
价格:18000GP弹夹容量:10发/夹...&
  AWM是CF中威力最大的GP狙击枪,它的子弹能够轻松杀死身穿盔甲的敌人。而无论距离长短,它的准确率都非常高,这主要归功于它强大的瞄准镜。按一下右键,它的视野射程将会放大两倍。
  ① AWM的资料:
&价格:18000GP&弹夹容量:10发/夹&弹药最大携带量:20发
&武器特殊功能: 瞄准镜&威力:非常强& 射程:非常远
&精确度:非常高&装弹速度:中等&射速:缓慢
  武器特殊
  ② AWM特点
  优点:
  第一: 一击必杀(如果你不是喜欢打大腿的货)!AWM的毙命可能性永远在80%以上。这是让对手感到最害怕的。
  第二: 镇山之宝!如果战友知道本队有一个AWM好手,一定会使他们更有自信和安全感。相反,敌人如知道我方有一个AWM好手,会让他们自信减半。所以,AWM的影响力是非常大。
  第三: 转换重器!一把AWM很可能在几秒钟内改变整个战场的形势,WIN的机率大大增加。
  缺点:
  第一: 上弹速慢!每一发的间隔约0.8秒。所以,一定要学会如何闪避。否则,就等于赠送一条命。
  第二: 被击中时镜子斗动幅度太,容易放空枪。
  第三: 视野狭小!开镜后,圈外一片漆黑,如果有战友保护你还好,若没有,你将会死的不明不白。(也许被刀子刮死啊!)
  第四: 心里压力!不论你是菜鸟还是高手,当使用AWM时,都会无形的产生巨大的压力。特别是敌人靠近你时,会使你透不过气。所以要做一个真正的狙击手首先必须端正心态。
  第五: 穿透力一般!
  ③ AWM的使用要点
  使用AWM要本着快,准,站,闪,忍几个原则。
  1.快:由于AWM可以一击必杀,所以当敌人出现在你的视野中,要以最快的方法杀死他,要全神贯注每一秒,做到眼睛看到,脑中想好,手上瞄好同时进行,然后射击!
  2.准:AWM的精确度是100%。但在实战中,有许多重要因素会影响精确度。我曾有过自己明明瞄的很准,却一发落空,而对方依旧活蹦乱跳。如果对方在跑动,我开一倍镜,大约在跑动距红心1.8~2.2毫米处开枪能够命中,过早过晚都会失败。要想打好,在实战中就必须经常练习。
  3.站:AWM使用者的站位是至关重要的问题。
  1)不是最高的。
  2)要站在最中间。
  3)视野狭长或广阔处一定要守,还要能及时逃掉的。
  4.闪:这里说的&闪&是闪避的意思。做为狙击手要找到掩体来避开对方的子弹。要巧妙的运用Q键切换,左右的跑动,上下的跳蹲来躲开对方的攻击。等待时机再次用狙攻击。
  5.忍:忍耐是一个王牌狙击手最重要的一点。忍耐可以帮助你提高心理能力,可以帮你缓解压力。但是忍耐不是一味的傻等!在忍耐中要高度集中注意力,不要防过眼前的易取猎物。忍耐还能帮你克服情绪,不要一时冲动而白白牺牲,留着小命是高手的上策。
& ④ AWM的五大狙击用法
  AWM的使用方法共分六种:1.甩狙.  2.瞬狙. 3.蹲点狙.  4.闪狙. 5.跳狙 6.盲狙
  1. 甩狙
  每一位CFER都听过&甩狙&,但不一定每一个人都真正懂得什么是&甩狙&。它是利用狙击枪移动时极短两点的距离来杀死在这一小段距离中所有的敌人,要求反应快,因为机会就在一瞬间。&甩狙&是一种感觉,需要很长时间的练习才能甩好枪。
  用甩枪法可以轻易的干掉三种敌人:
  a) 快速冲出来的.
  b) 冒头看一下又回去的
  c) 露出头刚要用AWM瞄你的
  *评价:我个人认为,练习&甩狙&没什么太苛刻的要求,只要反应速度快,基本两个星期的苦练就够了,适合大众玩家。
  2. 瞬狙
  这种方法是一个优秀狙击手必须牢牢掌握的,它的用途十分广泛。例如,在被敌人近身时,一般的小菜都会慌乱的切枪,但是人家机枪一顿泼射,手枪还切出来就死了。如果是一名冷静的狙击手会用这种极端的方式搏一下,有很大的几率做掉敌人!这种方法的好处在于速度快,一枪毙命,只要你天天努力练习,一定很快会有成效。
  *评价:狙击手最害怕的就是敌人的距离太近。敌人的靠近使你紧张,而且不太好瞄准。这时瞬镜会是你心中最坚信的技术。
  3. 蹲点狙
  这种方法是比较老套的,就是打一个提前量。将准心放在敌人的必经之路上,向前平移一段距离,等敌人撞上来再开枪。&蹲点狙&没有什么多说的。关于提前量的多少有反应问题,只要你多练就能熟悉。
  *评价:我认为大家不要过多的依靠这种方法。在实战中,&蹲点狙&只能打那些菜鸟,而面对高手是根本没有作用的。如果拿AWM只会用&蹲点狙&,那他根本就不是一个真正的狙击手。
  4. 闪狙
  这种方法是非常流行的身法,就是要求在闪出掩体的一瞬间开镜,开枪,回撤。
  *评价:&闪狙&是比较重要的方法。学会这种打法就等于你在战场的死亡率减少20%和杀敌率增加20%。
  5.跳狙
  这种打法主要用于对狙战中,跳起后在半空开镜,落地的一瞬间开枪杀死对方。&跳狙&对于打击已经站好位置的狙击手是十分有效的。值得注意的是:一定不能在半空中开枪。那样如果能打到对方,就真的是纯属巧合啦!
  *评价:少用唯妙,因为对手如果不是小菜,那么你在半空还没开镜就会被OK掉。
  6. 盲狙
  这种方法主要是在近距离或中近距离突然遇见敌人时,利用手枪的准心瞄准对方,立刻切换成不开镜的狙,直接发枪。如果你技术好的话,就不用手枪来定准心,直接用狙击枪来找准星。当狙击枪和敌人在一条直线上时,屏中会显示对方的ID,你只要开枪就行了。
  *评价:&盲狙&中了只会是运气,想要对付近身的敌人,那就好好练练瞬狙。
  ⑤&AWM的小技巧
  *一般有冲锋手驻守的较大转弯处,你要快速闪出去开枪。
  *周围暂时安全时,用小刀、手雷或手枪来切换AWM,提高移动速度。
  *打完一枪后,连按两下&Q&键,以换枪的短时间来节省上弹时间。(当然,如果你选择连镜在机枪的扫射下硬拼也可以)
  *AWM切换辅助工具的速度是:C4最快,手雷第二,小刀第三,手枪垫底。
  *沙漠之鹰、毛瑟军用手枪是最好的防身武器,但前提是你能用好它们。
  *记得一定要装闪光弹,它有助于你在危机中逃跑。
  *如果情况危机,一定不要舍不得放弃AWM,换一把冲锋枪或步枪更保险。
  *打起100%的精神集中注意力,省得死都不知道人在那打的。
CF战队系统介绍战队系统是为进一步促进玩家间的交流,增强游戏的黏着力而推出的新型游戏功能。此游戏团队将由官方认可并提供战队管理功能,而一切细节事物都将由玩家自行管理。通过战队可以促进玩家的个人成长,培养游戏的团队意识。
创建cf战队条件您在该游戏大区的游戏等级达到下士,并且尚未加入该大区中的其他战队,即可创建属于自己的战队。
查看和创建CF战队?...&
介绍战队系统是为进一步促进玩家间的交流,增强游戏的黏着力而推出的新型游戏功能。此游戏团队将由官方认可并提供战队管理功能,而一切细节事物都将由玩家自行管理。通过战队可以促进玩家的个人成长,培养游戏的团队意识。
创建战队条件您在该游戏大区的游戏等级达到下士,并且尚未加入该大区中的其他战队,即可创建属于自己的战队。
查看和创建? 玩家可以在登陆官网首页后,点击右侧战队系统进入按钮,即可进入战队系统专题页面;或直接打开此官网链接。
创建进入专题页面,在战队首页右边登陆您的QQ账号,登陆成功后你就会发现登陆QQ号下面第一行有&创建战队&字样,点击后就进入了&创建战队&的流程。选择大区,填写战队名称-战队介绍-战队管理密码依次向下逐一认真填写后点&提交&就成功建立战队。创建战队过程中可以同时上传符合标准的战队图标图片,上传图片格式为JPG或GIF,图片&50k。历来,战队就是FPS(第一视角射击类游戏)最重要的玩家组织,而战队系统是各枪战游戏运营商所重点关注的系统建设,他能进一步促进玩家间的交流,增强游戏的黏着力,当然也让玩家在其中获得了无尽的乐趣和找到了好友与组织。《》(简称)可以说是08年最引入瞩目的FPS网络游戏,其超过70万同时在线的人气毫无疑义的证明了游戏的优秀与精彩,而运营官方的不懈努力也是这款游戏得以长足发展的基础和关键,今天小编从火线官方拿到了其战队系统2期的一系列资料,其强大的战队管理功能,令编者为之震撼,不得不说其是史上最强的FPS战队管理系统。让我们一同来领略一下这款独到游戏的战队管理系统的细节与精彩。首先只要玩家在某个游戏大区的游戏等级达到了下士,并且尚未加入该大区中的其他战队,即可创建属于自己的战队。进入战队系统专题,在战队首页右边登陆QQ账号,登陆成功后就会发现登陆QQ号下面第一行有&创建战队&字样,点击后就进入了&创建战队&的流程。选择大区,填写战队名称-战队介绍-战队管理密码依次向下逐一认真填写后点&提交&就成功建立战队。创建战队过程中可以同时上传符合标准的战队图标图片,上传图片格式为JPG或GIF,图片要求小于50k,这可正是战队玩家们发挥创意的最好时机了。
而作为一个普通玩家,在战队首页右边登陆QQ账号,登陆成功后点击QQ号下面最后一行的&我的战队&按钮后会出现你所在战队的详细状态信息。包括队名、队长、等级、人数/上限、活跃度、创建时间、大区、状态、操作等信息。当然,如果点击&加入战队&按钮,出现当前已成立的战队列表,玩家就可以通过选择大区并选择相关查询条件,查找到符合条件的战队;或者通过战队名称关键字模糊查找到合心意的战队去参与了。但是&申请加入&必须得到战队队长的许可,系统会将玩家的申请内容发送给战队队长,由队长进行审批,队长批准后方可成功加入该战队。每个QQ号在每个大区中只能加入一个战队。而让CF的战队系统能称之为史上最强的核心并不在于这些普通的功能,官方匠心独具的为每个战队开辟了战队空间,战队空间的战队资料包括战队名称、所在大区、人数、等级、所属网吧、网吧地址、活跃值与贡献度的详细介绍。中间栏为战队宣言、战队公告和最新留言。右上侧为战队成员、战队历史、战队管理进入按钮,右下栏为战队队员的贡献度排行。详细信息一目了然,并具官方透漏,在后续的版本中,游戏中将体现玩家自创的战队图标,让所有战队系统中的战队在游戏中充分展示自己的风采篇幅所限,诸多功能在这里无法一一为读者描述,但更多的精彩和功能,在火线战队系统中可以说表现得淋漓尽致,每一个有梦想的射击游戏玩家,都期待着拥有属于自己的战队,那么,不要错过,精彩尽在
没有人知道究竟是谁创建了潜伏者雇佣兵公司,也没有人知道它的总部究竟在哪里。有人说它是为第三世界国家服务,也有人声称它曾为叛军执行&特殊任务&。然而至今为止,无人找到这家公司的负责人,甚至没有任何法律可以约束到它……
但至少有一点每个人都清楚:潜伏者从不为强国服务。
有人说,潜伏者的成员身上流动的是野性的血&...&
没有人知道究竟是谁创建了潜伏者雇佣兵公司,也没有人知道它的总部究竟在哪里。有人说它是为第三世界国家服务,也有人声称它曾为叛军执行&特殊任务&。然而至今为止,无人找到这家公司的负责人,甚至没有任何法律可以约束到它&&
但至少有一点每个人都清楚:潜伏者从不为强国服务。
有人说,潜伏者的成员身上流动的是野性的血&&这让他们愿意为弱小国家服务,甚至执行某些&特殊服务&。但对于外人来说,有关他们的一切都仅仅是猜测罢了。
早在保卫者佣兵公司成立之初,便开始公开招募从各个著名特种部队中退役的队员。这家佣兵公司以维护和平为名义,服务于强势国家。他们宣称自己拥有最正义的立场,如果战斗违背了他们的信念,即使有再多金钱的诱惑,他们也决不为所动。
然而,保卫者从不透露他们进行的每一场战斗的具体情况,甚至对内部成员也不愿多说。因此,他们公开宣称的一场场&正义&行动受到了越来越多人的质疑。
很快,外界开始指责他们是强势国家和大型财团的工具。甚至更有传言说,因为在保卫者佣兵公司的所作所为违背了自己的理想,许多优秀队员黯然离开了这家公司。
斯沃特(A国):
在L城有做居高不下的犯罪率。20世纪60年代中期,为了应对日益严重的暴力犯罪活动,L城的警方开始着手建立一支反应迅速、训练有素、装备精良且能够应对重大突发暴力活动的特警部队,于是斯沃特诞生了。斯沃特全编制67人,由一名中尉领导整个斯沃特,6名士官领导6支分队,每分队下辖管两个5人小队。执行任务时,各小队又编成进攻组、狙击组、支援组、医...&
斯沃特(A国):
在L城有做居高不下的犯罪率。20世纪60年代中期,为了应对日益严重的暴力犯罪活动,L城的警方开始着手建立一支反应迅速、训练有素、装备精良且能够应对重大突发暴力活动的特警部队,于是斯沃特诞生了。斯沃特全编制67人,由一名中尉领导整个斯沃特,6名士官领导6支分队,每分队下辖管两个5人小队。执行任务时,各小队又编成进攻组、狙击组、支援组、医疗组和谈判组。
赛斯(E国):
赛斯作为E国的特种部队,在众多近代特种部队中,是历史和传统最为悠久的一支部队。它是世界其他许多特种部队的典范。赛斯以残酷的选拔训练而闻名于世。每一位队员都是经过艰难的考核后脱颖而出的精英分子。目前,赛斯的主要任务是负责E国的国家稳定,并解决与E国相关的一切国际纷争。赛斯拥有3个团,每团都将近600至700。其中,一个团(22赛斯)是全正规部队,而其他两个团(21赛斯和23赛斯)皆隶属于地方自卫队。
奥摩(R国):
奥摩被称为R国的&黑色杀手&。内务部在R国作为独立结构,拥有极大的权利;而奥摩就配合它执行任务。奥摩是1987年成立的精英特种部队,阻止犯罪和歼灭毒品贩子是其主要任务。在重大情况发生时,奥摩往往会和阿尔法部队并肩作战。2002年在R国的一场重大人质事件中,奥摩和阿尔法部队为解救人质做出了重大贡献。
猎狐者(F国):
猎狐者是近期崛起的精锐女性佣兵组织,虽身为女性,但丝毫掩盖不住她们强势的战斗力。她们先前主要是以狩猎狐狸为生存的手段,每当入冬之后,她们的活动变得日益频繁。赤狐和灰狐是她们的狩猎对象。因为这些狐的成品属于奢侈品,交易存在高暴利,因此经常受到当地政府的限制和压迫。迫于这种环境,许多受压迫者在20世纪中期私下组织形成了这样一个反对压迫的佣兵组织,并且这个组织随着压迫而不断地扩大,目前没有人知道她们的真正势力有多么强大&&
飞虎队(中国):
飞虎队是我国执行特殊任务的一个武装部队联盟,里面的成员个个都是神枪手。主要是针对极为凶悍、极度危险、持有重型武器的敌人,为国家发生的各种突发事件所待命。飞虎队出动的时候,往往干净利落,迅速制服敌人后就把现场交其他人员处理,队员则迅速撤退,因此往往给人留下威猛而低调的形象。飞虎队从不以杀伤为目的,行动中着重隐蔽、掩护、全方位警戒、战斗中抢先发现对手和争取掌握主动权等战术,皆处处蕴含着因敌制胜,重谋略的东方军事哲学意味。与公众印象中只崇尚武力、主张以战斗手段解决问题的国外特警形象大相径庭。
一群出身贵族的女孩为了理想,从小进行各种艰苦的训练,终于被特警基地破格录取。她们行动迅速、身手敏捷,完美地完成了一个个常人不可能完成的任务。每到深夜她们都会在隐匿的地点监视敌人的一举一动,寻找合适的时机行动,人们称之为&玫瑰行动&。使用夜玫瑰进行游戏经验值加成10%。
刀锋是某联合特种部队中的一支精英小组,至今已经成立了大约十年以上,小组中的几位成员英俊潇洒,战绩显赫,在必要的时刻他们力挽狂澜,甚至是为国捐躯,以换取决定性的胜利。他们的觉悟和手段是常人无法想象的,并且行动敏捷,出手准确、果断,往往在作战中会带给对方致命一击。
澄澈的双眸,利落的短发,婀娜的蛮腰,性感的身材,灵活的思维,敏捷的身手,她们的出现再次给人眼前一亮的感觉。她们几乎没有参与过任何演练,但却能把每个任务都完成得无可挑剔。她们就是销声匿迹很久的灵狐者。这个组织中的美女们善用各种武器,善于相互配合,但为了避免和劲敌猎狐者发生正面冲突,她们往往分散而行,几年一次在特定的时间才会集体的出现。猎狐者和其他外界组织必须对她们加以提防,传说她们在公元2010年会再次集体出现&&使用灵狐者进行游戏经验值加成20%。
《穿越火线》组织(3张)1.斯沃特(美国) &SWAT反恐特警组& 来自美国洛杉矶,洛杉矶城有着居高不下的犯罪率。20世纪60年代初,为了应对日益严重的暴力犯罪活动。洛杉矶警察组织开始着手建立一支能够快速反应,训练有素,装备精良,且能够应对重大突发暴力活动的特警部队,于是斯沃特诞生了。斯沃特全编制67人,包括一名中尉领导整个斯沃特,6名士官领导6支分队,每分...&
& 《穿越火线》组织(3张)1.斯沃特(美国)&& &SWAT反恐特警组& 来自美国洛杉矶,洛杉矶城有着居高不下的犯罪率。20世纪60年代初,为了应对日益严重的暴力犯罪活动。洛杉矶警察组织开始着手建立一支能够快速反应,训练有素,装备精良,且能够应对重大突发暴力活动的特警部队,于是斯沃特诞生了。斯沃特全编制67人,包括一名中尉领导整个斯沃特,6名士官领导6支分队,每分队下辖两个5人小队。执行任务中,各小队又分成进攻组,狙击组,支援组,医疗组,谈判组。&& 2.赛斯(英国)&& &SAS 英国皇家空军特勤队&来自英国。赛斯作为英国的特种部队,是近代许多特种部队中具有悠久历史和传统的一支。他是世界其他许多特种部队的典范。赛斯以残酷的选拔训练而闻名。每一位队员都是经过艰难的考核之后脱颖而出的精英份子。目前,赛斯的主要任务是负责英国的稳定,并解决与英国相关的一切国际纷争。赛斯包括3个团,每团都将近有600至700人。一个团(22赛斯)是全正规部队,而其他两个团(21赛斯和23赛斯)皆隶属于地方自卫队。&&&& 人物一览3.奥摩(俄罗斯)&& &OHOM特种部队&来自俄罗斯。在俄罗斯,奥摩被称为黑色杀手。内务部在俄罗斯作为独立组织;而奥摩就配合他执行任务。奥摩是1987年成立的精英特种部队,奥摩往往会和阿尔法部队并肩作战。2002年在俄罗斯的一场重大人质事件中,奥摩和阿尔法部队为解救人质作出了重大贡献。&& 4.猎狐者(法国)&& 猎狐者是近期崛起的精锐女性佣兵组织,即便是女性也丝毫掩盖不住他们的强势战斗力。她们先是以猎狩狐狸为生存手段,每当入冬后,她们的活动便变得异常频繁。赤狐和灰狐是她们的狩猎目标。因为这些狐的成品非常贵重,因此交易存在高暴利,所以经常受到当地政府的限制和压迫。迫于这种环境,许多受压迫者在20世纪中期私下组织形成了这样的一个反对压迫的佣兵组织,并且这个组织随着压迫的剧烈在不断的扩大中,目前没有人知道她们的真正势力有多么强大。而且,她们爆头的声音也与众不同,不是&雷克萨斯&,而是&开克帅死&!&& 5.飞虎队(中国)&& 原型为中华人民共和国香港特别行政区特种兵救援部队,拥有着中文语音命令,是新加入的角色,他们有着强大的战斗力,每当有人向他们发起侵犯时,就会显示出他们的惊人实力。飞虎队在2003年的非法绑匪中救出了无数人质,为警方做出了巨大的贡献。背后竟然还有飞虎队3字,真是令人畏惧。&& (注:1.《穿越火线》中的飞虎队是身穿四川军区的军装,语音是带四川口音国语而不是香港飞虎队的广东话,所以《穿越火线》的飞虎队应是四川人而不是香港人。2.外服也有自己的飞虎队,比如韩国的飞虎队,美国的一个新人物G3G9)。&& 6.夜玫瑰(德国)&& 一群出身贵族的女孩为了理想,从小进行各种艰苦的训练,终于被特警基地破格录取。她们行动迅速、身手敏捷,完美地完成了一个个常人不可能完成的任务。每到深夜她们都会在隐匿的地点监视敌人的一举一动,寻找合适的时机行动,人们称之为&玫瑰行动&。&& 7.灵狐者(瑞士)&& 澄澈的双眸,利落的短发,婀娜的蛮腰,性感的身材,敏捷的身手,她们的出现再次给人眼前一亮的感觉。她们几乎没有参与过任何演练,但却能把每个任务都完成得非常完美。她们就是销声匿迹很久的灵狐者。这个组织中的女孩们善用各种武器,善于相互配合,但为了避免和劲敌猎狐者发生正面冲突,她们往往分散而行,几年一次在特定的时间才会集体的出现。猎狐者和其他外界组织必须对她们加以提防,传说她们在公元2010年会再次集体出现。现在他们已经悄然来到我们的身边,化身为&&灵狐者。&& 8.刀锋&& 刀锋是某联合特种部队中的一支精英小组,至今已经成立了大约十年以上,小组中的几位成员不仅战绩显赫,而且长相英俊潇洒,在必要的时刻他们力挽狂澜,甚至是为国捐躯,以换取决定性的胜利。他们的觉悟和手段是常人无法想象的,并且行动敏捷,出手准确、果断,往往在作战中会带给对方致命一击。资料测试:猎户者 速度加10% 防御加10% 跳跃力200 飞虎队 速度加5% 防御加25% 跳跃力205
夜玫瑰 速度加15% 防御加15% 枪械控制力20% 跳跃力200
猎狐者 夜玫瑰 优点:体型瘦弱,头颅偏小,较不易被击中或爆头 移动速度比普通角色快飞虎队 优点:跳跃力是人物中最强的 AC防御加25% 缺点:身形较大 受弹面积就大了
玩CF一段时间了,对于G我不得不在这里先鄙视一下,有句名言说得 好是男人都爱枪但爱枪得不仅仅是男人,希望我发得帖子对大家得枪械知识能多做一些补充,今天给大家介绍下。大家很喜爱得 M4. Colt M4
  口径 5.56&45mmSS109/M855采用日期 日全枪长 展开枪托 33&(840 mm)
  缩起枪托 29.8&(...&
玩CF一段时间了,对于G我不得不在这里先鄙视一下,有句名言说得 好是男人都爱枪但爱枪得不仅仅是男人,希望我发得帖子对大家得枪械知识能多做一些补充,今天给大家介绍下。大家很喜爱得 M4. Colt M4
  口径 5.56&45mm&&SS109/M855采用日期 日全枪长 展开枪托 33"(840 mm)
  缩起枪托 29.8"(760 mm)
  枪管长 14.5"(368 mm)
  膛线 6条,右旋,缠距178mm空枪重(不含弹匣) 5.9lb(2.68 kg)
  30发空弹匣重 0.11 kg 30发满弹匣重 0.45 kg理论射速 700~950 RPM有效射程 600 m瞄准基线长 14.5"(368 mm)
  初速 884 m/s(2900FPS)
  枪口动能 1645 J
  随着M16A2的研制成功,美军也开始考虑为特种部队研制发射SS109/M885弹的新型卡宾枪了。就像M16A2一样,这种新型卡宾枪也是根据海军陆战队的需求而在1983年开始设计的。当时海军陆战队的武力侦察连(Force Recon)正式装备的小型肩射武器只是M3A1&注油枪&(非正式使用的是XM177E2),而装甲车组成员也是使用M3A1,海军陆战连认为应该为这些人提供一种卡宾枪。最初柯尔特公司为海军陆战队研制的M16A2卡宾枪基本上只是把M16A2上的改变应用到653型卡宾枪上,即更换了1/7缠距的14.5英寸(368mm)重型枪管,改用M16A2消焰器,用3发点射代替全自动射击,改用M16A2的机械瞄准具。这种M16A2卡宾枪在1985年完成设计,柯尔特公司的型号编号为720型,而在军方的测试计划中称为XM4.但国会否决了海军陆战队的XM4采购预算,结果武力侦察连不得不采用海军的HK MP5-N冲锋枪来代替老旧的M3A1冲锋枪,而其他的美军特种部队则在1988年开始使用的RO727等其他M16A2卡宾枪。
  美国陆军的试验与鉴定司令部(TECOM)在1986年4月重开XM4卡宾枪的研制工作和第2阶段试验。经过进一步试验和改进后,XM4在1991年3月被正式定型并命名为&美国5.56mm北大西洋公约组织口径M4卡宾枪&(The United States Carbine, Caliber 5.56mm NATO, M4)。M4与其他M16A2卡宾枪最明显的区别特征是其枪管在距离准星座前25mm的位置上加工了一个缩颈的形状,这是在后来的试验中为了挂装M203榴弹发射器而作出的改动。为了能够挂装原有的M203榴弹发射器,M16A2在护木内的枪管直径与M16A1是相同的,但卡宾枪的护木较短而护木外又采用M16A2式的厚枪管,因此柯尔特的工程师就在护木外的枪管中段加工了这个缩颈,这样就能挂装M203榴弹发射器。固定枪托也能装上去用,但在美军中并不常见有这样做的。
  M4卡宾枪还把原本只有两个固定位置的伸缩式枪托改为有四个固定位置,再后来又改为六个。另外M4的照门虽然是M16A2式的,但表尺最远只可调到600米,而非M16A2的800米。由于下机匣是M16A2的,因此射击方式为半自动和三发点射。由于M4和M16A2非常相似,事实上它们有80%的零件可以互换,因此最初也称为M16A2卡宾枪。M4首先装备82空降师,用于取替M16A1/A2步枪、M3A1冲锋枪和车辆驾驶员使用的部分9mm手枪,1994年正式列装。
  M4卡宾枪首次参加实战是在1991年的海湾战争,战争爆发前美军突然发现他们缺少新步枪,许多部队仍在使用M16A1,而M16A2只是在1986年才开始陆续装备,有许多部队还没有完成换装。由于需要尽快获得大量的M16A2和M4,因此美国国防部批准增加M4的供应商,缅因州的大毒蛇轻武器公司(Bushmaster Firearms)获得一份供应M4卡宾枪的采购合同,并为陆军供应了4,000支M4,这批枪在&沙漠盾牌&和&沙漠风暴&期间被第82空降师使用,据说施瓦茨科普夫将军(Schwarzkopf)的护卫也是使用大毒蛇M4.然而当时美军还没有取得M4的生产权(因为美国政府已经获得M16的生产权,因此当年才能把M16A2的生产合同判给FNMI),柯尔特威胁将会控告美国政府未经许可就向其他公司转让M4的工艺文件,结果大毒蛇就只得到这一份M4的政府采购合同。
  在M4装备部队后,柯尔特又设计了一种用皮卡汀尼导轨代替固定提把的平顶型机匣,方便安装模块化的瞄准装置。在1994年8月这项改进也被美军接纳,并把这种平顶型M4正式命名为&美国5.56mm北大西洋公约组织口径M4A1卡宾枪&(The United States Carbine, Caliber 5.56mm NATO, M4A1),在柯尔特公司的编号则为927.由于特种部队不喜欢M4卡宾枪的点射限制装置而使用其他可全自动射击的M16A2卡宾枪,因此M4A1也采用了M16A1的下机匣。但在试验中发现M4A1的枪管容易过热,有射手以全自动方式连续打完6个弹匣后护木就烫得不能直接用手去碰。尽管M4A1是一把卡宾枪而不是轻机枪,但为解决这个问题柯尔特对护木进行了改进,把铝制隔热屏由原来的单层改为双层,因此也相应地加粗了护木直径。这项改进后来也应用在新生产的M4卡宾枪上,所以早期的M4/M4A1上的护木和以前的M16卡宾枪是一样的,而后来的M4/M4A1护木都比较粗。
  在1994年,海军陆战队发表了《任务需求文件1.14.》(Operational Requirements Document 1.14.),该文案中宣称从长远目光看待武力侦察连的任务,采用M4A1卡宾枪代替发射手枪弹的MP5-N冲锋枪作为CQB武器会更有效。通过一番努力,海军陆战队最终获得资金购买M4A1,但主要是装备特种部队。而美国陆军也在1994年8月正式采用M4/M4A1卡宾枪,首先装备特种部队和快速反应部队。
  限制3发点射的M4卡宾枪多数装备车组成员、机组成员、文书或军官,例如M1坦克车组成员多年来是使用4支M3A1冲锋枪作为自卫武器的,现在则改为两支M4卡宾枪和两把M9手枪。由于平顶型机匣方便安装瞄准镜,除了早期的订货是有A2提把外,现在美军所有采购的M4均采用平顶机匣,配用的瞄准镜主要为Trijicon公司的TA11和TA31 ACOG及Aimpoint M68 CCO.目前的政府标准型M4系列为柯尔特920型(平顶M4,快慢机为&S-1-3&)和柯尔特921型(M4A1,快慢机为&S-1-F&)。
  配备KAC M4 RAS护木的柯尔特925型卡宾枪经过测试后被定型为M4E2,但这个名称似乎由于对已有的卡宾枪安装这个护木后是否需也应更改名称的困惑而被放弃。美国陆军野战手册中把安装RAS的M4系列称为模块化武器系统(Modular Weapon System)或简称M4 MWS.
  尽管M4A1是为特种部队研制的,但陆军在1998年宣布,计划在常规部队中用带RAS护木的M4A1取代M16A2作为制式步枪,而原来的M16A2则转交预备役部队和海岸防卫队(注:另一些资料指出换装计划是从1997年11月起进行,打算至1999年底全部换装完毕)。为什么陆军会打算用一种卡宾枪来取代标准的突击步枪呢?陆军的解释是M4A1比M16A2轻,而且足以有效对付200米射程内的目标;有另一种解释是当&陆地勇士&系统装备部队时,M4A1能够减轻系统总重量。但其实还有另一个传言,说陆军内部有一些高级将领仍然对FNMI在1988年凭价格优势击败柯尔特获得M16A2的供应合同而耿耿于怀,因为FNMI是外国背景公司。假如陆军决定采用一种不同型号的步枪,这样就有理由不继续履行与FNMI的采购合同了。
  对于M4A1的采购引发了许多争议,而且当柯尔特获得陆军的生产合同后,FNMI随即提出他们也能为陆军生产M4A1.陆军拒绝了这个提议,于是FNMI向美国联邦法院提出诉讼,指美国政府指定唯一的承包商是不公平的。联邦法院在柯尔特的运动下驳回了FNMI的申诉,解释说M4系列的技术是柯尔特专有的,而且按照柯尔特与陆军在1997年12月达成的协议,军方在2011年前都不得向其他生产商授予M4系列的生产权或转让工艺文件。
  陆军采购M4A1的高峰是在2000年前后,在2001年美国陆军最终决定让常规部队装备RAS护木的M16A4,似乎是对那个传言的佐证,陆军仍然是从柯尔特采购M16A4.
  由于较短的枪管导致初速较低和膛口噪声较大,护木也比长步枪更容易发热,因此海军陆战队是在采用M4A1还是要保留M16A2的问题上反复争论,最终在2002年9月宣布将用带RAS护木的M16A4代替M16A2,但却是由FN生产的。在阿富汗战场上许多徒步战斗的步兵抱怨M4A1存在射程不足的缺点,促进了海军陆战队的这一项决定,然而在2003年入侵伊拉克的城市战斗中,那些仍在使用M16A2的机械化步兵却认为他们更需要像M4这样短小精悍的轻武器,这是因为城市中的战斗距离比阿富汗山区要近得多,而且即使在城郊作战,这些机械化部队成员都没必要用手中的轻武器去对付300米外的目标,而那些抱怨M4A1射程不够的部队多数是缺乏重武器支援的轻步兵。
  虽然M4系列的有效射程没有长枪管的M16系列远,但是许多军事分析家认为步兵轻武器大多数情况下不需要射击300米目标,只要在150m内有效就足够了。M4系列由于紧凑的外形和强大火力(仅限可全自动的M4A1)适合CQB而受到反恐部队和特种部队的喜爱,这些优点也适用于城市战斗,因此在常规部队的步兵班中,以M16A4为主再搭配少量M4A1成为流行的模式,而在特种部队和空降部队等快速反应部队中,M4A1则是主战武器,美国特种作战司令部(USSOCOM)把M4A1采用为制式步枪。
  在近几年,柯尔特又生产了加厚护木内枪管部分的M4A1或改装套件,在枪管整体加厚后虽然会略为增加重量,但全自动射击时更耐热也更准确。这些采用重型枪管的武器还配有一个重量稍大并被称为H2的新缓冲器。标准的H缓冲器里面有一块钨和两块钢组成的滑动配重,而新的H2缓冲器改为两块钨和一块钢。目前这些武器被称为柯尔特921HB型(重枪管),但军队采用的HB改进型并没有重新命名,所以政府型M4A1是包括了921和921HB.
  除了在美军装备外,M4系列也出口到其他国家,而柯尔特也向执法机构提供RO777、779、977和979这4种型号的M4/M4A1.
①步枪:步枪是实力非常综合。要说步枪那么毋庸置疑,最厉害的当属AK与M4系列。AK系列中,黄金AK本人认为是最好的,当然,AK-S和AK-A也都不错,擅长对枪的就用S,近距离刀站的就用A。M4,M4是CF中枪数最多的系列,黄金M4、水晶M4和M4-S,是M4系列中的佼佼者,黄金的威力大,水晶的弹道准,S的切枪、换弹速度快,这些都是他们的优势。还有擅长远距离对...&
①步枪:步枪是实力非常综合。要说步枪那么毋庸置疑,最厉害的当属AK与M4系列。AK系列中,黄金AK本人认为是最好的,当然,AK-S和AK-A也都不错,擅长对枪的就用S,近距离刀站的就用A。M4,M4是CF中枪数最多的系列,黄金M4、水晶M4和M4-S,是M4系列中的佼佼者,黄金的威力大,水晶的弹道准,S的切枪、换弹速度快,这些都是他们的优势。还有擅长远距离对枪的可以用M4-C,总之因人而定。当然其他的步枪也有很多很厉害的,比如SCAR系列、AN94、95、XM8、AUG等,就不一一多说了&&②狙:狙的威力是所有枪系中最大的,同时它也会有巨大的后坐力和重量,当然精准度也是最高的。威力最大的当然就是大家俗称的&大炮&了(听这个名字就知道了),大炮威力很大,穿两个箱子打人仍能一枪毙命,同时他切枪的速度也是非常慢的,而且重量也是最重的,不过貌似它的瞄准镜精度也加深了。再说狙中较为综合的&&花狙,花狙加宽了瞄准镜,而且比普狙更稳了,被机枪打到不易晃动,而且移动起来也比大炮快得多,子弹也多了,手感蛮好的。狙中还有连狙,有一定的射速,威力相对减小,也较轻,练狙中的枪也就不多说了。狙击当然也是看个人感觉的,不光是数据就能比较。③手枪:我想手枪就不必多说了,大家也都知道的,沙鹰吗!沙鹰也是出了很多款,加快切枪速度的,带微瞄的,水晶、黄金、白银、青铜等。但手枪大多是用来配合狙用的,所以最重要的还是切枪速度和子弹数,沙鹰-A就是切枪和换子弹速度加快的,而黄金沙鹰的子弹数又是最多的,除非是专打个人竞技手枪战的,沙鹰-S带微瞄,弥补了手枪远距离战的不足。当然两款双枪也不错,就是感觉子弹少了点。再怎么说手枪也是副武器,都是配合主武器来用的,买个差不多的就行了。④冲锋枪:冲锋枪的特点就是威力小、重量轻、射速快、子弹多、后座小。我自己一直比较喜欢的就是雷蛇和双USI(乌兹),汤姆逊和P90也不是错的。我看冲锋枪看的是子弹和射速,威力都是次要的,毕竟冲锋枪,顾名思义是要冲起来的,它的重量很轻,自然跑的就快,冲到敌人老家的时候敌人大部队几乎还没散开,以一敌众没有很多的子弹怎么支持的住,还有足够快的射速可以弥补它威力的不足,用你的速度搞定对手。当然这只是我的个人想法,其他比较综合的冲锋枪比如MP5等也是比较厉害的。⑤散弹枪:散弹枪近距离威力很大,远距离就吃瘪了,射速也较慢。CF点买的散弹枪一共就两把。亡命之徒和XM1014-A(我一直以为温彻斯特是散弹枪结果不知道为什么把他归到步枪里了)。前者属于那种点一下鼠标设一下的那种,后者是可以一直按着左键连发的。两者实力各有千秋,相差不多,只是XM1014-A的子弹多些而已。⑥机关枪:子弹多、威力较大、重量重、后座打。自从出了生化之后机枪也出了很多。M60-A、加特林、RPK、M249都是进入百发子弹俱乐部的机枪成员。M60-A和加特林都是150发子弹的,其他两把都是100子弹。加特林超重而且开枪前还得转两圈,所以只适宜打生化了。而其他的三把枪都是超猛的,打其他模式也没关系。用他们打团队根本不用担心子弹的问题。当然在我很卡的时候,就常常用M60,打完以后的战绩也是很不错了。枪械说的也差不多了,在比赛中更多的不是靠你的枪跟别人比有多好,而是靠你过硬的技术,试想一把好枪被一个菜鸟用着,难道不是很浪费吗?

我要回帖

更多关于 精英团队名字 的文章

 

随机推荐