常见问题

【Object类、常用API】



简述String类中的equals方法与Object类中的equals方法的不同点。


String类中的equals方法是用来判断两个对象的内容是否相同,而Object 类中的equals方法是用来判断两个对象是否是同一个对象,所谓同一个对象指的是内存中的同一块存储空间。



简述StringBuilder类与String类的区别


String类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象,所以经常改变内容的字符串最好不要用String,因为每次生成对象都会对系统性能产生影响。
StringBuilder又称为可变字符序列,是JDK5.0中新增加的一个类,它是一个类似于String的字符串缓冲区,通过某些方法调用可以改变该序列的长度和内容。即它是一个容器,容器中可以装很多字符串,并且能够对其中的字符串进行各种操作。它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容,StringBuilder会自动维护数组的扩容。



Object类的toString方法


在Java中“System.out.println(类对象名);”实际输出的是该对象的toString方法返回的字符串,那括号中的内容等价于 类对象名.toString(),toString的好处是在碰撞到println方法时会被自动调用,不用显示的写出来。

  • 如果自己没有覆盖重写toString()方法,将自动继承Object中的toString()方法,将打印出来 getClass.getName() + “@” + Integer.toHexString(hashCode());
  • 若是覆盖了toString()方法,将打印出你自己的写的东西。


【Collection、泛型】



请简述集合框架


集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map。
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.util.Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有java.util.ArrayList和java.util.LinkedList,Set接口的主要实现类有java.util.HashSet和java.util.TreeSet。



请简述迭代器的实现原理


当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。



【List、Set】



请简述List接口的特点


它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元
素的存储就是按照11、22、33的顺序完成的)。
它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引
是一个道理)。
集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。



请简述HashSet去除重复元素的原理。


 调用被添加元素的hashCode(),和HashSet中已有元素的hashCode比较是否相同
 如果不相同,直接存储
 如果相同,调用equals方法比较是否相同
 不相同,直接存储元素
 相同,认为是同一元素.不存储



简述常见的数据结构中元素的存取特点。


 栈:stack,又称堆栈,对元素的存取特点是:先进后出。即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素。
 队列:queue,简称队,对元素的存取特点是:先进先出。即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素。
 数组:Array,是有序的元素序列,对元素的存取特点是:
1、查找元素快:通过索引,可以快速访问指定位置的元素
2、增删元素慢
(1)指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索 引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。
(2)指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复 制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。
 链表:linked list,对元素的存取有如下的特点:
1、多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的 右手拉住下个人的左手,依次类推,这样多个人就连在一起了。
2、查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素。
3、增删元素快:
增加元素:只需要修改连接下个元素的地址即可。
删除元素:只需要修改连接下个元素的地址即可。



简述Comparable和Comparator两个接口的区别。


 Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
 Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。



Map



请简述Map 的特点。


 Map每个元素由键与值两部分组成
 Map键不能重复,每个键对应一个值
 键和值可以为null



Entry键值对对象


说出Entry键值对对象遍历Map集合的原理。


Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map 中的一个Entry(项)。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。



【异常、线程】



异常的体系


问题:

  1. 请描述异常的继承体系
  2. 请描述你对错误(Error)的理解
  3. 请描述你对异常(Expection的理解)
  4. 请描述你对运行时异常(RuntimeException)的理解

答:

  1. 异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类:
    java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。
  2. Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。
  3. Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。
  4. 运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。


throw与throws的区别


问题:

  1. 请描述throw的使用位置,作用是什么?
  2. 请描述throws的使用位置,作用是什么?

答:

  1. throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。
  2. throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常对象抛给方法调用处。


异常的处理方式


问题:
1. 异常处理方式有几种,分别是什么?
2. 详细阐述每种方式对异常是如何处理的
答:

  1. 异常的处理方式有两种,分别是使用throws和try…catch…finally
  2. throws用在方法的声明上后接异常类名,是把异常抛给调用者进行处理
  3. try…catch…finally是捕获异常,自己处理,处理完毕后面的程序可以继续运行
    a) try代码块中是可能出现异常的代码
    b) catch代码块,是遇到异常,对异常进行处理的代码
    c) finally代码块是无论是否发生异常,都必须执行的代码,用于释放资源.


常见异常,及产生原因


问题:请列举常见异常,并说明产生原因。

答:
NullPointerException:空指针异常
当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度等等。
ArrayIndexOutOfBoundsException:数组索引越界异常
当对数组的索引值为负数或大于等于数组大小时抛出此异常。
ArithmeticException:算术运算异常
程序中出现了除以零这样的运算就会出这样的异常,对这种异常,大家就要好好检查一下自己程序中涉及到数学运算的地方,公式是不是有不妥了。
NumberFormatException:数字格式异常
当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。



并行、并发概念


问题:请简单描述什么是并行,什么是并发?

答:
并行:指两个或多个事件在同一时刻发生(同时发生)。
并发:指两个或多个事件在同一个时间段内发生。
通俗易懂版:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不 支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以它们最关键的点就是:是否是『同时』。



进程概念、线程概念、线程与进程联系


问题:请描述什么是进程,什么是线程,进程与线程之间的关系,并举例说明。

答:
进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
一个程序运行后至少有一个进程,一个进程中可以包含多个线程,但一个进程中至少包含一个线程。比如使用迅雷软件下载网络文件时,同时下载多个文件,就使用到了多线程下载。



你可能感兴趣的:(基础)