[java]杂记4

来源:互联网 发布:中国js 12.7mm狙击步枪 编辑:程序博客网 时间:2024/06/05 03:35

1.使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止

2.ResultSet结果集读取数据的方法主要是getXXX() ,他的参数可以使整型表示第几列(是从1开始的),还可以是列名。

3.
启动一个线程的方法是 start()
结束线程用的是interrupt()方法,而stop()是强制结束线程,并不推荐使用,同时stop()方法已被弃用
daemon线程是守护线程,当主线程结束时,守护线程会自动结束
一个线程等待另外一个线程的方法是wait()方法

4.CyclicBarrier(栅栏):可以让一组线程等待其他线程。 CountDownLatch(闭锁): 可以让一组线程等待某个事件发生

5.文字游戏,start()是启动一个线程
run()是执行一个线程

6.解决哈希冲突常用的两种方法是:开放定址法和链地址法
开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。查找时探查到开放的 地址则表明表中无待查的关键字,即查找失败。
链地址法:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针

7.>>表示带符号右移; >>>无符号右移, 左边空出的位以0填充。

8.方法可以和类名同名的,和构造方法唯一的区别就是,构造方法没有返回值。

9.如果在循环的过程中调用集合的remove()方法,就会导致循环出错,例如:

for(int i=0;i<list.size();i++){    list.remove(...);}

循环过程中list.size()的大小变化了,就导致了错误。
所以,如果你想在循环语句中删除集合中的某个元素,就要用迭代器iterator的remove()方法,因为它的remove()方法不仅会删除元素,还会维护一个标志,用来记录目前是不是可删除状态,例如,你不能连续两次调用它的remove()方法,调用之前至少有一次next()方法的调用。

10.
Struts1和Struts2的区别和对比:

Action 类:
• Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Action是接口。
• Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。

线程模式:
• Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
• Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

Servlet 依赖:
• Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。
• Struts 2 Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2 Action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。

可测性:
• 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API(这使得测试要依赖于容器)。一个第三方扩展--Struts TestCase--提供了一套Struts1的模拟对象(来进行测试)。
• Struts 2 Action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。

捕获输入:
• Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean(DynaBeans)可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述(创建)已经存 在的JavaBean(仍然会导致有冗余的javabean)。
• Struts 2直接使用Action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。

表达式语言:
• Struts1 整合了JSTL,因此使用JSTL EL。这种EL有基本对象图遍历,但是对集合和索引属性的支持很弱。
• Struts2可以使用JSTL,但是也支持一个更强大和灵活的表达式语言--”Object Graph Notation Language” (OGNL).

11.表达式的数据类型自动提升, 关于类型的自动提升,注意下面的规则。
①所有的byte,short,char型的值将被提升为int型;
②如果有一个操作数是long型,计算结果是long型;
③如果有一个操作数是float型,计算结果是float型;
④如果有一个操作数是double型,计算结果是double型;
而声明为final的变量会被JVM优化,第6行相当于 b6 = 10

12.优化Hibernate所鼓励的7大措施:
1.尽量使用many-to-one,避免使用单向one-to-many
2.灵活使用单向one-to-many
3.不用一对一,使用多对一代替一对一
4.配置对象缓存,不使用集合缓存
5.一对多使用Bag 多对一使用Set
6.继承使用显示多态 HQL:from object polymorphism=”exlicit” 避免查处所有对象
7.消除大表,使用二级缓存

13.interface 只能被abstract,public和默认修饰符修饰

14.jsp生命周期
Jsp只会在客户端第一次发请求的时候被编译,之后的请求不会再编译,同时tomcat能自动检测jsp变更与否,变更则再进行编译。
第一次编译并初始化时调用: init() ;销毁调用: destroy() 。在整个jsp生命周期中均只调用一次。
service()方法是接收请求,返回响应的方法。每次请求都执行一次,该方法被HttpServlet封装为doGet和doPost方法

15.

public class MathDemo {      public static void main(String args[]){          /**          * abs求绝对值          */          System.out.println(Math.abs(-10.4));    //10.4          System.out.println(Math.abs(10.1));     //10.1          /**          * ceil天花板的意思,就是返回大的值,注意一些特殊值          */          System.out.println(Math.ceil(-10.1));   //-10.0          System.out.println(Math.ceil(10.7));    //11.0          System.out.println(Math.ceil(-0.7));    //-0.0          System.out.println(Math.ceil(0.0));     //0.0          System.out.println(Math.ceil(-0.0));    //-0.0          /**          * floor地板的意思,就是返回小的值          */          System.out.println(Math.floor(-10.1));  //-11.0          System.out.println(Math.floor(10.7));   //10.0          System.out.println(Math.floor(-0.7));   //-1.0          System.out.println(Math.floor(0.0));    //0.0          System.out.println(Math.floor(-0.0));   //-0.0          /**          * max 两个中返回大的值,min和它相反,就不举例了          */          System.out.println(Math.max(-10.1, -10));   //-10.0          System.out.println(Math.max(10.7, 10));     //10.7          System.out.println(Math.max(0.0, -0.0));    //0.0          /**          * random 取得一个大于或者等于0.0小于不等于1.0的随机数          */          System.out.println(Math.random());  //0.08417657924317234          System.out.println(Math.random());  //0.43527904004403717          /**          * rint 四舍五入,返回double值          * 注意.5的时候会取偶数          */          System.out.println(Math.rint(10.1));    //10.0          System.out.println(Math.rint(10.7));    //11.0          System.out.println(Math.rint(11.5));    //12.0          System.out.println(Math.rint(10.5));    //10.0          System.out.println(Math.rint(10.51));   //11.0          System.out.println(Math.rint(-10.5));   //-10.0          System.out.println(Math.rint(-11.5));   //-12.0          System.out.println(Math.rint(-10.51));  //-11.0          System.out.println(Math.rint(-10.6));   //-11.0          System.out.println(Math.rint(-10.2));   //-10.0          /**          * round 四舍五入,float时返回int值,double时返回long值          */          System.out.println(Math.round(10.1));   //10          System.out.println(Math.round(10.7));   //11          System.out.println(Math.round(10.5));   //11          System.out.println(Math.round(10.51));  //11          System.out.println(Math.round(-10.5));  //-10          System.out.println(Math.round(-10.51)); //-11          System.out.println(Math.round(-10.6));  //-11          System.out.println(Math.round(-10.2));  //-10      }  }  

16.wait(),notify(),notifyAll()只有当前线程拿到this object’s monitor才能调用.
wait()方法会释放当前线程拿到的锁,sleep()不会。
notify()调用后,并不是马上就释放对象锁的,而是在相应的synchronized(){}语句块执行结束,自动释放锁后,JVM会在wait()对象锁的线程中随机选取一线程,赋予其对象锁,唤醒线程,继续执行。这样就提供了在线程间同步、唤醒的操作。


17.为什么一个负责任的Java程序员想使用嵌套类?

为了让非常专门的类的代码与和它一起工作的类联系起来
为了支持产生特定事件的新的用户界面。


18.hashMap跟hashTable的区别:

  1. Map是一个接口,hashtable,hashmap都是它的实现。
  2. 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
  3. HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

  4. HashTable直接使用对象的hashCode,代码是这样的:
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;
    HashMap重新计算hash值,而且用与代替求模:
    int hash = hash(k); int i =indexFor(hash, table.length)

19.hibernate 开发中,关于POJO 类对象的状态:
1.transient:瞬态或者自由态 (new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient)
2.persistent:持久化状态 (和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent)
3.detached:脱管状态或者游离态 (1)当通过get 或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于 detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态 (2)当把session关闭时,session缓存中的persistent的po对象也变成detached 因关闭session而变成游离态的可以通过lock、save、update变成持久态


20.在类方法中不能用this。


21.这里写图片描述


22.Swing中的顶层容器类
Swing提供三个顶层容器类:JFrame,JDialog和JApplet。当使用这些容器类时,请谨记以下原则。
要在屏幕上显示,每个GUI组件必须是一个“容器层级”的一部分。
每个GUI组件只能属于一个容器,如果组件已经在一个容器当中,而又试图将它添加到另一个容器当中去,那么应该从第一个容器中移除该组件,然后添加到两一个容器去。
各种可视化组件不直接放到顶层容器中去,而是放在容器的内容面板中。
可以选择添加一个菜单栏到顶层容器中,菜单栏应该按惯例位于顶层容器中,但必须位于内容面板之外。
Swing中还有一个命名为JInternalFrame的内部窗体,它模仿JFrame,但实际上内部窗体并不是真正的顶层容器。


23.
集合中
使用泛型要比非泛型的效率高很多
使用泛型时,因为其类型是固定某一个类型,不需要拆箱装箱的值到引用类型的转换,而非泛型反之。


24 . Integer.parseInt()方法只会抛出NumberFormatException

parseInt()源码如下:

    public static int parseInt(String s, int radix)                throws NumberFormatException    {        /*         * WARNING: This method may be invoked early during VM initialization         * before IntegerCache is initialized. Care must be taken to not use         * the valueOf method.         */        if (s == null) {            throw new NumberFormatException("null");        }        if (radix < Character.MIN_RADIX) {            throw new NumberFormatException("radix " + radix +                                            " less than Character.MIN_RADIX");        }        if (radix > Character.MAX_RADIX) {            throw new NumberFormatException("radix " + radix +                                            " greater than Character.MAX_RADIX");        }        int result = 0;        boolean negative = false;        int i = 0, len = s.length();        int limit = -Integer.MAX_VALUE;        int multmin;        int digit;        if (len > 0) {            char firstChar = s.charAt(0);            if (firstChar < '0') { // Possible leading "+" or "-"                if (firstChar == '-') {                    negative = true;                    limit = Integer.MIN_VALUE;                } else if (firstChar != '+')                    throw NumberFormatException.forInputString(s);                if (len == 1) // Cannot have lone "+" or "-"                    throw NumberFormatException.forInputString(s);                i++;            }            multmin = limit / radix;            while (i < len) {                // Accumulating negatively avoids surprises near MAX_VALUE                digit = Character.digit(s.charAt(i++),radix);                if (digit < 0) {                    throw NumberFormatException.forInputString(s);                }                if (result < multmin) {                    throw NumberFormatException.forInputString(s);                }                result *= radix;                if (result < limit + digit) {                    throw NumberFormatException.forInputString(s);                }                result -= digit;            }        } else {            throw NumberFormatException.forInputString(s);        }        return negative ? result : -result;    }

25.以前抽象类或者抽象方法默认是protected,jdk1.8以后改成默认default

1 0
原创粉丝点击