??xml version="1.0" encoding="utf-8" standalone="yes"?>国产乱码精品一区二区三区四区 ,成人爽a毛片一区二区免费 ,成人国产精品免费视频http://www.aygfsteel.com/buaacaptain/category/11629.html只有偏执狂才能生?/description>zh-cnFri, 02 Mar 2007 03:33:38 GMTFri, 02 Mar 2007 03:33:38 GMT60议HashMaphttp://www.aygfsteel.com/buaacaptain/archive/2006/07/20/59178.html舚w舚wThu, 20 Jul 2006 06:14:00 GMThttp://www.aygfsteel.com/buaacaptain/archive/2006/07/20/59178.htmlhttp://www.aygfsteel.com/buaacaptain/comments/59178.htmlhttp://www.aygfsteel.com/buaacaptain/archive/2006/07/20/59178.html#Feedback0http://www.aygfsteel.com/buaacaptain/comments/commentRss/59178.htmlhttp://www.aygfsteel.com/buaacaptain/services/trackbacks/59178.html大家都知道,在Java里对对象的操作是Z引用的。而当我们需要对一l对象操作的时候,需要有接收q一l引用的容器。^时我们最常用的就是数l。在Java里可以定义一个对象数l来完成许多操作。可是,数组长度是固定的Q如果我们需要更加灵zȝ解决Ҏ该怎么办呢Q?/p>

Java提供了container classes来解册一问题。container classes包括两个部分QCollection和Map。它们的l构是这LQ?/p>

本文重点介绍HashMap。首先介l一下什么是Map。在数组中我们是通过数组下标来对其内容烦引的Q而在Map中我们通过对象来对对象q行索引Q用来烦引的对象叫做keyQ其对应的对象叫做value。在下文中会有例子具体说明?/p>

再来看看HashMap和TreeMap有什么区别。HashMap通过hashcode对其内容q行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得C个有序的l果你就应该使用TreeMapQHashMap中元素的排列序是不固定的)?/p>

下面pq入本文的主题了。先举个例子说明一下怎样使用HashMap:

import java.util.*;

public class Exp1 {
     public static void main(String[] args){
          HashMap h1=new HashMap();
          Random r1=new Random();    
          for(int i=0;i<1000;i++){
               Integer t=new Integer(r1.nextInt(20));
               if(h1.containsKey(t))
                    ((Ctime)h1.get(t)).count++;
               else
                    h1.put(t, new Ctime());
          }
          System.out.println(h1);
     }
}

class Ctime{
     int count=1;
     public String toString(){
          return Integer.toString(count);
     }
}

在HashMap中通过get()来获取valueQ通过put()来插入valueQContainsKey()则用来检验对象是否已l存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的斚w差异q不大?/p>

前面介绍了,HashMap是基于HashCode的,在所有对象的类Object中有一个HashCode()ҎQ但是它和equalsҎ一Pq不能适用于所有的情况Q这h们就需要重写自qHashCode()Ҏ。下面就举这样一个例子:

import java.util.*;

public class Exp2 {
     public static void main(String[] args){
          HashMap h2=new HashMap();
          for(int i=0;i<10;i++)
               h2.put(new Element(i), new Figureout());
          System.out.println("h2:");
          System.out.println("Get the result for Element:");
          Element test=new Element(5);
          if(h2.containsKey(test))
               System.out.println((Figureout)h2.get(test));
          else
               System.out.println("Not found");
     }
}

class Element{
     int number;
     public Element(int n){
          number=n;
     }
}

class Figureout{
     Random r=new Random();
     boolean possible=r.nextDouble()>0.5;
     public String toString(){
          if(possible)
               return "OK!";
          else
               return "Impossible!";
     }
}

在这个例子中QElement用来索引对象Figureout,也即Element为keyQFigureout为value。在Figureout中随机生成一个QҎQ如果它?.5大,打印“OK!”,否则打印“Impossible!”。之后查看Element(3)对应的Figureoutl果如何?/p>

l果却发玎ͼ无论你运行多次Q得到的l果都是“Not found”。也是说烦引Element(3)q不在HashMap中。这怎么可能呢?

原因得慢慢来_Element的HashCodeҎl承自ObjectQ而Object中的HashCodeҎq回的HashCode对应于当前的地址Q也是说对于不同的对象Q即使它们的内容完全相同Q用HashCodeQ)q回的g会不同。这样实际上q背了我们的意图。因为我们在使用HashMapӞ希望利用相同内容的对象烦引得到相同的目标对象Q这需要HashCode()在此时能够返回相同的倹{在上面的例子中Q我们期望new Element(i) (i=5)与 Element test=new Element(5)是相同的Q而实际上q是两个不同的对象,管它们的内容相同,但它们在内存中的地址不同。因此很自然的,上面的程序得不到我们设想的结果。下面对ElementcL改如下:

class Element{
     int number;
     public Element(int n){
          number=n;
     }
     public int hashCode(){
          return number;
     }
     public boolean equals(Object o){
          return (o instanceof Element) && (number==((Element)o).number);
     }
}

在这里Element覆盖了Object中的hashCode()和equals()Ҏ。覆盖hashCode()使其以number的g为hashcodeq回Q这样对于相同内容的对象来说它们的hashcode也就相同了。而覆盖equals()是ؓ了在HashMap判断两个key是否相等时ɾl果有意义(有关重写equals()的内容可以参考我的另一文章《重新编写ObjectcM的方?》)。修改后的程序运行结果如下:

h2:
Get the result for Element:
Impossible!

误住:如果你想有效的用HashMapQ你必重写在其的HashCode()?/p>

q有两条重写HashCode()的原则:

  1. 不必Ҏ个不同的对象都生一个唯一的hashcodeQ只要你的HashCodeҎ使get()能够得到put()放进ȝ内容可以了。即“不Z原则”?
  2. 生成hashcode的算法尽量hashcode的值分散一些,不要很多hashcode都集中在一个范围内Q这h利于提高HashMap的性能。即“分散原则”?

至于W二条原则的具体原因Q有兴趣者可以参考Bruce Eckel的《Thinking in Java》,在那里有对HashMap内部实现原理的介l,q里׃赘述了?/p>

掌握了这两条原则Q你p够用好HashMap~写自己的程序了。不知道大家注意没有Qjava.lang.Object中提供的三个ҎQclone()Qequals()和hashCode()虽然很典型,但在很多情况下都不能够适用Q它们只是简单的由对象的地址得出l果。这需要我们在自己的程序中重写它们Q其实javacd中也重写了千千万万个q样的方法。利用面向对象的多态性——覆盖,Java的设计者很优雅的构ZJava的结构,也更加体CJava是一门纯OOP语言的特性?/p>

Java提供的Collection和Map的功能是十分强大的,它们能够使你的程序实现方式更为灵z,执行效率更高。希望本文能够对大家更好的用HashMap有所帮助?



舚w 2006-07-20 14:14 发表评论
]]>
有关servlet的生命周期问?/title><link>http://www.aygfsteel.com/buaacaptain/archive/2006/06/05/50522.html</link><dc:creator>舚w</dc:creator><author>舚w</author><pubDate>Mon, 05 Jun 2006 08:24:00 GMT</pubDate><guid>http://www.aygfsteel.com/buaacaptain/archive/2006/06/05/50522.html</guid><wfw:comment>http://www.aygfsteel.com/buaacaptain/comments/50522.html</wfw:comment><comments>http://www.aygfsteel.com/buaacaptain/archive/2006/06/05/50522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/buaacaptain/comments/commentRss/50522.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/buaacaptain/services/trackbacks/50522.html</trackback:ping><description><![CDATA[ <span id="LblContent">servlet有良好的生存期的定义Q包括如何加载、实例化、初始化、处理客Lh以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroyҎ表达?br />1、加载和实例?br />容器负责加蝲和实例化一个servlet。实例化和加载可以发生在引擎启动的时候,也可以推q到容器需要该servlet为客戯求服务的时候?br />首先容器必须先定位servletc,在必要的情况下,容器使用通常的Javacd载工具加载该servletQ可能是从本机文件系l,也可以是从远E文件系l甚臛_它的|络服务。容器加载servletcM后,它会实例化该cȝ一个实例。需要注意的是可能会实例化多个实例,例如一个servletcd为有不同的初始参数而有多个定义Q或者servlet实现SingleThreadModel而导致容器ؓ之生成一个实例池?br /><br />2、初始化<br />servlet加蝲q实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过E主要是d怹的配|信息,昂贵资源Q例如JDBCq接Q以及其它仅仅需要执行一ơ的d。通过调用它的initҎq给它传递唯一的一个(每个servlet定义一个)ServletConfig对象完成q个q程。给它传递的q个配置对象允许servlet讉K容器的配|信息中的名Uͼ值对Qname-valueQ初始化参数。这个配|对象同时给servlet提供了访问实CServletContext接口的具体对象的ҎQ该对象描述了servlet的运行环境?br />    2.1初始化的错误处理<br />    在初始化期间Qservlet实例可能通过抛出UnavailableException 或者 ServletException异常表明它不能进行有效服务。如果一个servlet抛出一个这L异常Q它不会被|入有效服务q且应该被容器立即释放。在此情况下destroyҎ不会被调用因为初始化没有成功完成。在p|的实例被释放后,容器可能在Q何时候实例化一个新的实例,对这个规则的唯一例外是如果失败的servlet抛出的异常是UnavailableExceptionq且该异常指Z最的无效旉Q那么容器就会至等待该旉指明的时限才会重新试囑ֈZ个新的实例?br />    2.2、工具因?br />    当工P注:ҎW者的理解Q这个工具可能是应用服务器的某些查工P通常是验证应用的合法性和完整性)加蝲和内省(introspectQ一个web应用Ӟ它可能加载和内省该应用中的类Q这个行为将触发那些cȝ静态初始方法被执行Q因此,开发者不能假定只要当servlet的initҎ被调用后它才处于zd容器q行状态(active container runtimeQ。作Z个例子,q意味着servlet不能在它的静态(c)初始化方法被调用时试囑־立数据库q接或者连接EJB容器?br /><br />3、处理请?br />在servlet被适当地初始化后,容器可以用它d理请求了。每一个请求由ServletRequestcd的对象代表,而servlet使用ServletResponse回应该请求。这些对象被作ؓserviceҎ的参C递给servlet。在HTTPh的情况下Q容器必L供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创徏一个servlet实例q将之放入等待服务的状态,但是q个实例在它的生存期中可能根本没有处理过Mh?br />    3.1、多U程问题<br />    容器可能同时多个客L的请求发送给一个实例的serviceҎQ这也就意味着开发者必ȝ保编写的servlet可以处理q发问题。如果开发者想防止q种~省的行为,那么他可以让他编写的servlet实现SingleThreadModel。实现这个类可以保证一ơ只会有一个线E在执行serviceҎq且一ơ性执行完。容器可以通过请求排队或者维护一个servlet实例池满一炏V如果servlet是分布式应用的一部分Q那么,那么容器可能在该应用分布的每个JVM中都l护一个实例池。如果开发者用synchronized关键字定义serviceҎ(或者是doGet和doPost)Q容器将排队处理hQ这是由底层的javaq行时系l要求的。我们强烈推荐开发者不要同步serviceҎ或者HTTPServlet的诸如doGet和doPostq样的服务方法?br />    3.2、处理请求中的异?br />    servlet在对hq行服务的时候有可能抛出ServletException或者UnavailableException异常。ServletException表明在处理请求的q程中发生了错误容器应该使用合适的Ҏ清除该请求。UnavailableException表明servlet不能对请求进行处理,可能是暂时的Q也可能是永久的。如果UnavailableException指明是永久性的Q那么容器必dservlet从服务中U除Q调用它的destroyҎq攑֮的实例。如果指明是暂时的,那么容器可以选择在异怿息里面指明的q个暂时无法服务的时间段里面不向它发送Q何请求。在q个旉D里面被被拒l的h必须使用SERVICE_UNAVAILABLE (503)q回状态进行响应ƈ且应该携带稍后重试(Retry-AfterQ的响应头表明不能服务只是暂时的。容器也可以选择不对暂时性和怹性的不可用进行区分而全部当作永久性的q移除抛出异常的servlet?br />    3.3U程安全<br />    开发者应该注意容器实现的h和响应对象(注:卛_器实现的HttpServletRequest和HttpServletResponeseQ没有被保证是线E安全的Q这意味着他们只能在请求处理线E的范围内被使用Q这些对象不能被其它执行U程所引用Q因为引用的行ؓ是不定的?br /><br />4、服务结?br />容器没有被要求将一个加载的servlet保存多长旉Q因此一个servlet实例可能只在容器中存zM几毫U,当然也可能是其它更长的Q意时_但是肯定会短于容器的生存期)<br />当容器决定将之移除时Q原因可能是保存内存资源或者自p关闭Q,那么它必d许servlet释放它正在用的M资源q保存Q何永久状态(q个q程通过调用destroyҎ辑ֈQ。容器在能够调用destroyҎ前,它必d讔R些正在serviceҎ中执行的U程执行完或者在服务器定义的一D|间内执行Q这个时间段在容器调用destroy之前Q。一旦destroyҎ被调用,容器׃会再向该实例发送Q何请求。如果容器需要再使用该servletQ它必须创徏新的实例。destroyҎ完成后,容器必须释放servlet实例以便它能够被垃圾回收?br /><br />另参?a >http://tech.ccidnet.com/art/1077/20041123/180515_1.html</a><br /><a >http://dev2dev.bea.com.cn/techdoc/20051024674.html</a></span> <img src ="http://www.aygfsteel.com/buaacaptain/aggbug/50522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/buaacaptain/" target="_blank">舚w</a> 2006-06-05 16:24 <a href="http://www.aygfsteel.com/buaacaptain/archive/2006/06/05/50522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>?什么是jvmQ你很清楚地了解它吗Q?/title><link>http://www.aygfsteel.com/buaacaptain/archive/2006/05/30/48860.html</link><dc:creator>舚w</dc:creator><author>舚w</author><pubDate>Mon, 29 May 2006 16:51:00 GMT</pubDate><guid>http://www.aygfsteel.com/buaacaptain/archive/2006/05/30/48860.html</guid><wfw:comment>http://www.aygfsteel.com/buaacaptain/comments/48860.html</wfw:comment><comments>http://www.aygfsteel.com/buaacaptain/archive/2006/05/30/48860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/buaacaptain/comments/commentRss/48860.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/buaacaptain/services/trackbacks/48860.html</trackback:ping><description><![CDATA[ <br />     转自matrix:http://www.matrix.org.cn/resource/article/0/20.html<br />      在Java中引入了虚拟机的概念Q即在机器和~译E序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在Q何^C都提供给~译E序一个的共同的接口。编译程序只需要面向虚拟机Q生成虚拟机能够理解的代码,然后p释器来将虚拟Z码{换ؓ特定pȝ的机器码执行。在Java中,q种供虚拟机理解的代码叫做字节码QByteCodeQ,它不面向M特定的处理器Q只面向虚拟机。每一U^台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经q编译器~译后变成字节码Q字节码p拟机解释执行Q虚拟机每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行?br />    可以_Java虚拟机是Java语言的基。它是Java技术的重要l成部分。Java虚拟机是一个抽象的计算机,和实际的计算ZP它具有一个指令集q用不同的存储区域。它负责执行指oQ还要管理数据、内存和寄存器。Java解释器负责将字节代码译成特定机器的机器代码。Java是一U简单的语言。它用到的概念不多,而且多ؓE序员所熟悉。如果你是一名程序员Q掌握Java对你来说是易如反掌的事。即使你没有学过M~程语言Q学习Java也要比学习C++要容易的多?<br />    ׃Java最初是为控制电子品设计的Q因此它必须单明了。ؓ了保证这U简单性,JavaL了C++中许多复杂的、冗余的、有二义性的概念Q例如操作符重蝲、多l承、数据类型自动{换等。ؓ了将E序员从复杂的内存管理的负担中解脱出来,同时也是Z减少错误QJava使用了自动内存垃圾收集机ӞE序员只要在需要的时候申请即可,不需要释?而由Java自己来收集、释攑ֆ存中的无用的块?br />    与C++相比QJava有着更强的面向对象特性,是一U比较纯_的面向对象语言。一般我们用的一些所谓的面向对象的编E语aQ如C++QObject Pascal{,实际上都是一U؜合型的语aQ即在过E式的语a中加上面向对象的扩展。在Java中,几乎万物皆对象,p一些基本数据类型,如整型、字W型、Q点型{,在Java中都可以作ؓ对象处理。Java的面向对象特性几乎可以与Smalltalk媲美Q但是其适用于分布式计算环境的特性却q远过了Smalltalk?br />   Java是一U支持分布式操作的程序设计语a。用Java提供的URLc,用户可以象访问本地文件一栯问网l上的对象,使用非常方便。在客户?服务器的模式下,Javaq可以将q算从服务器端分散到客户端,提高pȝ的效率,避免了服务器的瓶颈制U。Java的网l类库支持分布式的编E。SocketcL供可靠的式|络的连接,支持TCP/IP协议。通过~写协议句柄Q程序员q可以扩充Java支持的协议集合?br /><br />Java提供非常有效的安全控制。由于Java应用于网l程序的开发,因而安全性变的至关重要。因为Java程序需要下载到客户端解释执行,所以,如果没有安全控制Q就会给一些网l黑客以可乘之机Q这对用h说是非常危险的。所q的是,Java的安全机制可以有效的防止病毒E序的生、下载程序对本地文gpȝ的破坏,以及|络黑客H取密码和入c?br /><br />Java是一U非常健壮的语言。因为在Java中用了以下手段Q?br /><br />不支持指针。在C++E序中,指针的错误用通常的程序中BUG的元凶。在Java中彻底去掉了指针Q杜l了内存的非法访问,从而保证了E序的可靠性?br />强类型语a?br /><br />自动内存垃圾攉机制。Java自动攉无用的内存单元,q而防止了׃内存泄漏D的动态内存分配问题?br /><br />完善的异常处理机Ӟ既简化了错误处理d和恢复,也增加了E序的可L?br /><br />Javah非常好的q_无关性和可移植性。因为Java最初是为对电子产品~程而设计的Q所以它h完美的^台无x。它使用一U与q_无关的代码──字节码,而不是通常的特定机器上的机器码Q由q_上的Java虚拟Z的Java解释器解释执行。Java虚拟机是免费的,在许多^C都有?br /><br />Java提供了良好的可移植性。用Java作ؓ~程语言Q只要进行一ơ程序开发工作,所开发的E序不需要经qQ何改动,便能在各U^Cq行。Java使用两种Ҏ使Java的应用程序不依赖与具体的pȝQ?br /><br />采用Z国际标准的数据类型。Java的原始数据类型在M机器上都是一LQ例如整型L32位,长整型L64位等?br /><br />提供了一个用于访问底层操作系l功能的可扩展类库?br /><br />Java是一U高性能的语a。“鱼与熊掌不可兼得”,通常Q健壮性、安全性、^台无x、可UL性等斚w的提高L要以牺牲性能ZL。Java也不例外QJava的内存管理增加了q行时系l的复杂性,因ؓJavaq行时系l必d嵌一个内存管理模块;同样QJavaE序的解释执行的效率也要低于直接执行~译后的源码的效率。但是Java采用了一些很好的措施来I补这些性能上的差距Q?br /><br />生成高效的字节码。Java字节码的设计充分考虑了性能的因素,字节码的格式单,解释器可以生成高效的机器码?br /><br />提供了即时编译和嵌入C代码的可选措施。即时编译是指在q行时把字节码编译成机器码。支持多U程。Java提供了对多线E的语言U的接口Q而且Java环境本n是多线E的?br /><br /><br />Java对多U程有良好的支持。多U程技术可以提高程序执行的q发度,提高囑Ş用户界面的交互性能。Java提供了语a内置的多U程控制Q简化了多线E应用程序的开发,q支持线E的同步控制?br /><br />Java是一U动态的语言。动态特性是面向对象Ҏ的一个g伸,它得程序能够适应不断变化的执行环境。Java的动态性主要表现在以下几个斚wQ?br /><br />Java的类有运行时的表C,q样Q即使在q行时刻Q程序也能L别类之间的关pdcd信息Q可以动态的从本地或|上把一个类链接到运行系l中厅R?br /><br />后期联编。Java的类在运行过E中动态的装蝲Q因此,Java可以在分布式的环境中动态的l护应用E序和Javacd之间的一致性。当cd升后,应用E序无需重新~译Q也一样可以利用新cd中新增的功能?br /><br />支持动态数据类型和动态协议。通过~写协议句柄QJava可以支持新的、自定义的传输协议,~写内容句柄Q可以支持新的数据类型?br /><br />至于应用Q就不必说了Q?br /><img src ="http://www.aygfsteel.com/buaacaptain/aggbug/48860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/buaacaptain/" target="_blank">舚w</a> 2006-05-30 00:51 <a href="http://www.aygfsteel.com/buaacaptain/archive/2006/05/30/48860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ʯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank">˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˹</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͩ</a>| <a href="http://" target="_blank">Ҵ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳƺ</a>| <a href="http://" target="_blank">Ǩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">ӡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӱʡ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ڽ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>