java选择题

1.一个Java源程序文件中定义几个类和接口,则编译该文件后生成几个以.class为后缀的字节码文件。(正确)

 

2.在开发中使用泛型取代非泛型的数据类型(比如用ArrayList<String>取代ArrayList),程序的运行时性能会变得更好。(错误)

3.

public class Test{


    public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i <= 100 ; i++) {
            //count++的值等于多少?其实第一次循环的时候,还是0,然后又把这个值赋给了count。所以count还是0
            count = count++;
        }
        System.out.println(count);
    }
}

输出:0

4.重载就是一句话:同名不同参,返回值无关。

覆盖/重写:同名同参

 

5.

题目:总是为一个类提供了一个默认的构造函数是Java语言的一个重要特性 。

事实上只有在我们没有显示声明任何构造方法时java才会为我们提供一个默认的无参构造函数。

 

6.

1)jps:查看本机java进程信息。

2)jstack:打印线程的信息,制作线程dump文件。

3)jmap:打印内存映射,制作dump文件

4)jstat: jstat命令可以查看堆内存各部分的使用量,以及加载类的数量

5)jhat:jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

7.

 

7.线程安全的类:

Vector/Hashtable/Stack

 

8.==和三目 运算符,谁的优先级高。答:==

 

9.基本的Java语言函数存储在以下哪个java包中?java.lang

 

10.

Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;最难掌握的是round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11

        //向上取整
        System.out.println(Math.ceil(11.5));//12.0
        System.out.println(Math.ceil(-11.5));//-11.0
        //向下取整
        System.out.println(Math.floor(11.5));//11.0
        System.out.println(Math.floor(-11.5));//-12.0
        //+0.5后,向下取整
        System.out.println(Math.round(11.5));//12
        System.out.println(Math.round(-11.5));//-11

11.

类型

 

 默认值

 存储需求(字节)  

取值范围  

示例 

byte 

0

1

 -2^7—2^7-1 

byte b=10;

char 

 ‘ \u0000′ 

2

 0—2^16-1 

char c=’c’ ; 

short 

0

2

-2^15—2^15-1 

short s=10; 

int  

0

4

-2^31—2^31-1 

int i=10; 

long 

0

8

-2^63—2^63-1  

long o=10L; 

float  

 0.0f  

4

-2^31—2^31-1 

float f=10.0F 

double  

0.0d 

8

-2^63—2^63-1 

double d=10.0; 

boolean 

false  

1

true\false 

boolean flag=true;

12.下列哪些操作会使线程释放锁资源?

wait()和join()方法

详细介绍这四种(摘自《牛客网》)

1).sleep()方法

在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”。不推荐使用。

sleep()使当前线程进入阻塞状态,在指定时间内不会执行。

2.wait()方法

在其他线程调用对象的notify或notifyAll方法前,导致当前线程等待。线程会释放掉它所占有的“锁标志”,从而使别的线程有机会抢占该锁。

当前线程必须拥有当前对象锁。如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常。

唤醒当前对象锁的等待线程使用notify或notifyAll方法,也必须拥有相同的对象锁,否则也会抛出IllegalMonitorStateException异常。

waite()和notify()必须在synchronized函数或synchronized block中进行调用。如果在non-synchronized函数或non-synchronized block中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException的异常。

3.yield方法

暂停当前正在执行的线程对象。

yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

yield()只能使同优先级或更高优先级的线程有执行的机会。 

        4.join方法

join()等待该线程终止。

等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测

 

13.

Serial New收集器是针对新生代的收集器,采用的是复制算法

Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理

Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法

Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理

Parallel Old(并行)收集器,针对老年代,标记整理

CMS收集器,基于标记清理

G1收集器:整体上是基于标记 整理 ,局部采用复制

 

综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。

 

14.springboot的优缺点

优点:
1、项目的一件构建
2、对主流开发框架的无配置集成。
3、项目可独立运行,内置Tomcat无须外部依赖Servlet容器。
4、提供运行时的应用监控。
5、极大的提高了开发、部署效率。
6、与云计算的天然集成。

 

15.关于mybatis的二级缓存:

https://www.cnblogs.com/happyflyingpig/p/7739749.html

16.反转单链表


	    public static Node Reverse2(Node head) {
	        if (head == null) return head;
	        Node pre = head;// 上一结点
	        Node cur = head.getNext();// 当前结点
	        Node tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)
	        while (cur != null) {// 当前结点为null,说明位于尾结点
	            tmp = cur.getNext();
	            cur.setNext(pre);// 反转指针域的指向
	            pre = cur; // 指针往下移动
	            cur = tmp;
	        }
	        // 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
	        head.setNext(null);
	        return pre;
	    }

17.数组转List

Arrays.asList(strArray);

 

18.如何让线程按顺序执行?

https://blog.csdn.net/u010185035/article/details/81172767

join 和single

 

19.单例模式--双重锁模式

package pandy.test.singleton;
/*
 * 双重锁模式
 */
public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {
        System.out.println("SingletonDemo has loaded");
    }
    public static Singleton getInstance() {
        if(instance==null) {
            synchronized(Singleton.class) {
                if(instance==null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

20.获取文件中的第一列:

cat file | awk '{print $1}'

 

21.linux两台服务器之间传输文件

(1)将本地文件拷贝到远程
  scp 文件名 用户名@计算机IP或者计算机名称:远程路径

(2)从远程将文件拷回本地
  scp 用户名@计算机IP或者计算机名称:文件名  本地路径

22.

经常碰到这样的面试题目:#{}和${}的区别是什么?

网上的答案是:#{}是预编译处理,$ {}是字符串替换。mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;mybatis在处理 $ { } 时,就是把 ${ } 替换成变量的值。使用 #{} 可以有效的防止SQL注入,提高系统安全性。

对于这个题目我感觉要抓住两点:
(1)$ 符号一般用来当作占位符,常使用Linux脚本的人应该对此有更深的体会吧。既然是占位符,当然就是被用来替换的。知道了这点就能很容易区分$和#,从而不容易记错了。
(2)预编译的机制。预编译是提前对SQL语句进行预编译,而其后注入的参数将不会再进行SQL编译。我们知道,SQL注入是发生在编译的过程中,因为恶意注入了某些特殊字符,最后被编译成了恶意的执行操作。而预编译机制则可以很好的防止SQL注入。

 

mybatis中的#和$的区别:

1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
如:where username=#{username},如果传入的值是111,那么解析成sql时的值为where username="111", 如果传入的值是id,则解析成的sql为where username="id". 
2、$将传入的数据直接显示生成在sql中。
如:where username=${username},如果传入的值是111,那么解析成sql时的值为where username=111;
如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
3、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
4、$方式一般用于传入数据库对象,例如传入表名.
5、一般能用#的就别用$,若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止sql注入攻击。
6、在MyBatis中,“${xxx}”这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用“${xxx}”这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
【结论】在编写MyBatis的映射语句时,尽量采用“#{xxx}”这样的格式。若不得不使用“${xxx}”这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

23.什么是阻塞队列?

https://www.jianshu.com/p/4df275facc15

 

 

24.Java字节码

https://www.cnblogs.com/lybb/p/9223613.html

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值