Java基础面试题

1、构造器有什么用?

它保证对象可以正常的被初始化。

2、String内部结构

String内部存储结构为char数组,有两个私有变量,一个是char[],哈希值。

String的常用方法清单

  • indexOf():查询字符串首次出现的下标位置

  • lastIndexOf():查询字符串最后出现的下标位置

  • contains(): 查询字符串中是否包含另一个字符串

  • toLowerCase(): 把字符串全部转换成小写

  • toUpperCase(): 把字符串全部转换成大写

  • length(): 查询字符串的长度

  • trim(): 去掉字符串首尾空格

  • replace():替换字符串中的某些字符

  • split(): 把字符串分割并返回字符串数组

  • join(): 把字符串数组转为字符串

  • StringBuilder(*).reverse() 将字符串倒叙输出

    关于equals()方法:“==”和equals()的区别?

    “==”:

    对于基本数据类型来说,是比较两者的值是否相等

    对于引用数据类型来说,是用于比较两者引用地址是否相等

    equals():

    String类型的equals()是重写了Object类中的equals()方法,他的基本实现是靠的“==”,用于比较两个字符串的内容是否相等。

3、什么是序列化?

通俗点讲:它是处理对象流的一种机制,即可以很方便的保存内存中java对象的状态,同时也为了方便传输。

序列化的作用:有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象。例如,有的时候我们想要把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,这里就出现了java的序列化的概念。 当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。

序列化:将 Java 对象转换成字节流的过程。

反序列化:将字节流转换成 Java 对象的过程。

序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

4、java内存结构

堆、栈。java所有对象都在堆中,当输出对象时,控制台会输出该对象所在堆中的地址。栈存储基本类型,方法。

5、面向对象是什么?

面向对象是一门开发语言的编程思想,它是将现实生活中的实例转变为代码的过程。

面向对象的3大特性是封装、继承、多态。

万物皆对象。类是一个模版(图纸),对象根据类创建(new)出来。

(1)封装

将不需要对外提供的内容都隐藏起来(隐藏private),对外提供一个公共的方法对其访问(public方法)。

(2)继承

子类继承父类,具有父类的属性、方法(不包含private修饰的)。当使用继承(extends)时需要注意,必须得有明确的子父类关系时,才可以使用。

(3)多态

对外的表现形式只有一种,但是内在却有多种的实现。多态就是同一个接口,使用不同的实例而执行不同的操作。

向上转型:子类对象能够转型成父类。动态绑定:对象引用根据传入对象不同发生改变。

因为多态的特点使java的程序具备更好的扩展性。

Java实现多态有三个必要条件:继承、重写、向上转型。只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。

6、重载与重写的区别

重载:在同一类中,方法名相同,参数不同。

重写:当父类的方法无法满足子类时,子类重写父类的方法。同名、同参、同返回值,并且访问权限不能缩小。

7、什么是抽象类?

使用abstract关键字修饰的类,叫做抽象类。抽象类无法直接创建对象,只能由导出类(子类)向上转型。

抽象类的作用就是定义子类的共同特征,但是他却不能够创建对象。

抽象类不一定要有抽象方法,但有抽象方法的类一定是抽象类。

8、什么是接口?

接口是一系列的方法声明,接口其实就是特殊的抽象类,接口的方法默认都是抽象方法,接口里面只有两样东西,要么是静态的常量,要么是抽象的方法,也就是说接口中不能有变量,也不能够有具体的方法。

接口用interface关键字声明,一个类实现接口的时候,可以实现一对多,实现类用implements关键字声明。

9、接口与抽象类的区别

  • 抽象类使用abstract关键字声明,接口使用interface关键字声明;
  • 抽象类中可以有构造器,接口中不能有;
  • 一个类只能继承一个抽象类,但可以实现多个接口;
  • 接口中的变量必须给出初始值,抽象类可以不给;

什么是泛型?

        把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。为什么需要泛型呢?早期Java是使用Object来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全。

有了泛型以后:

  • 代码更加简洁【不用强制转换】
  • 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】
  • 可读性和稳定性【在编写集合的时候,就限定了类型】

10、String类能不能被继承?为什么?

不能。 因为string类是被final修饰的类,final修饰过的类不能被继承、final修饰过的变量不能被修改

11、List集合和Set集合区别

  • List:有序、有下标、元素可重复。

  • Set:无序、无下标、元素不可重复。

  • Map:Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。

      这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。

(1)List的实现类

  • ArrayList:底层由数组构成,随机访问(查询)速度快,更新(增删改)速度慢。 增删慢,查询快

  • LinkedList:链表结构,更新速度快,随机访问速度慢。 增删快,查询慢

  • CopyOnWriteArrayList:线程安全的ArrayList。

  • Vector:虽然线程安全,但是效果极低,不要使用。

(2)List集合方法

  • add():添加元素

  • size():查询元素个数

  • clear():清空集合

  • isEmpty():判断集合是否为空

  • get():根据下标获取元素

  • remove():移除元素(指定对象、指定下标)

(3)Set集合实现类

  • HashSet:由哈希表(算法)组成,效率较高。

  • TreeSet:树型结构,能够进行排序。

  • LinkedHashSet:在HashSet的基础上添加了链表,用于保存元素的插入顺序。

  • CopyOnWriteArraySet:高并发下使用的Set集合。

(4)Map集合

Map集合(映射)以key、value形式存储数据。根据key取value的值。

  • HashMap:使用哈希表实现集合,比其他Map效率高。Java8之后底层是由数组+链表+红黑树;默认初始长度是16。并且每次自动扩展或是手动初始化时,长度必须是2的幂。HashMap的put()和get()的实现 ---> 来复习一波,HashMap底层实现原理解析

  • TreeMap:使用树型结构的集合,有排序功能。

  • LinkedHashMap:在HashMap基础上添加链表,记录元素的插入顺序。

  • ConcurrentHashMap:线程安全的Map集合。 为什么线程安全?JDK1.8之后的ConcurrentHashMap在JDK1.8版本中采用了CAS+synchronized的方法来保证并发,线程安全

  • Hashtable:旧类,虽然线程安全但是效率极差,不使用。

(5)Map集合方法

  • put():向Map中添加元素。(key,value)

  • get():根据key值获取对应的value值。

  • clear():清空集合。

  • isEmpty():判断集合是否为空。

  • size():获取集合大小。

  • remove():删除指定key值的元素。

  • keySet():获取集合中所有的key。

  • values():获取集合中所有的value。

(6)Collections和Arrays

Collections是集合框架的一个工具类,提供了很多对集合元素操作方法,比如排序等。Arrays是一个数组工具类,提供了很多对集合元素操作方法,经常会用到Arrays.toString()。

12、什么是线程?

进程是指一个内存中运行的应用程序(任务管理器显示),每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。

线程是指进程中的一个执行流程,一个进程中可以运行多个线程。

(1)线程实现方式

  • 继承Thread类,重写run方法。

  • 实现Runnable接口,重写run方法。

两种都有的话尽量使用实现接口,这样扩展性高,因为继承只能单继承

(2)线程生命周期

new(新建)-> Start(就绪)-> Running(运行)->Blocked(阻塞)->Dead(死亡)

什么时候会遇到阻塞?(等待或休眠状态中)

  • wait()等待:需要将其唤醒(notify())才能执行。
  • sleep()休眠:线程会休眠指定的时间,时间到达后会进入准备就绪状态。

(3)同步锁synchronized

synchronized可以保证方法或者代码块在运行时,同一时刻只有一个线程可以进入同步代码块中,同时它还可以保证共享变量的内存可见性。

(4)怎么保证线程的安全性?

        要保证线程安全,就必须保证线程同步。保证线程的可见性有序性原子性。

  • 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作
  • 可见性:一个线程对主内存的修改可以及时地被其他线程看到
  • 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序

        因此,只要一段满足上述三个条件,我们就可以说该代码是线程安全的。那么,Java中提供了如下解决方案:

  1. 使用线程安全类,如:java.util.concurrent包下的类

  2. 使用sychronized关键字

  3. 使用并发包下Lock相关锁

(5)多线程---Thread类Runnable接口区别

继承Thread类是多个线程分别完成自己的任务,实现Runnable接口是多个线程共同完成一个任务。

实现Runnable接口比继承Thread类所具有的优势:

  • 适合多个相同的程序代码的线程去处理同一个资源
  • 可以避免java中的单继承的限制
  • 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

(6)什么情况下会出现死锁?

当多个线程同步时,获得锁的顺序不一致,导致线程相互等待的情况,称为死锁。

如何避免死锁?   

保证锁的顺序都一致。

13、Java异常

Throwable类有两个直接子类:

(1)Exception:出现的问题是可以被捕获的

(2)Error:系统错误,通常由JVM处理

14、Java创建对象有几种方式?

java中提供了以下四种创建对象的方式:

(1)new创建新对象

(2)通过反射机制

(3)采用clone机制

(4)通过序列化机制

15、final有哪些用法?

(1)final修饰的类不可以被继承

(2)final修饰的方法不可以被重写

(3)final修饰的变量值不可被更改

16、Java 中 IO 流分为几种?

(1)按照流的流向分,可以分为输入流和输出流;

(2)按照操作单元划分,可以划分为字节流和字符流;

(3)按照流的角色划分为节点流和处理流。

InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。

17、父类的静态方法能否被子类重写?

不能.重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏。

18、Object中有哪些公共方法?

equals(),clone(),getClass(),notify(),notifyAll(),wait(),toString

19、Java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。

20、普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

21、什么是跨平台性?原理是什么

       所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。

      实现原理:Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序。

22、什么是字节码?采用字节码的最大好处是什么

      字节码:Java源代码经过虚拟机编译器编译后产生的文件(即扩展为.class的文件),它不面向任何特定的处理器,只面向虚拟机。

      采用字节码的好处:

      Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。

23、什么是Java程序的主类?应用程序和小程序的主类有何不同?

      一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。

24、static的使用

      static是被类的实例对象所共享,因此如果 某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量 。

      因此比较常见的static应用场景有:

    (1)修饰成员变量 (2)修饰成员方法 (3)静态代码块 (4)修饰类【只能修饰内部类也就是静态内部类】 (5)静态导包

      static注意事项

      静态只能访问静态。 非静态既可以访问非静态的,也可以访问静态的。

25、抽象类能使用 final 修饰吗?

      不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类

26、hashCode 与 equals

      hashCode()介绍:

      hashCode方法标识对象的唯一性。hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。

     当equals方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规约定。

      euqals用于判断对象的属性是否相等。

      java规定:
  如果两个对象的hashCode()相等,那么他们的equals()不一定相等。
  如果两个对象的equals()相等,那么他们的hashCode()必定相等。

27、Java的反射机制和使用场景

      反射是Java的一种机制,可以让我们在运行时获取类的信息
      通过反射我们可以获取到类的所有信息,比如它的属性、构造器、方法、注解等  
      适用于需要动态创建对象的场景

28、静态代理和动态代理的区别

静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

动态代理:在程序运行时运用反射机制动态创建而成。

29、Java常用的包有哪些?

  • java.lang包,最基础的包、核心类库。常用类有String、Math、Thread、Object、包装类Integer、Character等,常用接口有Runnable、Iterable、Comparable。
  • java.util包,实用工具包。常用类有Arrays、Scanner、Random、HashSet、HashMap、ArrayList、Date等,常用接口有Collection、Set、List等。
  • java.io包,提供数据输入输出。常用类有File、FileInputStream、Reader等提供文件、字节输入输出的类。
  • java.net包,为网络连接提供服务。常用类有Socket、ServerSocket、URL等。
  • java.sql包,连接数据库的包。要实现jdbc类库。
  • java.awt、(javax.awt)包,创建用户界面、绘图的。常用类有Button、Panel、(JButton、JPanel)等。

30、Java代码执行流程

将Java文件通过编译器编译成.class字节码文件,再通过Java解释器将字节码文件翻译成机器语言,最后运行显示结果。(二次编译)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值