面试题十道-01- 2021.11.25

1.java8加了哪些新特性?

答:jdk8引入了lambda表达式,lambda表达式实质上是一种匿名内部类,只是写法上简化了,他将原来繁琐的匿名内部类的形式缩减成较为简短的形式,由jvm进行还原,相对于匿名内部类,lambda表达式的书写形式更加简单便捷,更加便于我们使用。jdk8还引入了函数接口,四个常见的函数的接口为 有参无返回值的消费型接口,无参由返回值的供给型接口,有参有返回值的函数型接口,还有返回boolean类型的断言型接口。

同时jdk8又引入了方法引用和构造器引入,用类双冒号静态/非静态函数 对象双冒号函数的形式来代替了原来调用函数的引用形式。

jdk8也引入了stream流,stream流极大的简化了我们对数组元素的操作,他为我们提供了很多方法,并且在内部已经完成了本来应该由我们做的那些数组的迭代,极大的改善了我们的代码编写效率和代码整洁性。

同时jdk8也为我们提供了新的时间Api Localtime LocalDate LocalDateTime,这些新的api的加入解决了几个原本繁琐的问题:

  • 之前的Date类默认月份是从0开始计算的,而现在jdk8把他们加入到了枚举类型

  • 保证了线程安全:以前的java.util.Date和SimpleDateFormat都不是线程安全的而现在新的类型和String类型都是一样的,用final修饰,是不变的,保证了线程安全

2. 请你谈谈Java中是如何支持正则表达式操作的?

答:java的String类提供了很多关于正则表达式的操作方法,如matches(),replaceAll(),replaceFirst(),spilt()等方法,同时也可用Pattern类来储存Pattern.compile()方法制定的规则,以及用Matcher对象来记录符合条件的数据。

详细。如下

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());
        }
    }
}

3. 请你简单描述一下正则表达式及其用途?

答: 在处理字符串的程序里,我们经常会用到正则表达式,正则表达式用于制定相应的规则,便于我们进行匹配。在实际应用中,比如网页注册里的账号格式匹配,最常用的电话格式,身份证格式匹配,很多地方等能用到正则表达式的匹配功能,正则表达式真的十分强大。

4.请你描述一下hashmap的扩容原理

hashmap的长度默认是16,也就是说,允许数据的索引在0-15之间。当数据超过这个范围时,就需要扩容hashmap。hashmap的扩容是通过创建一个长度是他两倍的数组的方式实现的。

在1.8之前,扩容方式为用链表的形式将多出的数据储存hashmap里的元素,但这种方法很容易发生碰撞,当hash碰撞次数较多的时候,就会出现一个链表多数据查询的情况,它的效率不是我们想的那么高。

于是为了提高数据查询的效率,jdk1.8引入了红黑树机制。
红黑树是一种查询速度比链表快的数据结构,它采取空间换时间的策略n(logn),使得散列表效率提高。

当链表储存的数据达到8个以上时,hashmap会启动红黑树来储存数据

红黑树一般要满足以下特征:

  • 根节点时黑色节点,其他节点要么时黑色,要么是红色的。
  • 任何一个相邻的节点都不能是相同颜色的
  • 任何节点到达它可以到达的节点包含的节点数量都是相同的

红黑树的查找的时间复杂度较低,是O(logn),相对于AVL树,虽然AVL树也有着一样时间复杂度,但是它插入数据的操作是在过于繁琐,与之对比,红黑树的性能就好了很多。

5. 请你讲讲&和&&的区别?

&是按位与,&&是逻辑与。

二者的区别是,&用于二进制运算,进行二进制的与运算 相同为1 不同为0。

而&&则是逻辑与运算,是一种短路运算,必须前后都成立才能判定为真,若前面不成立,&&会直接短路运算,不去关后面的判断。否则会空指针异常。

6. int和Integer有什么区别?

int 和 Integer是包装和没有被包装的区别,Integer是int的包装类。java对八种基本的数据类型都进行了封装(Wrapper.class),

boolean > Boolean

int > Interger

long >Long

short >Short

byte>Byte

char> Character

float >Float

double> Double

jdk可以对这个封装进行自动包装/自动拆包,便于我们的日常使用。

 public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;                  // 将3自动装箱成Integer类型
        int c = 3;
        System.out.println(a == b);     // false 两个引用没有引用同一对象
        System.out.println(a == c);     // true a自动拆箱成int类型再和c比较
    }

7.String和StringBuffer的区别

String是个不变的字符序列,StringBuffer是个可变的字符序列。

String的对象是不变的,每次添加字符串就会生成一个String对象,每次更改都是改变地址而不是值,这种方式十分浪费内存,不被提倡。

而StringBuffer是可变的,他有自己的缓存区,每次添加字符串就是添加到缓存区里(16),缓存区满了会自动扩充

8. 请你讲讲数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?

答:Array用来储存基本数据类型和对象数据类型的数据,而ArrayList只能存储对象数据类型的数据。Array的大小是固定不变的,而ArrayList的大小不是固定的,可以通过许多方法来动态添加全部,删除全部,迭代器等方法。

如果想保存一个整个程序运行中都不变的数组,可以使用一个全局的数组储存。

如果只是想以数组的方式储存数据,较少进行添加,删除操作,可以使用ArrayList。

如果频繁的添加,删除操作数据,ArrayList就不太合适了。效率太低,建议使用LinkedList。‘

9. 请你解释什么是值传递和引用传递?

值传递是对基本类型而言的,值传递传递的是值,同样改变的只是传递得到的值,原来的值不变。

而引用传递传递的是该值的一个副本,传递的是地址,当传递的值改变的时候,原来被传递的对象的值也会改变。

10. 请你讲讲一个十进制的数在内存中是怎么存的?

以补码的形式储存

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值