首页 > 其他 > 详细

常见笔试题

时间:2020-03-22 15:07:32      阅读:47      评论:0      收藏:0      [点我收藏+]

1.简述八大数据类型以及四个引用数据类型。
  1)八大数据类型:
    字符型:char(2)
    数值型:整型:int(4),short(2),long(8),byte(1) 浮点型:double(8),float(4)
    *布尔类型:boolean(1bit(以上都是byte为单位)(在基本数据类型中,除了boolean类型所占长度与平台有关外,其他数据类型长度都是与平台无关的))
2)四个引用数据类型:
  类:class
  字符串类型:String
  数组:array
  接口:interface

2.char型变量中能不能存贮一个中文汉字?为什么?
  首先在java中默认采用unicode字符编码方式,两个字节来表示一个字符(无论是汉字还是数字字母),而一个char型变量是两个字节,所以能存储一个汉字
而utf-8是Unicode编码的一种存储方式,它是一种可变的编码格式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
在utf-8的存储编码中中文汉字占了三个字节,128 个 ASCII 字符只占了一个字节

Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
你只是大致知道平面0(「Basic Multilingual Plane」,即「BMP」)的 65536 个码点(即 0x0000 至 0xFFFF)如何编码,这不是 Unicode 的全部。
  BMP 的字符是 Unicode 中最基础和最常用的一部分,以 UTF-16 编码时使用2字节,以 UTF-8 编码时使用1至3字节。
  超出 BMP 的字符以 UTF-16 或 UTF-8 编码都需要4字节。
  另外还有一个比较少用的编码形式,UTF-32,它编码任何 Unicode 字符都需要4个字节。
  Unicode 的基础是一个编号的字符集,在字符集之上又规定了模块化的编码等等技术层次,各种具体的编码形式并不一致,你说的「Unicode 只有两个字节」这句话根本不成立.

总的来说unicode是字符编码,Unicode只是规定了字的代号,并没有规定字所占的字节大小,
utf-8存储编码则规则了中文字符一般占三个字节(特殊的占四个字节),而且utf-8中还携带了unicode的字符编码(可以利用之相互转化)

3.break,continue以及return的用法(*java中goto保留字在c中的用法)。
  break:跳出当前循环
  return:跳出当前函数体
  continue:终止当前循环,但是不跳出循环(在循环中continue后面的语句是不会执行了),继续往下根据循环条件执行循环。
  goto:是c语言中的无条件跳转语句,通过标签进行跳转,且goto语句只能在一个函数内部跳转,它并不允许跳转出一个函数外部。

4.访问修饰有哪些,以及它们的访问范围。
  private:同一个类
  default:同一个类, 同一个包
  protected: 同一个类, 同一个包,子类
  public:同一个类, 同一个包,子类 , 不同包

5.一个整数,大于0,不用循环和本地变量,按照n,2n,4n,8n的顺序递增,当值大于5000时,把值按照指定顺序输出来。(10分)
例:n=1237
则输出为:
1237,
2474,
4948,
9896,
9896,
4948,
2474,
1237,

public void passBy(int num){
System.out.println(num+",");
num = num * 2;
if(num > 5000){
System.out.println(num);
divide(num);
return;
}
passBy(num);
}

public void divide(int num){
System.out.println(num+",");
num = num / 2;
if(num < 1000){
return;
}
divide(num);
}

6.计算字符串“23743298”奇数位的和,偶数位的和 (10分)
public void count(String str){
int oddnumber = 0;
int evennumber = 0;
for(int i = 0;i < str.length();i++){
int num = Integer.parseInt(String.valueOf(str.charAt(i)));
if(i % 2 == 0){
evennumber += num;
}else{
oddnumber += num;
}
}
System.out.println("字符串奇数位的和为:"+oddnumber);
System.out.println("字符串偶数位的和为:"+evennumber);
}

7.遍历一个List有哪些不同的方式?
第一种:
for(Iteator<String> it = list.iterator();it.hasNext();){
  String a = it.next();
}
这种方式在循环执行过程中会进行数据锁定,性能稍差,
同时,如果你想在循环过程中去掉一个元素,只能调用个it.remove方法
不能使用list.remove方法,否则一定会出现并发访问的错误

第二种:
for(String data:list){
}
内部调用了第一种,换汤不换药,因此比iterator慢,这种循环方式还有其他限制

第三种:
for(int i = 0;i < list.size();i++){
  A a = list.get(i);
}
内部不锁定,效率最高,但是当写多线程时要考虑并发操作问题

8.写出2个常见的检查时异常以及4个运行时异常。
  我们经常遇到的IO异常及sql异常就属于检查式异常。
  对于这种异常,java编译器要求我们必须对出现的这些异常进行catch,
  面对这种异常要么throws,要么catch

  5个运行时常见的异常有:
    ClassCastException(类转换异常)
    IndexOutOfBoundsException(数组越界)
    NullPointerException(空指针)
    ArrayStoreException(数据存储异常)
    还有IO操作的BufferOverflowException异常

    java.lang.NumberFormatException (数字格式异常)
    java.lang.IllegalAccessException (无访问权限异常)
    java.lang.ClassNotFoundException (类找不到)
    java.lang.NoSuchMethodError (方法不存在错误)
    java.lang.IllegalArgumentException (方法参数错误)

9.java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
  主要分为两种:字节流和字符流,字节流继承于inputStream和OutputStream,字符流则继承于InputStreamReader,OutputStreamWriter,
,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。
Java中其他多种多样变化的流均是由它们派生出来的

区别:
字符流和字节流是根据处理数据的不同来区分的。字节流按照8位传输,字节流是最基本的,所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。
  1.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串;
  2. 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
读文本的时候用字符流,例如txt文件。读非文本文件的时候用字节流,例如mp3。理论上任何文件都能够用字节流读取,但当读取的是文本数据时,为了能还原成文本你必须再经过一个转换的工序,相对来说字符流就省了这个麻烦,可以有方法直接读取。
字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节, 操作字节和字节数组。所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!

10.sleep() 和 wait() 有什么区别?
1.每个对象都有一个锁来控制同步,Synchronized关键字可以和对象的锁进行交互,来实现同步方法和同步块,sleep()方法正在执行的
线程会主动让出cpu,在sleep指定的时间后,该线程恢复原有的状态(**sleep方法只是让出了cpu并没有释放同步锁,且不能改变对象的状态)
wait()方法则让当前线程释放对象同步锁,等待其他线程调用notify()方法/notifyAll()唤醒,才能继续竞争同步资源锁
2.sleep()方法可以在任何地方使用,wait()方法只能在同步方法和同步块中使用
3.sleep()是线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控还继续保持,不会释放对象锁
wait()是object的方法,调用会释放对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,再次获得对象锁才会进入运行状态;

11.古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少对?
分析:
头三个月只有:一对兔子
第四个月到第六个月:每个月增加一对兔子
第七个开始:每个月增加(i+1)对兔子(i=1;i++)
public void countRabbit(int year){
int allnum;
if(year > 0 && year <= 3){
allnum = 1;
}else if(year > 3 && year <= 6){
allnum = year - 3 + 1;
}else{
allnum = 4;
for(int i = 0,num = 2;i < year-6;i++,num++){
allnum += num;
}
}
System.out.println(year+"个月后,兔子总对数为:"+allnum);
}

12.去掉一个ArrayList集合中重复的元素:
  1)循环list中的所有元素然后删除(两个嵌套for循环)
  2)通过HashSet剔除重复元素(无序的)
    (通过hashset的构造器new HashSet(list),list.clear(),list.addAll(h))
  3)删除ArrayList中重复元素,保持顺序
    (通过HashSet和list的迭代器实现,将原先list的元素依次取出,
    set进HashSet中通过判断是否成功,来判断是否重复,在确定是否放进新的list中,
    新的list就是结果list)
  4)把list里的对象遍历一遍,通过list.contain(),来判断,如果不存在在新的list就加入

13.在java中,使用关键字synchronized给对象加互斥锁.
java的内置锁是一个互斥锁,意味着最多只有一个线程能够获取该锁
java的对象锁和类锁,对象锁用于对象的实例方法,类锁用于类的静态方法和一个类的class对象上
上面代码synchronized同时修饰静态方法和实例方法,但是运行结果是交替进行的,
这证明了类锁和对象锁是两个不一样的锁,控制着不同的区域,它们是互不干扰的。
同样,线程获得对象锁的同时,也可以获得该类锁,即同时获得两个锁,这是允许的。
synchronized的用法:synchronized修饰方法和synchronized修饰代码块
synchronzied只是一个内置锁的加锁机制,当方法加上synchronized关键字时,就表明要获得内置锁才能执行

14.在Java中,创建多线程的途径有两种: 和
  1)继承Thread,子类重写run方法,调用start方法启用新线程,会自动调用子类的run方法
  2)该类实现runnable接口,且实现里面的run方法,当作构造器参数启用新线程.

15.Java中多态表现在方法的____,_____方面。
  1)编译时多态(方法的重载)
  2)运行时多态(多态的主要体现方面:是父类引用指向子类对象产生的)
    方法调用的优先级问题:(this.show(O)>super.show(O)>this.show((super)O)>super.show((super)O)
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,
但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
(也就是说如果该方法在子父类中同时有实现时,默认用子类对象去调用此方法,否则继续根据方法调用的优先级去调用)
(但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了)
(引用变量的使用:类型为超类,引用的是子类的对象)
所以:多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。

16. _____表示系统级的错误和程序不必处理的异常,_____表示需要捕捉或者需要程序进行处理的异常。
  Error(错误)表示系统级错误和程序不必处理的异常,是java运行环境的内部错误或者硬件问题,比如内存资源不足
  它是由java虚拟机抛出的
  Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
Exception又分为运行时异常,受检查异常。
运行时异常,表示无法让程序恢复的异常,导致的原因通常是因为执行了错误的操作,建议终止程序,因此,编译器不检查这些异常。
受检查异常,是表示程序可以处理的异常,也即表示程序可以修复(由程序自己接受异常并且做出处理), 所以称之为受检查异常。

17.并发控制是多线程编程的难点。一个线程要等待某个条件的满足调用wait方法等待,
通知某一个处于等待状态线程的方法是notify,通知多个的是 notifyAll
一段线程不安全的代码,使用synchronized关键字让代码块单线程执行
运行中线程等待其他线程结束调用线程的join方法
暂时让出执行权调用yield方法

常见笔试题

原文:https://www.cnblogs.com/nyhhd/p/12545966.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!