1.1.1 Java基础1

 

题目来源:牛客网Java后台开发面试考点汇总

1.为什么重写equals还要重写hashcode?

hashcode是根据对象的内存地址经哈希算法得来的。并且有一些规定:

两个对象相等,hashcode一定相等(equal输出true)

两个对象不等,hashcode不一定不等(equal输出false)

hashcode相等,两个对象不一定相等(equal输出true)

hashcode不等,两个对象一定不等(equal输出false)

因此当equal的规则通过重写改变之后hashcode也要相应的进行重写满足对象相等或不等的规则。

详解1(转载): https://blog.csdn.net/u013679744/article/details/57074669

详解2(转载): https://blog.csdn.net/xl_1803/article/details/80445481

2.说一下map的分类和常见的情况

HashMap,HashTable,LinkedHashMap,TreeMapMap

HashMap:  hashcode(键)能找到对象存储的位置,速度快,顺序随机,不支持线程同步。允许一条记录的键为null,允许多条记录的值为null。

HashTable:不允许记录的键或值为空,支持线程同步,即任意时刻只能有一个线程写HashTable,写入速度慢。

LinkedHashMap:保持了记录的插入顺序,遍历数据与数据量有关(链表)。

TreeMapMap:有sortMap接口,可以实现数据排序。

详解(转载)https://blog.csdn.net/qq_39382769/article/details/88792554

3.Object若不重写hashCode()的话,hashCode()如何计算出来的?

Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。

相当于返回了内存地址

详解(转载) https://blog.csdn.net/jiulanhao/article/details/83307904

4.==比较的是什么?(引申出另一个问题也就是equals和==的区别)

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

          如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

             如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

              诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

详解(转载):https://www.cnblogs.com/dolphin0520/p/3592500.html

5.若对一个类不重写,它的equals()方法是如何比较的?

如题目5所总结的

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

6.java8新特性

详解(转载):https://www.cnblogs.com/onetwo/p/8526374.html

                         https://www.runoob.com/java/java8-new-features.html

                        https://blog.csdn.net/yitian_66/article/details/81010434

  • Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中。)

  • 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

  • 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。

  • 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。

  • Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。

  • Date Time API − 加强对日期与时间的处理。

  • Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。

  • Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。

7.说说Lamda表达式的优缺点。

缺点:

1.lambda的特点还在于开发成本高,并且异常难以排查。

2.它的异常堆栈比匿名内部类还要难懂。

3.若不用并行计算,很多时候计算速度没有比传统的 for 循环快。(并行计算有时需要预热才显示出效率优势,并行计算目前对 Collection 类型支持的好,对其他类型支持的一般)

优点:

1.简洁。

2. 非常容易并行计算。

3. 可能代表未来的编程趋势。

4. 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。java有针对递归的专门优化。

详解(转载):https://blog.csdn.net/robert_chen1988/article/details/78508322

                        https://bbs.csdn.net/topics/392155787?page=1

                         https://baike.1688.com/doc/view-d35947972.html

8.一个十进制的数在内存中是怎么存的?

以二进制补码形式存储,最高位是符号位,正数的补码是它的原码,负数的补码是它的反码加1,在求反码时符号位不变,符号位为1,其他位取反。

9.为啥有时会出现4.0-3.6=0.40000001这种现象?

原因简单来说是这样:2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。例如二进制系统中无法精确地表示分数1/10,这就好像十进制无法精确地表示分数1/3一样。

10.Java支持的数据类型有哪些?什么是自动拆装箱?

Java中有八种基本数据类型以及引用类型

基本数据类型:

byte(1字节),short(2字节),int(4字节),long(8字节),char(2字节),boolean(不确定,取值是true/false),float(4字节),double(8字节)

引用数据类型:

包括数组,集合,字符串,接口以及类等

自动装箱/自动拆箱

就是指基本数据类型可以和其对应包装类之间自动转换

基本数据类型    包装类
byte                    Byte
boolean           Boolean
short                  Short
char               Character
int                     Integer
long                   Long
float                   Float
double             Double

为什么需要包装类?
很多人会有疑问,既然Java中为了提高效率,提供了八种基本数据类型,为什么还要提供包装类呢?

这个问题,其实前面已经有了答案,因为Java是一种面向对象语言,很多地方都需要使用对象而不是基本数据类型。比如,在集合类中,我们是无法将int 、double等类型放进去的。因为集合的容器要求元素是Object类型。

为了让基本类型也具有对象的特征,就出现了包装类型,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

转载:https://www.cnblogs.com/qf123/p/8670326.html

          https://blog.csdn.net/wufaliang003/article/details/82347077

11.什么是值传递和引用传递?

值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

12.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

区别:

1.存储类型:Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。但是需要注意的是:Array数组在存放的时候一定是同种类型的元素。ArrayList就不一定了,因为ArrayList可以存储Object。
2.存储空间:Array大小是固定的,ArrayList的大小是动态变化的。
3.内置的方法:ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
4.对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

当能确定长度并且数据类型一致的时候就可以用数组,其他时候使用ArrayList。如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择ArrayList。

参考:https://www.cnblogs.com/yonyong/p/9323546.html

https://blog.csdn.net/x289231673/article/details/78485315

13.你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?

大O符号表示一个程序运行时所需要的渐进时间复杂度上界。
其函数表示是:
对于函数f(n),g(n),如果存在一个常数c,使得f(n)<=c*g(n),则f(n)=O(g(n));
大O描述当数据结构中的元素增加时,算法的规模和性能在最坏情景下有多好。
大O还可以描述其它行为,比如内存消耗。因为集合类实际上是数据结构,因此我们一般使用大O符号基于时间,内存,性能选择最好的实现。大O符号可以对大量数据性能给予一个很好的说明。 
转载:https://blog.csdn.net/qq_38977097/article/details/88826939

14.String是最基本的数据类型吗?

不是。

java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类

Java中的基本数据类型只有8个:boolean、char、byte、short、int、long、float、double;除了基本数据类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

那么String是一个引用类型,String是一个类

参考:https://blog.csdn.net/qq_36614534/article/details/80461294

            https://blog.csdn.net/vaychen/article/details/81110681

            https://blog.csdn.net/YuanMxy/article/details/74170775

15.int 和 Integer 有什么区别

基本类型与它的包装类的关系

1、Integer是int的包装类,int则是java的一种基本数据类型 

2、Integer变量必须实例化后才能使用,而int变量不需要 

3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 。

4、Integer的默认值是null,int的默认值是0

16.String 和StringBuffer的区别

1.首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。

StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

2. 再来说线程安全 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

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

3. 总结一下
  String:适用于少量的字符串操作的情况

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

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

参考:https://www.cnblogs.com/su-feng/p/6659064.html

17.我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?

 String tempStr = "";
 tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
 tempStr = tempStr.trim();

18.int和Integer有什么区别?

19.&和&&的区别?

(1)&&具有短路的功能,而&不具备短路功能。

对于:&   -- >  不管怎样,都会执行"&"符号左右两边的程序

对于:&& -- >  只有当符号"&&"左边程序为真(true)后,才会执行符号"&&"右边的程序。

(2)运算规则不同

对于:&  -- >  只要左右两边有一个为false,则为false;只有全部都为true的时候,结果为true

对于:&& -- > 只要符号左边为false,则结果为false;当左边为true,同时右边也为true,则结果为true

(3)&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如:0x31 & 0x0f的结果为0x01。

参考https://blog.csdn.net/qq_40369944/article/details/81531544

https://www.cnblogs.com/hongten/p/hongten_java_yu.html

20.在Java中,如何跳出当前的多重嵌套循环?

break只会跳出当前循环,当遇到多重循环的时候有两种解决方案

1.在第一层循环前面加标记  列入   first:  .然后   breank  first

2.在第一层循环中加入循环条件,内层循环的过程中改变循环条件导致第一层循环终止。

参考:https://www.cnblogs.com/zk753159/p/4966571.html

21.你能比较一下Java和JavaSciprt吗?

1)基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用;
2)解释和编译:Java 的源代码在执行之前,必须经过编译;JavaScript 是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行;
3)强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量声明,采用其弱类型。即变量在使用前不需作声明,而是解释器在运行时检查其数据类型;
4)代码格式不一样。

补充:上面列出的四点是原来所谓的标准答案中给出的。其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民。对于这种问题,在面试时还是用自己的语言回答会更加靠谱。

参考:https://blog.csdn.net/qq_42322624/article/details/80470170
22.简述正则表达式及其用途。

在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

正则表达式就是在进行字符串匹配和处理的时候最为强大的工具,绝大多数语言都提供了对正则表达式的支持。

 参考 :https://blog.csdn.net/weixin_33795833/article/details/89659935

 https://blog.csdn.net/troubleshooter/article/details/78391381

23.Java中是如何支持正则表达式操作的?

Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作.


import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
class RegExpTest {
 
    public static void main(String[] args) {
        String str = "北京市(朝阳区)(西城区)(海淀区)";
        Pattern p = Pattern.compile(".*?(?=\\()");
        Matcher m = p.matcher(str);
        if(m.find()) {
            System.out.println(m.group());
        }
    }
}

参考:https://blog.csdn.net/weixin_34273479/article/details/86956530

24.请你说说Java和PHP的区别?

PHP:开发效率非常高

JAVA:

(1),纯粹的面向对象,面向接口编程,各种设计模式让你玩得不亦乐乎。

(2),运行效率吊打PHP

(3),javaee开发的web项目,对象可以常驻内存,有真正的mysql和redis连接池

(4),强类型语言,保证代码规范

(5),有完善的开源社区支持,各种开源包让你玩得不亦乐乎

(6),做大数据开发,还是得用java,java对hadoop的支持比php好太多。

https://www.douban.com/group/topic/129873815/

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值