zoukankan      html  css  js  c++  java
  • Java Programmer Q&A | Java程序员问答

    this, super, extend, static:
    http://blog.csdn.net/fyxxq/article/details/3260272
    http://hi.baidu.com/yunhuayu_/blog/item/1eb2c854339cf9063a2935ad.html
    Q: 为什么this 或 super必须在第一行?
    A: 子类在初始化之前,也就是构造函数在执行之前, 都必须进行父类的初始化, 也就是执行父类的构造函数; 如果子类的构造函数没有显示调用父类的任何构造函数, 则编译器会把默认的super()就会自动加入在子类构造函数的第一行, 父类没有默认的构造函数也会报错.
    Q: 为什么this 和 super不能同时存在于构造函数?
    A: 在实例化一个对象时,一 个  构造方法只能调用一次,这说明this和super不能同时存在一个构造方法中。因为系统没有在第一行发现this()或super()调用,就会自动加上super(),如果没有将this()和super()放在第一行就会产生矛盾。

     

    Q: interface接口,abstract class抽象类主要区别
    1、接口可以多重implement(实现),抽象类只能单一extends(继承)
    2、接口内只能是功能的定义,抽象类中可以包括功能的定义和功能的实现。
    3、接口字段变量默认为public static final,而抽象类的则默认为friendly。
    在interface里面的变量都是public static final 的。它们是公共的,静态的,最终的常量.相当于全局常量. 所以你可以这样写:
      public static final int i=10;
      或则
      int i=10;(可以省略掉一部分)
    接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
    接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。 

    Q: Java语言写出实现将单向链表顺序反转的函数?
    A: 假设链表的节点定义如下:
    class Node{
    int i;
    Node next;
    }
    那么其反转函数为:
    void reverse(Node l){
    if(l==null) return;
    Node p=null,q=l,r=l.next;
    while(r!=null){
    q.next=p;
    p=q;
    q=r;
    r=r.next;
    }
    q.next=p;
    l=q;
    }

    Q: Dymamic Programming 动态规划
    http://www.cnblogs.com/bourbon/archive/2011/08/23/2151044.html
    http://www.kuqin.com/algorithm/20080511/8343.html
    Q: Spring core technologies
    A: IoC, AOP http://blog.sina.com.cn/s/blog_4e29c8c9010009qe.html

     
    Q: 散列表HashTable和HashMap的区别
    A:都属于Map接口的类:HashMap是Hashtable的轻量级实现(非线程安全的实现)
      HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
      Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。
      Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
      HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
      还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
      最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
      Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

    Q: String, StringBuffer, StringBuilder
    A: StringBuffer is synchronized but StringBuilder is asynchronized.
    StringBuffer是同步的而StringBuilder是异步的,在有安全的要求下,我们只能使用StringBuffer,如果没有的话,我们就可以使用StringBuilder,因为StringBuilder的效率更高。而在效率方面的对比,从高到底,依次是:StringBuilder > StringBuffer > String

    Q: 进程和线程

    一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源.每一个进程的内部数据和状态都是完全独立的. (Java进程之间是不能共享不可序列化的对象的,只能通过文件、数据库、rmi、corba、jms来共享可序列化的对象。.)

    线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程也被称为轻负荷进程(light-weight process).

    可以自己创建线程,有两种方法,一是继承Thread类,或是实现Runnable接口。

    让线程共享其结果的最简单方法是使用共享变量(静态或实例字段),但线程还必须确保它们以受控的方式访问共享变量,以免它们互相干扰对方的更改。为了确保可以在线程之间以受控方式共享数据,Java 语言提供了两个关键字:synchronized 和 volatile。

    Volatile 比同步更简单,只适合于控制对基本变量(整数、布尔变量等)的单个实例的访问。当一个变量被声明成 volatile,任何对该变量的写操作都会绕过高速缓存,直接写入主内存,而任何对该变量的读取也都绕过高速缓存,直接取自主内存。这表示所有线程在任何时候看到的 volatile 变量值都相同.

    在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。 

    一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。

    Q: 线程run和start方法的区别

    Thread类中run()和start()方法的区别如下: http://www.cnblogs.com/linjiqin/archive/2011/04/10/2011272.html 
    run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;
    start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程;

    Q: 多线程中Thread与Runable接口有什么区别

    Java通过继承Thread或者实现Runnable接口来创建线程
      本质上没有区别,Thread类本身就实现了Runnable接口,具体区别如下:
      1、尽可能以实现Runnable接口的方式来创建线程
      2、在使用Thread的时候只需要new一个实例出来,调用start()方法即可启动
            一个线程,如:
      Thread test=new Thread();
      test.start();
    3、在调用Runnable的时候就需要先new一个实现Runnable的实例,之后用Thread
             调用
      Test implements Runnable
      Test t=new Test();
      Thread test =new Thread(t);
      test.start();

    http://blog.csdn.net/memewry/article/details/7487881

    在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
    ->避免点继承的局限,一个类可以继承多个接口。
    ->适合于资源的共享

    Q: JDBC

    JDBC 可做三件事:与Database建立连接、发送 操作数据库的语句并处理结果。

    下列code给出了以上三步的基本示例:

    Connection con = DriverManager.getConnection("jdbc:odbc:wombat","login",
    "password");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
    while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
    }

    Q: Java异常http://www.cnblogs.com/focusj/archive/2011/12/26/2301524.html

    Throwable 类是 Java 语言中所有错误或异常的超类。它有两个子类:ErrorException

    Error用于指示合理的应用程序不应该试图捕获的严重问题。这种情况是很大的问题,大到你不能处理了,所以听之任之就行了,你不用管它。比如说VirtualMachineError:当 Java 虚拟机崩溃或用尽了它继续操作所需的资源时,抛出该错误。好吧,就算这个异常的存在了,那么应该何时,如何处理它呢??交给JVM吧,没有比它更专业的了。

    Exception它指出了合理的应用程序想要捕获的条件。Exception又分为两类:一种是CheckedException,一种是UncheckedException。这两种Exception的区别主要是CheckedException需要用try...catch...显示的捕获,而UncheckedException不需要捕获。通常UncheckedException又叫做RuntimeExceptioneffective java》指出:对于可恢复的条件使用被检查的异常(CheckedException),对于程序错误(言外之意不可恢复,大错已经酿成)使用运行时异常(RuntimeException.

    常见的RuntimeExcepitonIllegalArgumentException、IllegalStateExceptionNullPointerExceptionIndexOutOfBoundsException等等。对于那些CheckedException就不胜枚举了,我们在编写程序过程中try...catch...捕捉的异常都是CheckedExceptionio包中的IOException及其子类,这些都是CheckedException

    Q: Java Stach 和Heap区别

    1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配.

    2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

    3. Java中的数据类型有两种。一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。

    另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

    Java中的堆和栈

    Java把内存分两种:一种是栈内存,另一种是堆内存

    1。在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;

    2。堆内存用来存放由new创建的对象和数组

    堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点就是要在运行时动态分配内存,存取速度较慢;

    栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。

    Q: Java内存泄露

    Java内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

    Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽)。

    Java内存溢出类型 http://itpx.eol.cn/shiti_jc_2246/20100920/t20100920_523773.shtml

    1、java.lang.OutOfMemoryError:PermGenspace JVM管理两种类型的Java内存,堆和非堆。堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。

    PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。

    Solution: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m"

    2. java.lang.OutOfMemoryError:Java heap space 其默认空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。如果内存剩余不到40%,JVM就会增大堆到Xmx设置的值,内存剩余超过70%,JVM就会减小堆到Xms设置的值。所以服务器的Xmx和Xms设置一般应该设置相同避免每次GC后都要调整虚拟机堆的大小。

    Solution: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"

    3. 栈溢出 java.lang.StackOverflowError

    • 没有跳出递归的条件,可能是递归跳不出来导致栈溢出了
    • 栈空间不够

    Solution: -Xss512k

    定位内存泄漏 http://developer.51cto.com/art/200906/129346.htm

    JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。

    不健壮代码的特征及解决办法

    1. 尽早释放无用对象的引用。尽量使用局部变量而非全局变量。

    2. 避免使用String,应大量使用StringBuffer。每一个String对象都得独立占用内存一块区域.

    3. 尽量少用静态变量,因为静态变量是全局的,GC不会回收的

    4. 避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。

    5. 尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏.

    6. 尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏

    7. 一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成 Out Of Memory Error 的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。

    JVM性能调优与参数

    http://unixboy.iteye.com/blog/174173

    http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html

    java -Xmx3550m -Xms3550m -Xmn2g -Xss128k

    -Xmx3550m:设置JVM最大可用内存

    -Xms3550m:设置JVM促使内存

    -Xmn2g:设置年轻代大小

    -Xss128k:设置每个线程的堆栈大小

    –XX:PermSize=64m //最小堆大小

    –XX:MaxPermSize=128m //最大堆大小

    Q: Java GC工作原理 

    通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的".当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

    GC在JVM中通常是由一个或一组进程来实现的,它本身也和用户程序一样占用heap空间,运行时也占用CPU.当GC进程运行时,应用程序停止运行。因 此,当GC运行时间较长时,用户能够感到Java程序的停顿,另外一方面,如果GC运行时间太短,则可能对象回收率太低,这意味着还有很多应该回收的对象 没有被回收,仍然占用大量内存。因此,在设计GC的时候,就必须在停顿时间和回收率之间进行权衡。

    增量式GC就是通过一定的回收算法,把一个长时间的中断,划分为很多个小的中断,通过这种方式减少GC对用户程序的影响。虽然,增量式GC在整体性能上可能不如普通GC的效率高,但是它能够减少程序的最长停顿时间。SunJDK提供的HotSpotJVM就能支持增量式GC.

    分代的垃圾回收策略-虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期的对象放在不同代上,不同代上采用最适合它的垃圾回收方式进行回收。

    所有新生成的对象首先都是放在年轻代的。在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。用于存放静态文件,如Java类、方法等;持久代大小通过-XX:MaxPermSize=进行设置。

    堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由FromSpace和ToSpace组成.新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例旧生代。 (http://developer.51cto.com/art/201103/248642.htm)

  • 相关阅读:
    hdu3457(有向图的dp问题)
    nyoj16矩形嵌套(第一道dp关于dag的题目)
    noj1475(递推题)统计多少个1
    hdu1331(记忆化搜索)
    hdu1142(dj+记忆化搜索)
    hdu1978(记忆化搜索)
    用广搜实现的spfa
    hdu1428(记忆化搜索)
    hdu1078(记忆化搜索)
    poj3261(后缀数组)
  • 原文地址:https://www.cnblogs.com/markjiao/p/2378522.html
Copyright © 2011-2022 走看看