Java类技术岗基础试题(二)

一、怎么判断一个对象需要回收?

 目前是两种方式:
    方式一:引用计数器:为每个对象创建一个引用计数,
当有对象引用时,计数器+1,当引用释放时,计数器-1,
所以,当计数器为0时,就认为可以被回收。
   方式二:可达性分析算法:在主流的商业程序语言(Java、C#),
都是通过可达性分析来判断对象是否存活的。这个算法的基本是:通
过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下
搜索,当GC Roots到一个对象不可达时,则证明这个对象是不可用
的,可以将其回收。

二、简述mybatis的底层实现原理。

    MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory再根据配置,获取一个SqlSession。
配置来源于两个地方,一处是配置文件,一处是Java代码的注解。
SqlSession包含了执行sql所需要的所有方法,
可以通过SqlSession实例直接运行映射的sql语句,
完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。

三、Java 中,throw 和 throws 有什么区别?

    throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。
用在方法声明后面,跟的是异常类名可以跟多个异常类名,用逗号隔开表示抛出异常,由该方法的调用者来处理。  
throws表示出现异常的一种可能性,并不一定会发生这些异常。
    throw:则是用来抛出一个具体的异常类型。 用在方法体内,跟的是异常对象名。只能抛出一个异常对象名表示抛出异常,由方法体内的语句处理。
throw则是抛出了异常,执行throw则一定抛出了某种异常

四、Java有没有goto?

goto 是Java中的保留字,在目前版本的Java中没有使用。
(根据James Gosling(Java之父)编写的《The Java Programming Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)

五、int和Integer有什么区别?

Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,
Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

  Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

六、高级调度与低级调度的主要任务是什么?为什么要引入中级调度?

在这里插入图片描述

七、程序有哪种装入方式?又有哪几种链接方式?

在这里插入图片描述

八、PCB的作用是什么?它是怎样描述进程的动态性质的?

在这里插入图片描述

九、I/O软件一般分为哪几个层次?

在这里插入图片描述

十、何为系统的“抖动”现象,应采用何种措施来加以避免?

在这里插入图片描述

十一、线程的sleep()方法和yield()方法有什么区别?

① sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;
② 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态;
③ sleep()方法声明抛出InterruptedException,而yield()方法没有声明任何异常;
④ sleep()方法比yield()方法(跟操作系统CPU调度相关)具有更好的可移植性。

十二、Java中如何实现序列化,有什么意义?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。
可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。

要实现序列化,需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态);
如果需要反序列化则可以用一个输入流建立对象输入流,然后通过readObject方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆。

十三、在进行数据库编程时,连接池有什么作用?

  由于创建连接和释放连接都有很大的开销(尤其是数据库服务器不在本地时,每次建立连接都需要进行TCP的三次握手,释放连接需要进行TCP四次握手,造成的开销是不可忽视的),
  为了提升系统访问数据库的性能,可以事先创建若干连接置于连接池中,需要时直接从连接池获取,使用结束时归还连接池而不必关闭连接,从而避免频繁创建和释放连接所造成的开销,这是典型的用空间换取时间的策略(浪费了空间存储连接,但节省了创建和释放连接的时间)。
  池化技术在Java开发中是很常见的,在使用线程时创建线程池的道理与此相同。
  基于Java的开源数据库连接池主要有:C3P0、Proxool、DBCP、BoneCP、Druid等。

十四、转发(forward)和重定向(redirect)的区别?

forward是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务器端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,因此从浏览器的地址栏中可以看到跳转后的链接地址,很明显redirect无法访问到服务器保护起来资源,但是可以从一个网站redirect到其他网站。

forward更加高效,所以在满足需要时尽量使用forward(通过调用RequestDispatcher对象的forward()方法,该对象可以通过ServletRequest对象的getRequestDispatcher()方法获得),并且这样也有助于隐藏实际的链接;在有些情况下,比如需要访问一个其它服务器上的资源,则必须使用重定向(通过HttpServletResponse对象调用其sendRedirect()方法实现)。

十五、get和post请求的区别?

①get请求用来从服务器上获得资源,而post是用来向服务器提交数据;
②get将表单中数据按照name=value的形式,添加到action 所指向的URL 后面,并且两者使用"?"连接,而各个变量之间使用"&"连接;post是将表单中的数据放在HTTP协议的请求头或消息体中,传递到action所指向URL;
③get传输的数据要受到URL长度限制(1024字节);而post可以传输大量的数据,上传文件通常要使用post方式;
④使用get时参数会显示在地址栏上,如果这些数据不是敏感数据,那么可以使用get;对于敏感数据还是应用使用post;
⑤get使用MIME类型application/x-www-form-urlencoded的URL编码(也叫百分号编码)文本的格式传递参数,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。

十六、 抽象类与接口有什么区别?

相同点:
     两者都不能实例化、都可以包含抽象方法。
     
不同点:
   	1)子类只能继承一个直接抽象类、子类可以实现多个接口。
 	2)抽象类中可以有实例成员(实例变量、实例方法)、静态成员(静态变量、静态方法)、抽象方法、内部类。抽象类中的成员方法不能用default关键字修符。
  	接口中只能有常量、抽象方法、内部类、jdk8.0新增特性后,接口中可以有实现体的静态方法以及用default关键字修饰符的实现体方法。
   	3)接口中成员的访问修饰符权限必须都是public,抽象类中没有此要求。
 	4)抽象类中可以定义构造方法,接口没有构造方法。
	5)抽象类的最高父类是Object,接口没有最高父类。

十七、 ArrayList,Vector, LinkedList的区别?

 相同点:
 	它们都是List接口的实现子类,它们都可以用下标索引去获得元素。
 	
不同点:
 	1)ArrayList、Vector都是线性表,它们本质还是数组。
	2)ArrayList是非线程安全,Vector是线程安全。查找数据效率高,速度快。添加、删除数据效率低,速度慢。
	3)LinkedList是链性表。元素存储空间地址不连续。查找数据效率低,速度慢。添加、删除数据效率高,速度快。

十八、 Lock和synchronized的异同?

相同点:
 	都可以使多个线程实现同步,Lock能完成synchronized所实现的所有功能。
 	
不同点:
	1)lock是接口,而synchronized是关键字
	2)Lock有比synchronized更精确的线程语义和更好的性能。
synchronized如果出现异常就会扔掉锁(释放锁);lock在出现异常时不会不会释放锁只有手动在finally里用unlock释放锁
	3)lock让线程中断去干别的事,而synchronized不可以
	4)lock可以知道有没有成功获取锁,而synchronized无法办到

十九、 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

二十、char 型变量中能不能存贮一个中文汉字,为什么?

char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个中文是没问题的。

发布了10 篇原创文章 · 获赞 7 · 访问量 985

猜你喜欢

转载自blog.csdn.net/qq_41209886/article/details/104075630