美文网首页
03/16牛客刷题总结

03/16牛客刷题总结

作者: lhsjohn | 来源:发表于2019-03-16 22:25 被阅读0次

    1.垃圾回收

    垃圾回收在jvm中优先级相当相当低

    垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制

    垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重的BUG,照样内存溢出

    进入DEAD的线程,它还可以恢复,GC不会回收。

    深入理解Java虚拟机p66,真正宣布一个对象死亡,至少需要经历2次标记过程。当第一次标记时会同时进行一次筛选(判断此对象是否有必要执行finalize方法)。如果对象没有覆盖该方法,就面临死亡,所以说这个方法是对象逃脱死亡命运的最后一次机会。

    当程序运行时,至少会有两个线程开启启动,一个是我们的主线程,一个是垃圾回收线程,垃圾回收线程的priority(优先级)较低,垃圾回收器会对我们使用的对象进行监视,当一个对象长时间不使用时,垃圾回收器会在空闲的时候(不定时)对对象进行回收,释放内存空间,程序员是不可以显示调用垃圾回收器回收内存的,但是可以使用System.gc()方法建议垃圾回收器进行回收,但是垃圾回收器不一定会执行。

    Java的垃圾回收机制可以有效的防止内存溢出问题,但是它并不能完全保证不会出现内存溢出。当程序出现严重的问题时,也可能出现内存溢出问题。

    2.jdbc连接数据库步骤:

    //声明数据库驱动,数据源的url,用于登录数据库的账户和密码(将其他功能封装成方法的时候方便使用)
    String driver = "数据库驱动名称";
    String url = "数据库连接地址";
    String user = "用来连接数据库的用户名";
    String pwd = "用来连接数据库的密码";
    
    //加载数据库驱动
    Class.forName(driver);
    
    //根据url创建数据库连接对象Connection
    Connection conn = DriverManage.getConnection(url,user,pwd);
    
    //用数据库连接对象创建Statement对象(或PrepareStatement)
    Statement s = conn.createSatement();
    //或者
    
    PrepareStatement pstmt = conn.PrepareStatement(sql);
    
    //做数据库的增删改查工作
    ResultSet rs = s.executeQuery();
    
    
    //关闭结果集对象ResultSet , statement对象, connection对象
    rs.close();
    s.close();
    conn.close();
    
    //各个步骤的异常处理
    
    

    3.URL u =new URL("http://www.123.com");。如果www.123.com不存在,则返回______。

    答案: http://www.123.com

    我们在执行URL u = new URL("http://www.123.com");这句话的时候确实要抛出异常,但是这个异常属于IOException,不管网址是否存在,最后都会返回该网址的一个连接,打印出来就是该网址。

    1. package语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,只能包含一条package语句。

    5.a.HashMap,TreeMap 未进行同步考虑,是线程不安全的。

    b.HashTable和ConcurrentHashMap都是线程安全的。区别在于他们对加锁的范围不同,HashTable对整张Hash表进行加锁,而ConcurrentHashMap将Hash表分为16桶(segment),每次只对需要的桶进行加锁。

    c.Collections类提供了sychronizedXxx()方法,可以将指定集合包装成线程同步的集合。比如,

    List list = Collections.sychronizedList(new ArrayList());

    Set set = Collections.synchronizedSet(new HashSet());

    6.截至jdk1.8 java锁的类型及介绍

    http://ifeve.com/java_lock_see/

    7.Socket类(套接字)。套接字是两台机器间通信的端点

    InetAddress getLocalAddress() //获取套接字绑定的本地地址

    boolean getReuseAddress(). //是否启用SO_REUSEADDR. http://www.cnblogs.com/qq78292959/archive/2013/01/18/2865926.html

    int. getLocalPort() //返回此套接字绑定到的本地端口

    8.hashCode()和equals()方法

    hashCode()和equals()方法作用其实是一样的,在Java里面都是用来对比两个对象是否相等一致

    那么equals()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因为重写的equals()里一般比较

    的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。

    那么hashCode()既然效率这么高为什么还要equals()呢? 因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值的公式可能存在的问题),所以hashCode()只能说大部分时候可靠,并不是绝对可靠。

    所以我们可以得出:

    1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。

    2.hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的。

    所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低,所以解决方式是,每当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equals()去再去对比了),如果hashCode()相同,此时再对比他们的equals(),如果equals()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性。

    1. IOC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection, 依赖注入 )来实现的。

      比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A中,这样就完成了对各个对象之间关系的控制。

    10.编写代码时候继承和实现同时出现怎么办?

    a. Java中单实现通过implements关键字,多实现通过extends关键字

    b.Java中单继承通过extends关键字,没有多继承

    c.如果同时出现继承和实现,则必须先继承(extends)再实现(Implements)

    1. JSP分页代码中,哪个步骤次序是正确的?

    先取总记录数,得到总页数,最后显示本页数据。

    a. count(*) 得到总记录数

    b, 计算总页数

    c.获取所有记录(个人感觉这一步不重要,可以直接获得指定页数数据)

    d.过滤显示本页数据

    12.所有异常都是Exception的子类. 比如用Exception,因为所有的异常都是Exception的子类,如果你把Exception放在前边捕获,后面的catch将永远不会执行。

    1. session和cookie

      a. session用来表示用户会话,session对象在服务端维护,一般tomcat设定session生命周期为30分钟,超时将失效,也可以主动设置无效;

    ​ b. cookie存放在客户端,可以分为内存cookie和磁盘cookie。内存cookie在浏览器关闭后消失,磁盘cookie超时后消失。当浏览器发送请求时,将自动发送对应cookie信息,前提是请求url满足cookie路径;

    ​ c. 可以将sessionId存放在cookie中,也可以通过重写url将sessionId拼接在url。因此可以查看浏览器cookie或者地址栏url看到sessionId;

    ​ d.请求到服务端时,将根据请求中的sessionId查找session,如果可以获取到则返回,否则返回null或者返回新构建的session,老的session依旧存在。

    1. 构造方法每次都是构造出新的对象,不存在多个线程同时读写同一对象的属性的问题,所以不需要同步。

      如果父类中的某个方法使用了synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类的这个方法并不是同步的,必须显式地在子类的这个方法中加上synchronized关键字才可。当然,也可以在子类中调用父类中相应的方法,这样虽然子类中的方法并不是同步的,但子类调用了父类中的同步的方法,也就相当子类方法也同步了。

    1. String StringBuilder和StringBuffer

      效率: String(大姐,出生于JDK1.0时代)不可变字符序列 < StringBuffer(二姐,出生于JDK1.0时代)线程安全的可变字符序列 < StringBuilder(小妹,出生于JDK1.5时代)非线程安全的可变字符序列。Java中的String是一个类,并非基本数据类型。String是值传入,不是引用传入。StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别,但在线程安全性方面,StringBuffer允许多线程进行字符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized修饰了,而StringBuilder没有。

      StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选.另外,JVM运行程序的主要时间耗费是在创建对象和回收对象上。

    16.以下代码执行的结果显示是多少?

    public class Demo {
        public static void main(String args[]){
            int count = 0;
            int num = 0;
            
            for(int i=0; i<=100; i++){
                num = num + i;
                count = count++;
            }
            
            System.out.println(num*count);
               
        }
      
    }
    

    答案: 0

    count = count++; 这个先将count这个值0暂存起来,然后count自加1变成1,最后将暂存的值赋值给count,count最终的值为0。

    1. 字符流和字节流

      简单地说,字符流是字节流根据字节流所要求的编码集解析获得的

      可以理解为字符流=字节流+编码集

      所以和字符流有关的类都拥有操作编码集(unicode)的能力

    字节流继承于InputStream OutputStream, 字符流继承于InputStreamReader , OutputStreamWriter

    字节流:

    InputStream

    ​ —— FileInputStream(基本文件流)

    ​ —— BufferedInputStream

    ​ —— DataInputStream

    ​ —— ObjectInputStream

    字符流:

    Reader

    ​ —— InputStreamReader(byte->char 桥梁)

    ​ —— BufferedReader(常用)

    Writer

    ​ ——OutputStreamWriter(char->byte桥梁)

    ​ ——BufferedWriter

    ​ ——PrintWriter(常用)

    相关文章

      网友评论

          本文标题:03/16牛客刷题总结

          本文链接:https://www.haomeiwen.com/subject/jvmemqtx.html