Java面试学习(一)Java基础知识&多线程&集合

Java基础部分

1、&与&&的区别

答:
相同点: &与&&都是逻辑运算符,都是判断两边同时为真则为真,否则为假。
不同点: &&当第一个条件不成立的时候,第二个条件就不执行了,具有短路功能。
        &必须两个条件都判断完成。

2、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指的对象中的内容还是可以改变的。
如图:
这里就是用final修饰的对象,是指存放在堆中,内存中的地址不能改变,但是A的值,是可以改变的,
也就是对象的值是可以改变的。

这里写图片描述

3、静态变量和实例变量的区别?(必问)

从语法上的区别:
    静态变量前必须要加static关键字,而实例变量前则不加
程序运行时的区别:
    静态变量不属于任何实例对象,而是输入类,也称为类变量,所以只要程序加载了类的字节码,
    不用创建任何实例对象,静态变量就会被分配内存空间。静态变量就可以被使用了。


    实例变量属于某个对象的属性,必须创建了实例对象,其实例变量才会被分配内存空间,才能使用
    这个实例变量。

总之:实例变量必须要创建某个实例对象才能使用,静态变量可以直接使用类名.来引用。

    静态变量使用时通过类名.名称  
    实例变量必须要初始化才会被分配空间,
    而静态变量是当类加载时才会分配空间

4、是否可以从static方法内部调用非static方法

不可以!!!

因为非static方法要与对象关联在一起的,必须创建对象后,才可以在该对象上进行方法调用。
static方法调用时不需要创建对象,可以直接调用。

也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,
如果从一个static方法中发出对非static方法的调用,那么非static方法是关联到那个对象呢?这个逻辑无法成立。


所以: 无法从static方法调用非static方法
但是非static方法能在方法体内调用static方法。

5、”==” 和 equals方法区别

== 如果判断值类型的话,判断内容是否相同,如果判断引用类型,则判断的是内存地址是否相同。

equals是判断值内容是否相等。

6、int 和Integer的区别

int : 基本类型    默认值是 0 
Integer:引用类型  默认值是 null   

7、public、 private、 protected 以及不写的区别

这里写图片描述

Java基础知识 面向对象知识

8、重载和重写的区别

重载:重载是同一个类中,方法名相同,但是参数或个数不同,与返回值没有关系。
重写:重写是在多个类中,产生集成关系,父类与子类的方法名必须相同。

9、接口与抽象类的区别

区别:不同点:
    定义接口的关键字是:interface。
    定义抽象类的关键字是:abstract。
接口成员不能有私有                              抽像类可以
接口定义的成员变量默认是final public static 类型, 抽象类没有
接口中不能有普通方法,                           抽象类中可以有

相同点:
抽象类和接口都不能new

10、final、finally、finalize 的区别(背熟)

final: 用于声明属性表示属性不可变  final int a = 10;  a= 20;//错误 a 不可变 使用final 修饰了
       用于声明方法表示方法不可覆盖
       用于声明类表示类不可以被继承

       在内部类中如果要访问局部变量,局部变量必须定义成final类型

finally: 是异常处理语句结构的一部分,表示总是执行

finalize: 是Object类的一个方法,在垃圾收集器执行的时候会调用finalize方法回收对象
          JVM 不保证此方法总被调用。

11、String 、StringBuffer 与 StringBuilder 的区别

String : 字符串常量    字符常量池 频繁扩展的话会耗费内存。
StringBuffer: 字符串变量(线程安全)  使用了synchronized 修饰
StringBuilder: 字符串变量(线程不安全)

13、所有类都继承于Object类,你用过的Object类的直接子类有哪些,Object类常用方法有哪些

1、clone

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

2、getClass()

2、equals
3、hashCode()
4、notify()
5、notifyAll()
6、toString()

14、数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法。有length这个属性。
String有length()这个方法。

Java多线程部分

15、什么是多线程?

在同一个应用程序中,同时,有多个不同的执行路径,叫多线程。

16、说一下多线程的好处?

提供程序执行效率

17、线程和进程的区别

线程是进程的一条执行路径,而进程是线程的集合。

18、什么是线程同步、异步?

线程同步:表示在当前线程执行完后,下一个线程接着执行。

线程异步:表示在同一个应用程序中,同时,有多个不同的执行路径。

        如:javaWeb ajax , android handler.

19、线程之间如何同步

线程之间同步使用sychronized、wait 与notify

20、什么是线程不安全?如何解决?(记熟 重点)

什么是线程不安全?
    就是在多个线程共享同一个数据会受到其他线程的干扰。
如何解决:
    使用线程同步技术,用上锁(sychronized)。让一个线程执行完了,再让另一个线程执行。

21、如何创建一个线程?有几种方法?

1、继承Thread类,重写run()方法,
2、实现Runnable接口,重写run方法。启动线程使用start()方法。
3、线程池。

22、是使用Runnable接口好,还是继承Thread类好?

使用Runnable接口好,原因是实现了implements 后还可以继续 继承 其他类。

如果继承了Thread类,就不能继承了。

23、sleep()和 wait()有什么区别?

1、sleep() 是让当前线程指定休眠时间,然后继续工作,   不释放锁。
2、让当前线程wait()则是等待,直到有线程通知notify() 唤醒他 才会重新工作。释放锁。

Java 集合部分

这里写图片描述

24、说下数据结构中什么是数组?什么是链表?

数组:存储区间是连续的,占用内存空间复杂的时候会很大,但是数组在使用二分查找的时候会很快,复杂度为O(1);

数组的特点:寻址容易,插入和删除困难。

链表:链表的存储区间离散,占用内存空间比宽松,所以空间复杂度很小,但是时间复杂度很大。
链表特点:寻址困难,插入和删除容易。

25、说下ArrayList底层实现方式?

1、ArrayList底层是由数组实现的,我们实例化一个ArrayList默认为数组为0。

2、add()方法底层实现:
    如果增加的元素超过了10个,那么ArrayList底层会新生成一个数组,长度为原数组的1.5倍+1
    然后将原数组的内容复制到新数组当中,并且后续增加内容会放到新数组当中。当新数组无法容纳增加
    的元素时,重复该过程。
    如果一旦数组超过长度,开始扩容数组,扩容数组调用Arrays.copyOf(objArr,objArr.length+1);

26、说下LinkedList底层实现方式?

LinkedList底层的数据结构是基于双向循环链表,且头表结点不存放数据。

既然是双向链表,那么必定存在一种数据结构——我们可以称之为节点,节点实例保存业务数据
,前一个节点的位置信息和后一个节点位置信息,如下图所示:

27、说下HashMap底层实现方式?

HashMap底层是由数组+链表组成的。
put方法底层实现。
通过key的Hash值%Entry[].length得到该存储的下标位置,如果多个key的Hash值%Entry[].length值相同的话就会存储
到该链表的后面。

28、介绍Collection框架的结构?

29、ArrayList和Vector的区别?

相同点:两个类都实现了List接口(List接口继承了Collection接口).
       它们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的。
       相当于一种动态数组,我们可以使用索引来取出某个元素。
       在初始化的时候都可以设置空间大小。
不用点有2点:
    1、同步性
        Vector:是线程安全的,也就是说 它的方法之间是线程同步的,加了锁的,(就是用了synchronized修饰)
        ArrayList:线程是不安全的。
        所以如果是多线程就最好使用Vector来存储数据。

        ArrayList不考虑线程的安全性所以效率要比Vector效率要高一点。

    2、数据增长情况不同

    ArrayList:ArrayList在源码中可以看到增长为原来的1.5倍   ArrayList没有设置增长空间的大小。
    Vector:增长成原来的2倍,默认是两倍,但是Vector可以设置增长空间的大小。

30、HashMap和HashTable的区别

相同点:都是使用键值对的方式来存储数据的(个人总结)

不同点:
    HashMap:
    线程不安全,允许有null的键和值,效率高,方法没有加锁(synchronize),有containsValue()方法和
    containsKey()方法。
    实现方式:HashMap是Java 1.2引进的Map interface的一个实现   HashMap 是HashTable 的轻量级实现。

    HashTable:线程安全的,不允许有null的键和值,效率低,方法有加锁(synchroize) 有contains()方法。

    实现方式:HashTable类继承于Dictionay类,HashTable要比HashMap要旧。

31、List、Map、Set区别?

相同点:Java集合包括了三大类,List、Map、Set都是接口,他们都有各自的实现类。

    List:主要实现类有ArrayList、LinkedList.
    Map:主要实现类有HashMap , HashTable,TreeMap.
    Set: Set中的对戏那个不按特定的方式来排序,并且没有重复的对象,但它有些实现类可以对集合中特定的对象来排序

32、说出ArrayList,Vector,LinkedList 的存储性能和特性?

ArrayList和Vector:采用数组方式存储数据,插入的时候涉及数组元素移动内存的操作,所以效率比较慢。
Vector采用了synchronized(线程安全),所以性能比ArrayList差。
LinkedList采用的是双向链表的方式实现存储,查找比较慢,因为要从前往后遍历,
插入比较快,只需要记录本项的前后项即可。

33、Collection 和Collections的区别

Collection是集合类的上级接口:继承于它的接口主要有List、Set。
Collections是集合类的帮助类:它提供类许多关于集合的静态方法,如:排序、搜索、。

---

34、Set里的元素时不能重复的,那么用什么方法来区分重复与否?是用==还是equals()?它们有何区别?

Set里的元素是不能重复的,用iterator()方法来区分是否重复;

equals方法是检测两个对象是否想等。即两个对象的内容是否相等。
== 使用来比较基本数据类型,如果两个值想等结果为true;
比较引用类型时,比较的是内存地址

35、HashSet 和TreeSet有什么区别?什么时候用它们?

区别:
    HashSet:元素不能重复,没有顺序。
    TreeSet:元素不能重复,但有顺序。

当集合需要排序的时候,使用TreeSet

一般使用HashSet,因为不需要排序,速度快

36、什么是泛型,怎么使用的,有什么好处?

定义集合时,可以知道集合里面是什么类型,

使用:在集合类型后面加<数据类型>

使用泛型后,从集合取出来的数据就不需要强制转换了

37、什么是foreach循环,他可以循环哪些数据类型?

增强for循环,可以循环数组和集合

38、写出Collections的6个方法,并详细解释?

sort():对集合进行排序
shuffle():打乱集合中的元素顺序
addAll():将一个集合添加到另一个集合中
max():判断集合中的最大值
min():判断集合中的最小值
copy():将一个集合中的元素复制到另一个集合中去
fill():将一个集合中的元素全部替换成指定的元素

39、Arrays类是做什么的,写出它常用的6个方法?

1.equals() 多维数组用deepEqulas().
2.flii() 填充同一元素或复制同一引用.
3.sort()数组排序.
4.binarySearch().
5.toString().
6.hashCode().
以上方法都重载过。

40、比较下集合和数组的优缺点?

集合: 是多个对象的容器,可以将不同数据类型的多个对象组织在一起

数组类型: 是有相同数据类型的数据集合,数组是很多语言都支持的底层数据结构,性能上是最高的
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值