java基础常见面试题

1.八种基本数据类型的大小,以及他们的封装类。

2.equals与==的区别

使用==比较原生类型如:boolean、int、char等等,使用equals()比较对象。

(1)==是判断两个变量或实例是不是指向同一个内存空间。 equals是判断两个变量或实例所指向的内存空间的值是不是相同。

(2)==是指对内存地址进行比较。 equals()是对字符串的内容进行比较。

(3)==指引用是否相同。 equals()指的是值是否相同。

3.HashCode的特性

https://blog.csdn.net/seu_calvin/article/details/52094115

(1)HashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,HashCode经常用于确定对象的存储地址;

(2)如果两个对象相同, equals方法一定返回true,并且这两个对象的HashCode一定相同;

(3)两个对象的HashCode相同,并不一定表示两个对象就相同,即equals()不一定为true,只能说明这两个对象在一个散列存储结构中。

(4)如果对象的equals方法被重写,那么对象的HashCode也尽量重写。

如何理解HashCode的作用:

从Object角度看,JVM每new一个Object,它都会将这个Object丢到一个Hash表中去,这样的话,下次做Object的比较或者取这个对象的时候(读取过程),它会根据对象的HashCode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。若HashCode相同再去调用equal。

4.ArrayList、LinkedList、Vector的区别

List的三个子类的特点

ArrayList:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程不安全,效率高。

Vector:

  • 底层数据结构是数组,查询快,增删慢。
  • 线程安全,效率低。
  • Vector相对ArrayList查询慢(线程安全的)。
  • Vector相对LinkedList增删慢(数组结构)。

LinkedList

  • 底层数据结构是链表,查询慢,增删快。
  • 线程不安全,效率高。

Vector和ArrayList的区别

  • Vector是线程安全的,效率低。
  • ArrayList是线程不安全的,效率高。
  • 共同点:底层数据结构都是数组实现的,查询快,增删慢。

ArrayList和LinkedList的区别

  • ArrayList底层是数组结果,查询和修改快。
  • LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢。

共同点:都是线程不安全的

List有三个子类使用

  • 查询多用ArrayList。
  • 增删多用LinkedList。
  • 如果都多ArrayList。

5.String、StringBuffer、与Stringbuilder的区别。

String:适用于少量的字符串操作的情况。

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况。 

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况。

StringBuilder:是线程不安全的,而StringBuffer是线程安全的。

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

再来说线程安全

在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

6.Map、Set、List、Queue、Stack的特点与用法

Map

  • Map是键值对,键Key是唯一不能重复的,一个键对应一个值,值可以重复。
  • TreeMap可以保证顺序。
  • HashMap不保证顺序,即为无序的。
  • Map中可以将Key和Value单独抽取出来,其中KeySet()方法可以将所有的keys抽取正一个Set。而Values()方法可以将map中所有的values抽取成一个集合。

Set

  • 不包含重复元素的集合,set中最多包含一个null元素。
  • 只能用Lterator实现单项遍历,Set中没有同步方法。

List

  • 有序的可重复集合。
  • 可以在任意位置增加删除元素。
  • 用Iterator实现单向遍历,也可用ListIterator实现双向遍历。

用法

  • 如果涉及堆栈,队列等操作,建议使用List。
  • 对于快速插入和删除元素的,建议使用LinkedList。
  • 如果需要快速随机访问元素的,建议使用ArrayList。

7.HashMap和HashTable的区别

(1)HashTable :Synchronize同步的,线程安全;HashMap:线程不安全。

(2)Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。

(3)HashTable效率低;HashMap效率高。

(4)两者的遍历方式大同小异,Hashtable仅仅比HashMap多一个elements方法。

8.Java(OOP)面向对象的三个特征与含义

封装(高内聚低耦合 -->解耦)

封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。在java中能使用private、protected、public三种修饰符或不用(即默认defalut)对外部对象访问该对象的属性和行为进行限制。

java的继承(重用父类的代码)

继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。

java中的多态(父类引用指向子类对象)

多态是指父对象中的同一个行为能在其多个子对象中有不同的表现

有两种多态的机制:编译时多态、运行时多态

1、方法的重载:重载是指同一类中有多个同名的方法,但这些方法有着不同的参数。,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。

2、方法的重写:子类可以覆盖父类的方法,因此同样的方法会在父类中与子类中有着不同的表现形式。

9.Override和Overload的含义去区别

重载 Overload方法名相同,参数列表不同(个数、顺序、类型不同)与返回类型无关。 重写 Override 覆盖。 将父类的方法覆盖。 重写方法重写:方法名相同,访问修饰符只能大于被重写的方法访问修饰符,方法签名个数,顺序个数类型相同。

Override(重写)

  • 方法名、参数、返回值相同。
  • 子类方法不能缩小父类方法的访问权限。
  • 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。
  • 存在于父类和子类之间。
  • 方法被定义为final不能被重写。

Overload(重载)

  • 参数类型、个数、顺序至少有一个不相同。
  • 不能重载只有返回值不同的方法名。
  • 存在于父类和子类、同类中。

而重载的规则

1、必须具有不同的参数列表。 2、可以有不同的返回类型,只要参数列表不同就可以了。 3、可以有不同的访问修饰符。 4、可以抛出不同的异常。

重写方法的规则

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。 2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。 3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)。 4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。

例如: 父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。

10.Interface与abstract类的区别

Interface 只能有成员常量,只能是方法的声明。 Abstract class可以有成员变量,可以声明普通方法和抽象方法。

interface是接口,所有的方法都是抽象方法,成员变量是默认的public static final 类型。接口不能实例化自己

abstract class是抽象类,至少包含一个抽象方法的累叫抽象类,抽象类不能被自身实例化,并用abstract关键字来修饰

11.java反射的作用于原理

什么是Java的反射呢?

Java 反射是可以让我们在运行时,通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。

这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

反射的作用?

反射就是:在任意一个方法里:

1.如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)

2.如果我还明确知道这个类里某个变量的名称,我还能得到这个变量当前的值。

3.当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。

反射机制主要提供了以下功能:

  • 在运行时判断任意一个对象所属的类。
  • 在运行时构造任意一个类的对象。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时调用任意一个对象的方法。
  • 生成动态代理。

反射的原理?

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现API有哪些?

反射的实现主要借助以下四个类:

Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象

12.解析XML的几种方式的原理和特点:DOM、SAX

Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别。

http://blog.csdn.net/cangchen/article/details/44034799

xml解析的两种基本方式:DOM和SAX的区别是?

DOM: document object model。
SAX: simple api for xml 。

dom一次性把xml文件全部加载到内存中遍历一个结构一模一样的树, 效率低。 SAX解析器的优点是解析速度快,占用内存少,效率高。

DOM在内存中以树形结构存放,因此检索和更新效率会更高。但是对于特别大的文档,解析和加载整个文档将会很耗资源。

DOM,它是生成一个树,有了树以后你搜索、查找都可以做。 SAX,它是基于流的,就是解析器从头到尾解析一遍xml文件,解析完了以后你不过想再查找重新解析。 sax解析器核心是事件处理机制。例如解析器发现一个标记的开始标记时,将所发现的数据会封装为一个标记开始事件,并把这个报告给事件处理器。

平时工作中,xml解析你是使用什么?

JDOM
DOM4J 

12.值传递和引用传递。

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 

引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象.  一般认为,java内的传递都是值传递.

原文地址:https://www.cnblogs.com/e-x-c-e-ption/p/11840937.html