随后笔记3

17. WeakReference 弱引用对象,它们并不禁止其指示对象变得可终结,并被终结,然后被回收。弱引用最常用于实现规范化的映射。 假定垃圾回收器确定在某一时间点上某个对象是弱可到达对象。这时,它将自动清除针对此对象的所有弱引用,以及通过强引用链和软引用,可以从其到达该对象的针对任何其他弱可到达对象的所有弱引用。同时它将声明所有以前的弱可到达对象为可终结的。在同一时间或晚些时候,它将那些已经向引用队列注册的新清除的弱引用加入队列。 /// SoftReference: 软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。 假定垃圾回收器确定在某一时间点某个对象是软可到达对象。这时,它可以选择自动清除针对该对象的所有软引用,以及通过强引用链,从其可以到达该对象的针对任何其他软可到达对象的所有软引用。在同一时间或晚些时候,它会将那些已经向引用队列注册的新清除的软引用加入队列。 软可到达对象的所有软引用都要保证在虚拟机抛出 OutOfMemoryError 之前已经被清除。否则,清除软引用的时间或者清除不同对象的一组此类引用的顺序将不受任何约束。然而,虚拟机实现不鼓励清除最近访问或使用过的软引用。 此类的直接实例可用于实现简单缓存;该类或其派生的子类还可用于更大型的数据结构,以实现更复杂的缓存。只要软引用的指示对象是强可到达对象,即正在实际使用的对象,就不会清除软引用。例如,通过保持最近使用的项的强指示对象,并由垃圾回收器决定是否放弃剩余的项,复杂的缓存可以防止放弃最近使用的项 java.lang.ref.WeakReference    不过,现在有了 Weak Reference 之后,这就可以迎刃而解了。如果你希望能随时取得某对象的信息,但又不想影响此 对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象,而不是用一般的 reference。请看下面的例子:    ...    WeakReference wr = new WeakReference(obj);    ...    if (wr.get()==null) {    System.out.println("obj 已经被清除了 ");    } else {    System.out.println("obj    尚未被清除,其信息是 "+obj.toString());    }    ...    在此例中,透过 get() 可以取得此 Reference 的所指到的对象,如果传出值为 null 的话,代表此对象已经被清除。    这类的技巧,在设计 Optimizer 或 Debugger 这类的程序时常会用到,因为这类程序需要取得某对象的信息,但是不可以 影响此对象的垃圾收集。    java.lang.ref.SoftReference    Soft Reference 虽然和 Weak Reference 很类似,但是用途却不同。SoftReference 是用来设计 object-cache 之用的。 被 Soft Reference 指到的对象,即使没有任何 Direct Reference,也不会被清除。一直要到 JVM 内存不足时且 没有 Direct Reference 时才会清除,如此一来 SoftReference 不但可以把对象 cache 起来,也不会造成内存不足的错误 (OutOfMemoryError)。我觉得 Soft Reference 也适合拿来实作 pooling 的技巧。    java.lang.ref.PhantomReference    Phantom Reference 主要是用来取代对象的 finalize()。程序员利用 finalize() 来进行释放资源的同时,有可能不小心 让此对象再度拥有 Direct Reference。但是使用 Phantom Reference 则不会有此情形发生。和 Weak Reference 以 及 SoftReference 最大的不同是:Phantom Reference 一订要搭配着 ReferenceQueue 使用,因为 Phantom Reference 的 get() 传 出值一定是 null(以避免此对象不小心再度拥有 Direct Reference)。通常我们会设计一个 class 继承 PhantomReference,然 后 override 其 clear() 来定义释放资源等收尾的动作。当然,我宁可小心一点地使用 finalize(),也不愿意自找麻烦地使用 Phantom Reference。 18. I/O 數據流 DataInput ,DataOutput ,RandomAccessFile(可讀寫) 文本流 InputStreamReader in = new InputStreamReader(new FileInputStream(“test.txt”),”ISO8559_1”); InputSteamReader in =new InputStreamReader(System.in); 文本輸出 Printwriter out = new PrintWriter(new FileWriter(“test.txt”)); 文本輸入 BufferReader in = new BufferReaderk(new FileReader(“test.txt”)); Zip文件流 ZipInputSteam in = ZipInputStream(new FileInputSteam(“test.rar”)); 19.對于類的加載,首先要執行基類的構造,在執行本身的構造. 20.Hibernate主鍵生成策略: Assigned: 主鍵由外部程式負責生成,在save()之前指定一個. Hilo :通過hilo算法實現主鍵生成機制,需要額外的數據表或字段提供高位置來源. Seqhilo: 與hilo類似,通過hilo算法實現主鍵生成機制,需要數據庫中的sequence,運用于支持sequence的DB。 Increment : 主鍵按數值順序遞增,此方式的實現機制為在當前應用實例中維持一個變量,以保持當前最大值之后每次要生成主鍵的時候將此值加1作為主鍵,這種方式可能產生問題,不能在集群下使用. Identity: 采用數據庫提供的主鍵生成機制. Sequency: 采用數據庫提供的sequence機制生成主鍵 Native :由hibernate根據使用的數據庫自行判斷采用identity,hilo,sequence其中一種作為主鍵生成方式. Uuid.hex: 由hibernate基于128位的UUID算法,生成16進制數值(編碼后以長度32的字符串表示)作為主鍵. Uuid.string: 與uuid.hex類似,只是生成主鍵未進行編碼. Foreign: 使用另外一個相關聯的對象的標識符作為主鍵 20.對象在Hibernate中有三種狀態,Transient(瞬時) Persistent(持久).Detached(托管) 21.Hibernate中對象關聯關系. 一對一 一對多 多對一 一對一有嚴格的從屬關系 一對多關聯是從屬關系 多對一不是從屬關系,而是引用關系 22,Hibernate 數據檢索策略 1. 立即檢索 2. 延遲檢索 3. 預先檢索 4. 批量檢索 23.CMM是能力成熟度模型縮寫,是一種用于評價軟件承包能力并幫助其改善軟件質量的方法,也是評估軟件是否成熟的一套標準. CMM共分為五個等級: 初始級 可重復級 定義級 管理級 優先級 24.同步和異步有何區別?什么情況下分別使用. 如果數據將在線程間共享變量,例如 正在寫的數據以后可能被另一個線程讀到或者正在讀的數據可能已經被另一個線程寫過了,這些數據就是共享數據. 當應用程序在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程序等待方法,就應該異步編程,采用異步更有效率. 25.DML: 數據操縱語言 :insert ,update , delete 數據定義語言 : alert create drop truncate grant revoke 26.UML組成: 事物 關系 圖 事物 :結構事物 動作事物 分組事物 注釋事物 關系 : 依賴 dependencies 關聯 association 一般化 generalization 實現 realization 27.Linux內核版本一般由3個數字組成,形式為 X,Y,Z X表示主版本號,Y表示次版本號,如為偶數,代表這個內核為正式版本,如為奇數,代表內核為測試版本,Z表示修改號. /bin : 常用的系統命令執行文件 /dev: 與硬件設備驅動程序有關的特殊文件 /etc : 系統配置文件 /mnt: 安裝臨時文件 /sbin: 系統自檢和系統恢復所用的程序文件 /boot: 系統引導的內核,相關工具 /root: 超級用戶 /home: 普通用戶 /usr: 含有被共享的命令和系統管理數據庫 28.Java類加載器 Java類加載器在裝載類的時候是按需裝載的,只有當一個類使用new關鍵字來實例化一個類時,類加載器才會加載這個類并初始化 隱式加載: 使用new關鍵字讓類加載器按需載入所需的類 顯示加載: a.由java.lang.class 的forName()方法加載 b.由java.lang.classLoader.loadClass()方法加載. 類加載器的層次: 29.StringBuilder 無線成安全 StringBuffer 線程安全 30.軟件設計原則 目標: 可擴展性 靈活性 可插入性 I. 開-閉原則(OCP) :一個軟件實體應當對擴展開放,對修改關閉. 用面向對象的語言來講,不允許更改的是抽象層,而允許擴展的是實現層,抽象化才是關鍵,對可變性的封裝原則. II. 里氏代換原則 : 任何基類可以出現的地方子類一定可以出現.里氏代換原則是對開閉原則的補充,實現開閉原則的關鍵是抽象化,而基類與子類的繼承關系就是抽象化的具體實現,所以里氏代換原則是對實現抽象化的具體步驟的規范. III. 依賴倒轉原則: 依賴于抽象,不要依賴于實現. IV. 合成/聚合原則:要盡量使用合成/聚合,而不是繼承關系達到復用的目的. V. 迪米特法則: 一個軟件實體應當與盡可能少的其他實體發生相互作用. VI. 接口隔離原則:應當為客戶端提供可能小的單獨接口,而不要提供大的總的接口. 31.java 中JDBC獲得連接 Class.forName(oracle.jdbc.driver.OracleDriver); Connection conn = DriverManager.getConnection(url,user,userid); 32. java調用存儲過程 A.無返回值 CallableStatement pro = conn.prepareCall(“call my_fun(?)”); Pro.setLong(1,1); Pro.execute(); B.一個返回值 CREATE OR REPLACE PROCEDURE TESTP(PARA1 IN VARCHAR(2),PARA2 OUT VARCHAR(2)) BEGIN; SELECT INTO PARA2 FROM TESTP WHERE I_ID=PARA1; END TESTP; CallableStatement pro = conn.prepareCall(“call TESTP(?,?)”); Pro.setString(1,”100”); Pro.registerOutParameter(2,Type.VARCHAR); Pro.execute(); String test = pro.getString(2); C,返回列表 建立游標: CREATE OR REPLACE PACKAGE TPACKAGE AS TYPE T_CURSOR IS REF CURSOR; EDN PTACKAGE; 創建存儲過程: CREATE OR REPLACE PROCEDURE TETP(PARA1 OUT TPACKAGE.T_CURSOR ) BEGIN; OPEN CURSOR FOR SELECT * FROM TEST; END PETP; 調用: Pro = conn.prepareCall(“call TETP(?)”; Pro.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); Pro.execute(); Rs = (ResultSet) pro.getObject(); 33.Hibernate實體對象生命周期中的3中狀態: 1.Transient(自由狀態) 實體對象在內存中自由存在,與數據庫中的記錄無關. 2.Persistent(持久狀態) 實體對象處于Hibernate框架所管理狀態,這種狀態下,實體對象的引入被納入Hibernate實體容器中加以管理. 3.Detached(游離狀態) 處于persistent狀態的對象,其對應的Session實例發生關閉之后,那么此對象就處于Detached狀態.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值