(1/100)

学习思路如下:

面试准备思路

一、JavaSE部分

❤1、Java基础——题目

1、为什么重写equals还要重写hashcode
2、说一下map的分类和常见的情况
3、Object若不重写hashCode()的话,hashCode()如何计算出来的?
4、==比较的是什么?
5、若对一个类不重写,它的equals()方法是如何比较的?
6、java8新特性
7、说说Lamda表达式的优缺点。
8、一个十进制的数在内存中是怎么存的?
9、为啥有时会出现4.0-3.6=0.40000001这种现象?
10、Java支持的数据类型有哪些?什么是自动拆装箱?
11、什么是值传递和引用传递?
12、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
13、你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么?
14、String是最基本的数据类型吗?
15、int 和 Integer 有什么区别
16、String 和StringBuffer的区别
17、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
18、int和Integer有什么区别?
19、&和&&的区别?
20、在Java中,如何跳出当前的多重嵌套循环?
21、你能比较一下Java和JavaSciprt吗?
22、简述正则表达式及其用途。
23、Java中是如何支持正则表达式操作的?
24、请你说说Java和PHP的区别?

答案部分:

1、为什么重写equals还要重写hashcode

答:
以下是关于hashcode的一些规定:
两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等

如果两个对象相同,则他们的哈希值(hashcode)一定相同
如果两个对象的哈希值相同(hashcode)相同,并不意味着他们是相同的
对于使用Hash散列方式存储对象的数据结构:HashSet、HashMap、HashTable等,仅仅重载equals方法可能会导致实际业务逻辑失败
在比较两个对象时,仅重载hashCode方法并不能强制Java忽略内存地址。

举例HashMap,hashcode用来确认在数组的哪个位置,equals用来判断对象是否相等(新元素则加入链表头部
在这里插入图片描述
重写equals不重写hashcode会出现什么问题
在存储散列集合时(如Set类),如果原对象.equals(新对象),但没有对hashCode重写,即两个对象拥有不同的hashcode,则在集合中将会存储两个值相同的对象,从而导致混淆。

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

答:
在这里插入图片描述
java为数据结构中的映射定义了一个接口java.util.Map,Map不允许键重复,但允许值重复
它有四个实现类,分别是HashMap,Hashtable,LinkedHashMap,TreeMap.

1.HashMap:
最常用的Map,根据键的hashcode值来存储数据,根据键可以直接获得他的值(因为相同的键hashcode值相同,在地址为hashcode值的地方存储的就是值,所以根据键可以直接获得值),具有很快的访问速度,遍历时,取得数据的顺序完全是随机的,HashMap最多只允许一条记录的键为null,允许多条记录的值为null,HashMap不支持线程同步,即任意时刻可以有多个线程同时写HashMap,这样对导致数据不一致,如果需要同步,可以使用synchronzied Map的方法使得HashMap具有同步的能力或者使用concurrent HashMap

2.HashTable:
与HashMap类似,不同的是,它不允许记录的键或值为空,支持线程同步,即任意时刻只能有一个线程写HashTable,因此也导致HashTable在写入时比较慢!

3.LinkedHashMap:
是HahsMap的一个子类,但它保持了记录的插入顺序,遍历时先得到的肯定是先插入的,也可以在构造时带参数,按照应用次数排序,在遍历时会比HahsMap慢,不过有个例外,当HashMap的容量很大,实际数据少时,遍历起来会比LinkedHashMap慢(因为它是链啊),因为HashMap的遍历速度和它容量有关,LinkedHashMap遍历速度只与数据多少有关

4.TreeMap:
实现了sortMap接口,能够把保存的记录按照键排序(默认升序),也可以指定排序比较器,遍历时得到的数据已排序

什么情况用什么类型的Map:
在Map中插入,删除,定位元素:HashMap
要按照自定义顺序或自然顺序遍历:TreeMap
要求输入顺序和输出顺序相同:LinkedHashMap

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

答: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法直接返回对象的 内存地址。

4、==比较的是什么?

答: 在Java中,变量的类型分为“基本类型”和“引用类型”。

基础类型 包括:boolean,char,short,int,long,float,double
引用类型:Map,…
但是引入类型中还有一些比较特殊的类型,被称之为 包装类型 :Boolean,Character,Short,Integer,Long,Float,Double。

== 是比较符,比较两边是否相等,总共分为三种情况:
1) 基本类型 == 基本类型:比较数值是否相等
2) 基本类型 == 包装类型:比较数值是否相等
3) 引用类型 == 引用类型:比较两个对象在内存中的地址是否相同

总结:==可以比较基本数据类型和引用类型,基本数据类型比较的是数值,在比较引用类型时,除了比较数值外,还要比较引用地址,两者都相等时,结果才是true。

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

答:
一般不重写equals方法,则和==一样直接比较地址。

有些类重写了equals方法,比如String类:
1)比较地址,相等则为同一个对象肯定相等
2)查看要比较的object是否是String类型,不是的话肯定不相等
3)要比较的object强转成String类型,挨个字符比较,有一个不一样就不相等

总结: 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

6、java8新特性

答:
1)接口的默认方法:在接口中新增了default方法和static方法,这两种方法可以有方法体
2)Lambda 表达式:Lambda表达式可以看成是匿名内部类,使用Lambda表达式时,接口必须是函数式接口
3)函数式接口:如果一个接口只有一个抽象方法,则该接口称之为函数式接口
5)Lambda 作用域
6)访问局部变量
7)访问对象字段与静态变量
8)访问接口的默认方法
9)Date API:Java 8 在包java.time下包含了一组全新的时间日期API
10)Annotation 注解

7、说说Lamda表达式的优缺点

答: java lambda表达式的优缺点:
优点:

  1. 代码简洁,开发迅速
  2. 方便函数式编程
  3. 非常容易进行并行计算
  4. java引入lambda,改善了集合操作(引入Stream API)

缺点:

  1. 代码可读性变差
  2. 使得语言学习曲线陡峭,学习难度提升
  3. 性能方面,在非并行计算中,很多计算未必有传统的for性能要高
  4. 不容易进行调试

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

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

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

答: 2进制的小数无法精确的表达10进制小数,计算机在计算10进制小数的过程中要先转换为2进制进行计算,这个过程中出现了误差。

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

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

基本数据类型:
整数值型:byte(1字节),short(2字节),int(4字节),long(8字节)
字符型:char(2字节)
浮点类型:float(4字节),double(8字节)
布尔型:boolean(不确定,取值是true/false)
整数默认int型,小数默认是double型,Float和long类型的必须加后缀。

引用数据类型:
包括数组,集合,字符串,接口以及类等

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

首先知道String是引用类型不是基本类型,引用类型声明的变量是指该变量在内存中实际存储的是一个引用地址,实体在堆中。引用类型包括类、接口、数组等。String类还是final修饰的。

而包装类就属于引用类型,自动装箱和拆箱就是基本类型和引用类型之间的转换,至于为什么要转换,因为基本类型转换为引用类型后,就可以new对象,从而调用包装类中封装好的方法进行基本类型之间的转换或者toString(当然用类名直接调用也可以,便于一眼看出该方法是静态的),还有就是如果集合中想存放基本类型,泛型的限定类型只能是对应的包装类型。

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

答:
1)值传递 是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量.
2)引用传递 是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。
小结: 一般认为,java内的基础类型数据传递都是值传递. java中实例对象的传递是引用传递

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

答:
1)存储内容比较:
Array 数组可以包含基本类型和对象类型,
ArrayList 却只能包含对象类型。
Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了,因为ArrayList可以存储Object。

2)空间大小比较:
Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。
ArrayList 的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。

3)方法上的比较:
ArrayList 方法上比 Array 更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。

适用场景:
(1)如果想要保存一些在整个程序运行期间都会存在而且不变的数据,可以将它们放进一个全局数组里, 但是如果单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便进行查找的话,就选择 ArrayList。

(2)如果需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,不适合使用 ArrayList,应考虑LinkedList。

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符号可以对大量数据性能给予一个很好的说明。

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

答: 不是

基本数据类型包括byte、int、char、long、float、double、boolean和short
除了基本类型,剩下的都是引用类型,枚举类型也是引用类型。

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

15、int 和 Integer 有什么区别

答:
1) Integer是int的包装类,int则是java的一种基本数据类型
2) Integer变量必须实例化后才能使用,而int变量不需要
3) Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4) Integer的默认值是null,int的默认值是0
5) int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换

16、String 和StringBuffer的区别

答:
String:
1)是对象不是原始类型。
2)为不可变对象,一旦被创建,就不能修改它的值。
3)对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去。
4)String是final类,即不能被继承。

StringBuffer:
1)是一个可变对象,当对它进行修改的时候不会像String那样重新建立对象。
2)它只能通过构造函数来建立,StringBuffer subffer=new StringBuffer();
3)对象被建立以后,在内存中就会分配内存空间,并初始保存一个null,通过它的append方法向其赋值 subffer.append(“hello word”);

总结:
1)StringBuffer对象实例化后,只对这一个对象操作;
2)字符串连接操作中StringBuffer的效率要明显比String高;
3)String对象是不可变对象,每次操作String都会建立新的对象来保存新的值。

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

答:String testStr = new String(str.getBytes(), “UTF-8”);

    public String translate (String str) {
        String tempStr = "";
        try {
            tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
            tempStr = tempStr.trim();
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
        return tempStr;
    }

.

18、&和&&的区别?

答:相同点:只要有一端为假,则语句不成立

1.&(1)按位运算符(2)逻辑运算符
作为逻辑运算符时,&左右两端条件式有一个为假就会不成立,但是两端都会运行,比如(1+2)=4 &(1+2)=3;1+2=4即使为假也会去判断1+2=3是否成立。

2.&&(1)逻辑运算符
&&也叫做短路运算符,因为只要左端条件式为假直接不成立,不会去判断右端条件式。

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

答:
1)在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如:

ok:
    for(int i=0;i<10;i++)    {
        for(int j=0;j<10;j++)  {
            System.out.println(“i=” + i + “,j=” + j);
            if(j == 5) break ok;
        }
    } 

2)让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] = {{1,2,3},{4,5,6,7},{9}};
boolean found = false;
for(int i=0;i<arr.length && !found;i++)    {
        for(int j=0;j<arr[i].length;j++){
            System.out.println(“i=” + i + “,j=” + j);
            if(arr[i][j]  == 5) {
                found = true;
                break;
            }
        }
    }

.

20、你能比较一下Java和JavaSciprt吗?

答: JavaScript 与Java是两个公司开发的不同的两个产品。
Java 是原Sun 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发,Java 的前身是Oak语言。
JavaScript 是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言,它的前身是LiveScript;

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

补充: 上面列出的四点是原来所谓的标准答案中给出的。其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民。

21、简述正则表达式及其用途。

答:在编写处理字符串的程序时,经常会有查找符合某些复杂规则的字符串的需要。它是用于描述这些规则的工具。
换句话说,正则表达式就是记录文本规则的代码。计算机处理的信息更多的时候不是数值而是字符串,正则表达式就是在进行字符串匹配和处理的时候最为强大的工具,绝大多数语言都提供了对正则表达式的支持。

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

答:
1) Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split();
2) 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());
        }
    }
}

.

23、请你说说Java和PHP的区别?

答: 多说无益,上链接:https://blog.csdn.net/i6448038/article/details/50352278

第1天(1/1)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值