一读小说 » 都市言情 » 蓝星文娱:从微末崛起的娱乐大亨 » 第二十一章:Java基础面试题篇的核心19问《编程与面试2024》

第二十一章:Java基础面试题篇的核心19问《编程与面试2024》

    本期主题:

    3天掌握《Java编程与面试2024》的核心篇章19问,即Java基础面试题篇19问。

    下面,先来介绍一下,本篇章的核心19问:

    1、Java语言,有哪些特点?

    2、char类型变量,是否能保存一个汉字?

    3、==和equals的区别?

    4、final、finally、finalize的区别?

    5、一个.java源文件中,是否可以包含多个类(不是内部类)呢?又有什么限制呢?

    6、&与&&的区别?

    7、JAVA中的保留字,都有什么?

    8、Collection和Collections的区别?

    9、如何去掉Vector集合中的重复元素?

    10、ArrayList和Vector的区别?

    11、HashMap和Hashtable的区别?

    12、说说ArrayList,Vector,LinkedList三者的存储性能和特性?

    13、HashMap与TreeMap的区别?

    14、List、Map、Set三个接口,在存储元素时,各有什么特点?

    15、在Java中,List是个接口,那实现List接口的类有哪些,它们又有什么区别?

    16、判断下列语句是否正确,如果有错误,请指出错误所在?

    17、A=10,B=20使得两值互换?

    18、只移动一个数字,使62-63=1成立(不能移动符号)?

    19、字符串面试的经典源码示例?

    ......

    1、Java语言,有哪些特点?

    答:

    简单性(Simple);

    结构体系中立(ArchitectureNeutral);

    面向对象(ObjectOriented);

    易于移植(Portable);

    分布式(Distributed);

    高性能(HighPerformantce);

    多线程(Multithreaded);

    健壮性(Robust);

    动态性(Dynamic);

    安全性(Secure)。

    ...

    2、char类型变量,是否能保存一个汉字?

    答:可以。

    在Java语言中,一个char类型变量占16位bit(即2个字节byte)的存储空间。

    由于Java语言,使用Unicode字符集对字符进行编码...

    因此,char类型变量可以存储任何字符;

    这些字符,可以是英文字符、汉字、日文片断,以及其它国家的许多字符。

    相关详细知识点:

    在计算机中的存储单位,是以字节为单位的。

    常见的磁盘大小和文件大小,分别以GB、MB、KB等来表示...

    它们之间的换算单位是1GB=1024MB,1MB=1024KB,1KB=1024byte(即字节)。

    每个字节的取值范围是-128到127,它可以保存一个英文字符,包括字母、数字和英文标点。

    而汉字的存储,是由2个字节保存的。

    因为汉字的数量太多,它的编码范围,远远超过一个字节的取值范围...

    所以,必须要使用双字节来表示。在Java语言中...

    使用Unicode字符集,对字符进行编码,可以存储65535个字符。

    所以Java字符类型,被定义为双字节。

    因此,在Java语言中,可以使用char类型变量,来存储汉字。

    ...

    3、==和equals的区别?

    答:有2点区别,即...

    (1)==,是用于比较基本数据类型的值,以及比较引用数据类型,在内存中存放的地址。

    (2)equals方法,在比较引用数据类型时...

    如果没有覆盖Object类的equals方法,则同==一样,比较内存中的存放地址;

    反之,则像String字符串等类的equals方法一样,去比较引用数据类型的内容了。

    ...

    4、final、finally、finalize的区别?

    答:

    final,用于声明属性,方法和类...

    分别表示属性不可变,方法不可覆盖,类不可继承。

    \tfinally,是异常处理语句结构的一部分,表示总是执行。

    finalize,是Object类的一个方法...

    在垃圾收集器执行的时候,会调用被回收对象的此方法;

    可以覆盖此方法,以提供垃圾收集时的其它资源回收,例如关闭文件等。

    ...

    5、一个.java源文件中,是否可以包含多个类(不是内部类)呢?又有什么限制呢?

    答:可以包含多个类。

    但,只能有一个public类,且public的类名,必须与文件名一致。

    ...

    6、&与&&的区别?

    答:主要有点区别,即...

    (1)&和&&都可以用作逻辑与(and)运算;

    (2)&&还具有短路的功能;

    (3)&还可以按位运算。

    下面,详细说明下以上3点区别:

    (1)&和&&用作逻辑与运算符

    &和&&,都可以用作逻辑与的运算符,表示逻辑与(and)。

    当运算符,两边表达式的结果,都为true时...

    整个运算结果才为true;

    否则,只要有一方为false,则结果为false。

    (2)&&有短路功能

    &&除了可作逻辑与运算符外,还具有短路的功能...

    即如果第一个表达式为false,则不再计算第二个表达式。

    例如,对于if(str!=null&&!str.equals(“”))表达式...

    当str为null时,后面的表达式不会执行;

    所以不会出现NullPointerException空指针异常。

    而如果将&&改为&,此时则会抛出NullPointerException异常了。

    在If(x==33&++y>0)中,y会增长;

    而在If(x==33&&++y>0)中,则不会增长。

    (3)&用作位运算符

    &还可以用作位运算符。

    当&操作符两边的表达式,不是boolean类型时...

    &表示“按位与”操作。

    我们通常使用0x0f,来与一个整数进行&运算...

    来获取该整数的最低4个bit位。

    例如,“0x31&0x0f”的结果为“0x01”。

    ...

    7、JAVA中的保留字,都有什么?

    答:goto,const。

    关键字Keyword:

    Java的关键字,对Java的编译器有特殊的意义...

    它们用来表示一种数据类型,或者表示程序的结构等。

    保留字Reservedword:

    保留字,是为java预留的关键字。

    它们虽然现在没有作为关键字,但在以后的升级版本中,有可能作为关键字。

    ...

    8、Collection和Collections的区别?

    答:主要2点区别,即...

    (1)Collection是集合类的上级接口,继承于它的主要接口有List和Set;

    (2)Collections是针对集合类的一个帮助类...

    它提供了,一系列静态方法,以实现对各集合的搜索、排序、线程安全化等操作。

    ...

    9、如何去掉Vector集合中的重复元素?

    答:有两种方式可以去掉Vector集合中的重复元素。

    下面,我来具体说说这两种方式...

    方式一:

    VectornewVector=newVector;

    for(inti=0;i
    Objectobj=vector.get(i);

    if(!ntains(obj)){

    newVector.add(obj);

    }

    }

    方式二:

    HashSetset=newHashSet(vector);

    因为,HashSet集合中允许存在重复元素。

    ...

    10、ArrayList和Vector的区别?

    答:两者的同步性和数据增长不同。

    一、同步性不同

    Vector是线程安全的,也就是同步的。

    而ArrayList,则是线程不安全的,不是同步。

    二、数据增长不同

    当需要增长时,Vector默认增长为原来的一倍。

    而ArrayList,却是原来的一半。

    ...

    11、HashMap和Hashtable的区别?

    答:两者主要有三点区别,即...

    一、历史来源不同

    Hashtable,是基于陈旧的Dictionary类的。

    而HashMap,则是Java1.2引进的Map接口的一个实现类。

    二、同步性不同

    Hashtable是线程安全的,也就是同步的。

    而HashMap,不是线程安全的,不是同步的。

    三、是否允许“空值”不同

    只有HashMap,可以让你将一个空值,作为一个表条目的key或value。

    ...

    12、说说ArrayList,Vector,LinkedList三者的存储性能和特性?

    答:

    ArrayList和Vector,都是使用数组方式存储数据...

    此数组元素数,大于实际存储的数据,以便增加和插入元素。

    它们都允许,直接按序号索引元素...

    但插入元素,要涉及数组元素移动等内存操作;

    所以,索引数据快,而插入数据慢。

    Vector,由于使用了synchronized方法(线程安全)...

    通常在性能上,较ArrayList差。

    而LinkedList,是使用双向链表实现存储的...

    按序号索引数据,需要进行前向或后向遍历;

    但插入数据时,只需要记录本项的前后项即可,所以插入速度较快。

    ...

    13、HashMap与TreeMap的区别?

    答:

    HashMap是通过hashcode,对其内容进行快速查找的。

    而TreeMap中所有的元素,都保持着某种固定的顺序。

    所以,如果你需要得到一个有序的结果...

    那么,你就应该使用TreeMap。

    因为,HashMap中元素的排列顺序,是不固定的。

    ...

    14、List、Map、Set三个接口,在存储元素时,各有什么特点?

    答:

    1)List是有序的Collection…

    使用此接口,能够精确的控制每个元素插入的位置。

    用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素…

    这类似于Java的数组。

    2)Set是一种不包含重复的元素的Collection…

    即任意的两个元素e1和e2都有e1.equals(e2)=false。

    此外,Set最多有一个null元素。

    3)Map接口…

    请注意,Map没有继承Collection接口。

    Map是提供了key到value的映射。

    …

    下面,让我来具体说说…

    List、Map、Set,是Java中常用的三种集合接口。

    它们在存储元素时,各自具有不同的特点:

    1)List接口

    具有5个特点,即有序性,可重复性,可变性,元素类型,操作方法。

    有序性:

    List集合中的元素,按照插入顺序进行存储…

    可以通过索引,去访问和操作集合中的元素。

    可重复性:

    List集合中,允许存储重复的元素…

    即同一个元素可以多次出现在集合中。

    可变性:

    List集合中的元素,可以随时增加、删除和修改,集合的大小可以动态改变。

    元素类型:

    在List集合中,可以存储任意类型的元素…

    包括基本数据类型和引用类型。

    操作方法:

    List集合,提供了丰富的方法,来操作集合中的元素…

    比如添加、删除、获取元素,查找元素等。

    2)Map接口

    具有5个特点,即键值对存储,键的唯一性,值的可重复性,键和值的类型,单向一对一关系。

    键值对存储:

    Map用于保存具有映射关系的数据…

    即Key-Value对(双列元素)。

    键的唯一性:

    Map中的key不允许重复,每个key都唯一对应一个value。

    值的可重复性:

    Map中的value可以重复,即多个key可以对应相同的value。

    键和值的类型:

    Map中的key和value,可以是任何引用类型的数据。

    单向一对一关系:

    Map中key和value之间,存在单向一对一关系…

    即通过指定的key,总能找到对应的value。

    3)Set接口

    具有5个特点,即无序性,元素的互异性,空集性质,元素类型,测试归属性。

    无序性:

    Set集合中的元素位置无顺序,元素之间是无序的。

    元素的互异性:

    Set集合不允许出现重复元素,每个元素只能出现一次。

    空集性质:

    空集是一切集合的子集,Set也可以表示空集。

    元素类型:

    Set集合中可以存储任意类型的元素。

    测试归属性:

    Set最常被用于测试归属性…

    可以很容易地查询某个对象,是否在某个Set中。

    综上所述:

    List、Map、Set三种接口,在存储元素时的主要区别…

    在于元素的顺序性、重复性、以及存储结构(List是有序列表,Map是键值对映射,Set是无序集合)。

    所以,在实际使用中,我们可以根据需求…

    去选择合适的集合类型,来存储和处理数据。

    …

    15、在Java中,List是个接口,那实现List接口的类有哪些,它们又有什么区别?

    答:

    在Java中,List确实是一个接口…

    它属于Java的集合框架(JavaCollectionsFramework)。

    List接口定义了一些基本的操作,比如添加、删除元素等。

    有很多类实现了List接口,诸如ArrayList、LinkedList、Vector等等。

    这些实现类之间的主要区别,在于三者的内部实现机制和性能特性:

    1)ArrayLis

    ArrayList内部基于数组实现…

    因此它提供了,对元素的随机访问(即通过索引访问)的高效性。

    当添加或删除元素时…

    如果列表的大小,超过了其内部数组的大小,ArrayList会自动扩容;

    这可能会涉及到数组元素的复制;

    因此,在大量添加或删除元素时,可能会产生较高的开销。

    在大部分情况下,ArrayList是List接口的首选实现…

    特别是,当你需要频繁地,访问列表中的元素时。

    2)LinkedLis

    LinkedList内部基于链表实现…

    因此它提供了,在列表开头和结尾,添加或删除元素的高效性。

    对于随机访问元素…

    LinkedList的性能较差,因为它需要从列表的一端开始遍历。

    因此,如果你需要…

    频繁地在列表的开头或结尾,添加或删除元素的话…

    那么LinkedList,可能是一个更好的选择。

    3)Vector

    Vector和ArrayList类似…

    也是基于数组实现的,但它提供了线程安全的操作。

    这是通过在每个公共方法上,添加同步来实现的…

    因此,它可能会比ArrayList慢。

    在现代Java编程中,我们通常更倾向于使用并发集合(如ConcurrentHashMap)…

    或者,显式地同步代码块;

    而不是使用Vector,因为同步的开销可能会比较大。

    此外…

    还有其它一些类,也实现了List接口,例如CopyOnWriteArrayList…

    它适用于读多写少的并发场景。

    至于选择哪个实现类,则取决于你的具体需求,比如访问模式、线程安全性、性能要求等。

    …

    16、判断下列语句是否正确,如果有错误,请指出错误所在?

    Lista=newArrayList;

    a.add(5);

    答:正确。

    在Java中,你可以创建一个ArrayList,它存储的元素类型是Short。

    Short是Java的一个包装类,用于表示基本数据类型short的值。

    当你调用“a.add(5);”时…

    Java会自动将基本数据类型“int的5”,转换成包装类型Short。

    因为,5在short的范围内(即-32768到32767)。

    所以,可以安全地转换为Short。

    因此,这段代码会成功地向ArrayList中…

    添加一个Short类型的对象,其值为5。

    这是自动装箱(autoboxing)的一个例子…

    它是Java5及以上版本,提供的一个特性;

    允许在基本数据类型,和它们对应的包装类之间,进行自动转换。

    …

    17、A=10,B=20使得两值互换?

    答:

    1)中间变量:C=A;A=B;B=C

    2)A=A-B;B=B+A;A=B-A

    …

    18、只移动一个数字,使62-63=1成立(不能移动符号)?

    答:2的6次方-63=1。

    注意:要从“移动一个数字”的思维中抽离出来,考虑次方实现。

    …

    19、字符串面试的经典源码示例?

    答:具体代码示例如下…

    packagecom.exam.prj.action.String;

    /**

    *@authorAARON

    */

    publicclassStringTest{

    \tpublicstaticvoidmain(String[]args){

    \t\t//

    \t\t//判断生成几个对象

    \t\t//\t\

    \t\t//生成2个对象.StringPool中生成一个对象“aaron”,Heap中生成一个对象“aaron”

    \t\tStringstrA=newString(“aaron“);\t\

    \t\t//未生成新对象.判断StringPool中是否存在“aaron”,存在则strB直接引用“aaron”对象

    \t\tStringstrB=“aaron“;

    \t\

    \t\t//生成1个对象.在Heap中生成一个对象“aaron”

    \t\tStringstrC=newString(“aaron“);

    \t\

    \t\tSystem.out.println(strA==strB);\t//\tfalse

    \t\tSystem.out.println(strA==strC);\t//\tfalse

    \t\tSystem.out.println(strB==strC);\t//\tfalse

    \t\t//intern返回在StringPool中存在的地址

    \t\tSystem.out.println(strA==strA.intern);\t//\tfalse

    \t\tSystem.out.println(strB==strB.intern);\t//\ttrue

    \t\tSystem.out.println(strA.intern==strC.intern);\t//\ttrue

    \t\t//

    \t\t//判断字符串变量的内存地址是否相等

    \t\t//

    \t\

    \t\tStringaaron=“aaron“;

    \t\tStringaa=“aa“;

    \t\tStringron=“ron“;

    \t\

    \t\t//“aa“+“ron“,这是两个字符串常量相加,拼接结果为“aaron”,然后到StringPool中判断获得内存地址

    \t\tSystem.out.println(aaron==“aa“+“ron“);//true

    \t\

    \t\t//“aa“+ron,这是字符串常量和变量相加,拼接结果为“aaron”,然后在Heap中创建一个“aaron”对象

    \t\tSystem.out.println(aaron==“aa“+ron);//false

    \t}

    }

    ......

    以上,就是今天的分享啦!

    希望,对你的求职面试,编程工作有那么一点点、一丢丢、一戳戳地帮助哈~

    喜欢我分享的,就一键三连于我,可好?!