NowCoder-Java-Note(二)

一、 Java Application 中的主类需包含main方法,以下哪项是main方法的正确形参?( )

A.String args
B.String[] args
C.Char arg
D.StringBuffer[] args

答案:B

解析:
  • main函数的形式为 public static void main(String[] args)
  • String[] args 还有一种等价的写法: String... args
    1.前者为数组形式, 后者为可变参数形式
    2.前者用得较多, 但是看到后者也应认识。

二、 java socket如何获取本地ip地址?

A.getInetAddress()
B.getLocalAddress()
C.getReuseAddress()
D.getLocalPort()

答案:B

解析:
Socket类

三、下面代码运行结果是()

public class Test{ 
    public int add(int a,int b){   
         try {
             return a+b;      
         } 
        catch (Exception e) {  
            System.out.println("catch语句块");
         }
         finally{ 
             System.out.println("finally语句块");
         }
         return 0;
    } 
     public static void main(String argv[]){ 
         Test test =new Test(); 
         System.out.println("和是:"+test.add(9, 34)); 
     }
}

A.catch语句块;和是:43
B.编译异常
C.finally语句块;和是:43
D.和是:43;finally语句块

答案:C

解析:
先来看一段代码:
public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
        }
    }
}
  • 从结果上看,貌似finally 里的语句是在return 之后执行的,其实不然,实际上finally 里的语句是在在return 之前执行的。那么问题来了,既然是在之前执行,那为什么a 的值没有被覆盖了?
  • 实际过程是这样的:当程序执行到try{}语句中的return方法时,它会干这么一件事,将要返回的结果存储到一个临时栈中,然后程序不会立即返回,而是去执行finally{}中的程序, 在执行a = 2时,程序仅仅是覆盖了a的值,但不会去更新临时栈中的那个要返回的值 。执行完之后,就会通知主程序“finally的程序执行完毕,可以请求返回了”,这时,就会将临时栈中的值取出来返回。这下应该清楚了,要返回的值是保存至临时栈中的。
再来看一个例子,稍微改下上面的程序:
public abstract class Test {
    public static void main(String[] args) {
        System.out.println(beforeFinally());
    }
     
    public static int beforeFinally(){
        int a = 0;
        try{
            a = 1;
            return a;
        }finally{
            a = 2;
            return a;
        }
    }
}
  • 在这里,finally{}里也有一个return,那么在执行这个return时,就会更新临时栈中的值。同样,在执行完finally之后,就会通知主程序请求返回了,即将临时栈中的值取出来返回。故返回值是2.
结论:
  1. finally{}代码块比return先执行。

  2. 多个return是按顺序执行的的,多个return执行了一个后,后面的return就不会执行了。

  3. 记住一点,不管有不有异常抛出,finally都会在return返回前执行。

四、在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?

int double

解析:
  • 整数类型 默认为 int
    带小数的默认为double
  • 如果要指定长整型加L;如果要指定为单精度加F

五、关于PreparedStatement与Statement描述错误的是()

A.一般而言,PreparedStatement比Statement执行效率更高
B.PreparedStatement会预编译SQL语句
C.Statement每次都会解析/编译SQL,确立并优化数据获取路径
D.Statement执行扫描的结果集比PreparedStatement大

答案:D

解析(一):
创建时的区别:
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);
执行的时候:
ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery(); 
  • 由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,

  • 而 statement 不同,如果执行多遍,则相应的就要编译多少遍sql,所以从这点看,PreparedStatement 的效率会比 Statement要高一些

解析(二):
Statement 和 PreparedStatement 有什么区别?哪个性能更好?

与 Statement 相比,
①PreparedStatement 接口代表预编译的语句,它主要的优势在于
以减少 SQL 的编译错误并增加 SQL 的安全性(减少 SQL 注射攻击的可能性)

②PreparedStatement 中的 SQL 语句是可以带参数的,避免了用字符串连接拼接 SQL 语句的麻烦和不安全;
当批量处理 SQL 或频繁执行相同的查询时,PreparedStatement 有明显的性能上的优势,由于数据库可以将编译优化后的 SQL 语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

补充:
①为了提供对存储过程的调用,JDBC API 中还提供了 CallableStatement 接口。
②存储过程(Stored Procedure)是数据库中一组为了完成特定功能的 SQL 语句的集合,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
③虽然调用存储过程会在网络开销、安全性、性能上获得很多好处,但是存在如果底层数据库发生迁移时就会有很多麻烦,因为每种数据库的存储过程在书写上存在不少的差别

图片.png

六、 Java 多线程有几种实现方法?( )

继承Thread类; 实现Runnable接口; 实现Callable接口

七、int,String,*point,union哪些不是 Java 的数据类型?(不定项)

A.int
B.String
C.*point
D.union

答案:C D

解析:
Java 的数据类型
  • 题目是说数据类型,并没有说基本数据类型,所有包括了引用数据类型,String为字符串类,属于引用数据类型

八、java中关于继承的描述正确的是()?(不定项)

A.一个子类只能继承一个父类
B.子类可以继承父类的构造方法
C.继承具有传递性
D.父类一般具有通用性,子类更具体

答案: A C D

解析:
  • 在java中,子类构造器会默认调用super()(无论构造器中是否写有super()),用于初始化父类成员,同时当父类中存在有参构造器时,必须提供无参构造器,子类构造器中并不会自动继承有参构造器,仍然默认调用super(),使用无参构造器。因此,一个类想要被继承必须提供无参构造器。

  • PS:方法没有继承一说,只有重载和重写

九、下面哪些写法能在 java8 中编译执行()(不定项)

A.dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B.dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C.dir.listFiles((_.getName().endsWith(“.Java”)));
D.dir.listFiles( f->f.getName().endsWith(“.Java”));

答案:A D

解析:
Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:
  1. 形参列表。
  2. 箭头(→)。必须通过英文中画线和大于符号组成。
  3. 代码块。
Lanbda表达式简单实例:
Lanbda表达式

十、下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader(不定项)

A.Thread
B.Number
C.Double
D.Math
E.ClassLoader

答案: A B E

解析:
  • A.Thread可以被继承,用于创建新的线程
  • B.Number类可以被继承,Integer,Float,Double等都继承自Number类
  • C.Double类的声明为
    Double类
  • D.Math类的声明为
    Math类

    final声明的类不能被继承

  • E.ClassLoader可以被继承,用户可以自定义类加载器

你可能感兴趣的:(NowCoder-Java-Note(二))