为了账号安全,请及时绑定邮箱和手机立即绑定

10道常用的Java面试题

1.字符串
A:字符串一旦被赋值就不能被改变。
B:String s = new String("hello")和String s = "hello";的区别
前者创建了2个对象
后者创建了1个对象

2.集合和数组的区别?(面试题)

  • 集合:
  • 1:长度可以发生改变。
  • 2:只能存储对象类型。引用类型。
  • 3:可以存储任意类型的对象。
  • 数组:
  • 1:长度固定。
  • 2:可以存储基本类型,也可以存储对象类型。
  • 3:只能存储同一种类型的元素。

3.用迭代器遍历集合的时候,用集合修改集合有没有问题?如果有,怎么解决?
会ConcurrentModificationException:并发修改异常。

  • 为什么?
  • 迭代器是依赖于集合而存在的。
  • 我们在通过迭代器迭代的过程中,用集合往集合中添加了元素。
  • 而并没有重新获取迭代器,所以,报错。
  • 原因:
  • 在迭代器迭代的过程中,是不能通过集合去修改集合的。
    • 解决方案:
  • A:用集合本身遍历集合,用集合去修改集合。
  • 集合实现。添加成功,元素添加到末尾。
  • B:用迭代器迭代,用迭代器修改元素。
  • 迭代器实现。添加成功,遍历到哪里,添加到哪里。
  • // 创建集合
    List list = new ArrayList();
    list.add("zhangsan");
    list.add("lisi");
    list.add("wangwu");
    // 有问题
    // Iterator it = list.iterator();
    // while (it.hasNext()) {
    // String s = (String) it.next();
    // if ("lisi".equals(s)) {
    // list.add("zhaoliu");
    // // it = list.iterator();
    // } }

    // 用集合实现
     for (int x = 0; x < list.size(); x++) {
     String s = (String) list.get(x);
     if ("lisi".equals(s)) {
     list.add("zhaoliu");
     }
     }
    
    // 用迭代器实现
    ListIterator lit = list.listIterator();
    while (lit.hasNext()) {
        String s = (String) lit.next();
        if (list.equals("lisi")) {
            lit.add("zhaoliu");
        }   }
  1. LinkedList模拟栈数据结构的集合,并使用。

    • A:这个题目的意思是指你应该自己定义一个集合类。
    • B:你在集合类中可以有一个LinkedList可以使用。
      /*
    • 自定义栈使用
      */
      public class MyStack {
      private LinkedList link;
      public MyStack() {
      link = new LinkedList();
      }

    public void add(Object obj) {
    link.addFirst(obj);
    }

    public Object get() {
    // return link.getFirst();
    return link.removeFirst();
    }

    public boolean isEmpty() {
    return link.isEmpty();
    }
    }

5.Map和Collection集合的区别(面试题)
A:Map集合存储的是键值对形式的元素。
Collection集合存储的是单个的元素。
B:Map集合的键是唯一的。
Collection的儿子Set集合元素是唯一的。
C:Map集合的值是可以重复的。
Collection的儿子List集合的元素是可以重复的。

6.Hashtable和HashMap的区别?(面试题)
A:HashMap 线程不安全,效率高。允许null键和null值。
B:Hashtable 线程安全,效率低。不允许null键和null值。

7.flush()和close()的区别?

  • A:flush() 刷新缓冲区,流对象还可以继续使用。
  • B:close() 释放资源,但是会先刷新一次缓冲区,保证数据不丢失,操作完毕后,流对象不可以再被使用。

8.多线程程序出现安全问题的原因:

  • A:是多线程程序。
  • B:有共享数据。
  • C:针对共享数据有多条语句操作。
    现在的程序存在着问题,所以,我们要改进该程序,让它没有问题。怎么改进呢?
    • 只需要把多线程环境中,操作共享数据的操作给变成单线程就没有问题了。
  • Java针对这种情况,就提供了同步技术:同步代码块。
  • 格式:
  • synchronized(对象) {
  • 需要被同步的代码。
  • }
  • A:对象?
  • 如果不知道用哪个对象,就用Object对象。同步的锁对象
    • 代码块:任意对象方法:this,静态方法:类名.class。
  • B:需要被同步的代码?
  • 哪些代码导致出现了问题,就把哪些代码给同步起来。
  • 加入同步后,居然还有问题,为什么呢?
    • 同步代码块中的对象针对多个线程必须是同一个。
    • 其实这个对象被称为同步锁对象。

9. sleep()和wait()方法的区别?
sleep():必须指定时间。不释放锁对象。
wait():可以指定时间,也可以不指定时间。释放锁对象。

10.单例模式
要求:类在内存中的对象只有一个。
举例:打印机,网站访问量计数
分类:
饿汉式 加载就创建对象。
懒汉式 用的时候才去创建对象。
请问我们要掌握哪种方式?
开发:饿汉式
面试:懒汉式
为什么?
因为饿汉式不会出现线程安全问题。
懒汉式:
线程安全问题。你要能够给比人分析出安全问题的原因,并最终提供解决方案。延迟加载思想。(懒加载思想。)
Runtime本身就是一个饿汉式的体现。

点击查看更多内容
63人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
3
获赞与收藏
582

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消