您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页Java基础题

Java基础题

来源:二三娱乐

此文非原创,来源网络上的面试题

Java的异常处理

  1. Java中异常分为哪些种类
    按照异常需要处理的时机,分为编译时异常(CheckedException)和运行时异常(RuntimeException)。只有Java提供了编译时异常,Java认为Checked异常都是可以被处理的异常,所以,Java程序必须显式的处理Checked异常。如果程序没有处理Checked异常,是不会编译通过的。这体现了Java的设计哲学,没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种:
    1. 当前方法指导如何处理该异常,则使用try...catch块来处理异常。
    2. 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。

运行时异常只有当代码在运行时才发生的异常,编译时不需要处理,比如:数组越界,空指针,算术异常等。因为种类众多,处理麻烦,每次申明的话,代码阅读性会非常的差,所以,由系统自动检测,并将他们交给缺省的异常处理程序。当然,你也可以显示的捕获他们。

2.调用下面代码,求返回结果?
public int getNum(){ try { int a = 1/0; return 1; } catch (Exception e) { return 2; }finally{ return 3; } }
返回结果是3。
原因:异常机制有一个原则:如果代码在catch中遇到return或者异常等能使该方法终止的话,如果有finally,则必须先执行完finally代码块,然后再执行catch中的返回代码。但是此例子中finally代码块是一个返回语句,所以,不会执行catch中的返回语句了。
如果finally代码块中是一个类似资源释放的语句,则catch中的返回语句会被执行,结果会返回2。

Java的数据类型

  1. Java的基本数据类型都各占几个字节
  • byte 1
  • char 2
  • short 2
  • int 4
  • float 4
  • double 8
  • long 8
  • boolean 1(boolean类型比较特别可能只占一个bit,多个boolean可能共同占用一个字节)

2.String类型是基本数据类型吗?可以被继承嘛?

  • 不是,是引用数据类型,但是底层是用char数组实现的。
  • 不能(因为是final修饰的类)。

Java的IO

1.Java中有几种类型的流

  • 字节流和字符流。
  • 字节流继承InputStream和OutputStream
  • 字符流继承InputStreamReader和OutputStreamWriter

2.字节流如何转为字符流

  • 字节输入流转字符输入流通过InputStreamReader实现,该构造函数可以传入一个InputStream对象
  • 字节输出流转字符输出流通过OutputStreamWriter实现,该构造函数可以传入一个OutputStream对象

3.如何将一个Java对象序列化到文件里?

在 Java中能被序列化的类必须先实现Serializable接口,该接口没有任何抽象方法,只是起到一个标记的作用。

` //对象输出流
File file = new File("D://obj") ;
FileOutputStream fos = new FileOutputStream(file) ;
ObjectOutputStream oos= new ObjectOutputStream(fos);

oos.writeObject(new User("zhangsan", 100));
oos.close();
//对象输入流
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
User user = (User)ois.readObject();
System.out.println(user);
ois.close();
`

Java的集合

1.集合的安全性问题

请问ArrayList,HashSet, HashMap是线程安全的嘛?如果不是,我想要线程安全的集合怎么办?

Java多线程

1.多线程的两种创建方式

java.lang.Thread类的实例就是一个java.lang.Runnable接口来执行,由于线程类本身就是实现的Runnable接口,所以你可以继承java.lang.Thread类或者直接实现java.lang.Runnable接口来重写run()方法实现线程。

2.在java中,sleep和wait方法的不同

最大的不同是在等待时,wait会释放锁,而sleep一直持有锁,wait通常被用于线程间交互,sleep通常被用于暂停执行。

3.synchronized和volatile关键字的作用

一旦一个共享变量(类的成员变量,类的静态成员变量)被volatile修饰后,那么就具有两层含义

  • 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的;
  • 禁止进行指令重排序

volatile本质是告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;

synchronized则是锁定当前的变量,只有当前线程可以访问,其他线程被阻塞住。
1.volatile仅能使用在变量级别,synchronized则可以使用在变量、方 法、和类级别的;
2.volatile仅能实现变量的修改可见性,并不能保存原子性,
synchronized既可以保证变量的可修改性,又可以保存原子性;
3.volatile不会造成线程的阻塞,而synchronized可能会;
4.volatile标记的变量不会被编译器优化,而synchronized可以被优化。

4.分析代码解释原因

public class Counter { private volatile int count = 0; public void inc(){ try { Thread.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } count++; } @Override public String toString() { return "[count=" + count + "]"; } } //---------------------------------华丽的分割线----------------------------- public class VolatileTest { public static void main(String[] args) { final Counter counter = new Counter(); for(int i=0;i<1000;i++){ new Thread(new Runnable() { @Override public void run() { counter.inc(); } }).start(); } System.out.println(counter); } }
解答:上面的代码执行结果输出答案是不一定的。

  • 在Java的内存模型中,每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值的信息。当线程访问某一个对象值的时候,首先通过对象的引用找到对应堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系了,而是直接修改副本变量的值,在修改完后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就发生了变化了。
    也就是说,上面的函数开启了1000个线程,每个线程都有一个副本变量,每个线程修改变量只是临时修改了自己的副本,当线程结束时再将修改值回写到主内存中,这样就出现了线程安全问题,因此结果不会是1000,一般都会小于1000。

5.什么是线程池,如何使用?

线程池就是事先将多个线程对象放到一个容器中,当使用的时候就不用new线程而是直接去池中拿线程即可,节省了开辟子线程的时间,提高了代码执行效率。
在JDK的java.util.concurrent.Executors中提供了生成多种线程池的静态方法。
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(4); ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(4); ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
然后调用他们的execute方法即可。

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务