Day02

1. 请你说说String类,以及new和字符串直接量的区别

  1. String类是Java中最常用的API,它包含了大量处理字符串的方法,比较常用的有:char charAt(int index):返回指定索引处的字符;String substring(int beginIndex,int endIndex):从此字符串中截取一部分子字符串;String[] split(String regex):以指定的规则将此字符串分割成数组; String trim():删除字符串前导和后置的空格;int indexOf(String str):返回子串在此字符串首次出现的索引;int lastIndexOf(String str):返回子串在此字符串最后出现的索引;boolean startsWith(String prefix):判断此字符串是否以指定的前缀开头;boolean endsWith(String suffix):判断此字符串是否以指定的后缀结尾;String toUpperCase():将此字符串中所有的字符大写;String toLowerCase():将此字符串中所有的字符小写;String replaceFirst(String regex,String replacement):用指定字符串replacement替换第一个匹配的子串regex;String replaceAll(String regex,String replacement):用指定字符串替换所有的匹配的子串。
  2. String类是用final修饰的,所以它不能被继承。创建字符串有两种方式,一种是使用字符串直接量,另一种是使用new关键字;
  3. 当使用字符串直接量的方式来创建字符串时,JVM会使用常量池来管理这个字符串;当使用new关键字来创建字符串时,JVM会先使用常量池来管理字符串直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象会被保存在堆内存中。
  4. 对比来说,采用new的方式会多创建出一个对象来,占用了更多的内存,所以建议采用直接量的方式来创建字符串。

2. String、StringBuffer、Stringbuilder有什么区别

  1. Java中提供了String,StringBuffer,StringBuilder三个类来封装字符串,并且提供了一系列方法来操作字符串对象。String是一个不可变类,也就是说,一个String对象创建之后,直到这个对象销毁为止,对象中的字符序列都不能被改变。StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer对象被创建后,我们可以通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法来改变这个字符串对象的字符序列。当通过StringBuffer得到期待中字符序列的字符串时,就可以通过toString()方法将其转换成String对象。
  2. StringBuider类是JDK1.5中新增的类,他也代表了字符串对象。和StringBuffer类相比,它们都有共同的父类AbstractStringBuider,二者无论是构造器还是方法都基本相同,不同的一点是,StringBuilder没有考虑线程安全问题,也正因如此,StringBuider比StringBuffer性能略高。因此,如果是在单线程下操作大量数据,应优先使用StringBuilder类;如果是在多线程下操作大量数据,应优先使用StringBuffer类

3. 请你说说==与equals()的区别

  1. ==和equals都是Java中判断两个变量是否相等的方式,如果判断的是两个基本类型的变量,并且两者都是数值类型(比如float和double),只要两个变量的值相等就会返回True。
  2. 对于连个引用变量,只有它们指向同一个引用时,==才会返回True。==不能用于比较类型上没有父子关系的两个对象,比如Animal类和Dog类可以比较,但是Dog类和Cat类不能用==比较,编译器会报错,而且也没有比较的意义。
  3. equals方法是object类提供的一个实例方法,所以所有的引用变量都能调用equals方法来判断他与其他引用变量是否相等,但是如果没有重写equals方法的话,使用这个方法来判断两个引用对象是否相等的标准与==没有任何区别,它依然要求两个引用变量指向同一个对象才会返回True
  4. 所以我们希望自定义判断相等标准的同时,可以通过重写equals方法来实现。重写equals方法时,相等条件是由业务要求决定的,因此equals方法的实现也是由业务要求决定的

4. 请你说说hashCode()和equals()的区别,为什么重写equals()就要重写hashCode()

  1. hashCode()方法主要用途是获取哈希码,equal()主要用来比较两个对象是否相等。二者之间有个约定,如果两个对象相等,它们必须有相同的hash码;但如果两个对象的哈希码相同,它们却不一定相等。
  2. Object类提供的equals方法默认是用==来进行比较的,也就是说只有两个对象是同一个对象时,才能返回相等的结果。而实际业务中,我们通常的需求是,若两个不同的对象它们的内容是相同的,就认为它们相等。鉴于这种情况,Object类中的equals方法的默认实现是没有使用价值的,所以通常都要重写。
  3. 由于hashcode()与equals()具有联动关系,所以equals()方法重写时,通常也要将hashcode()进行重写,使得这两个方法始终满足相关约定

5. 请你讲一下Java 8的新特性

  1. Lambda表达式:该特性可以将功能视为方法参数,或者将代码视为数据。使用Lambda表达式,可以更简洁地表示单方法接口(称为功能接口)的实例。
  2. 方法引用:方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与Lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
  3. Java8对接口进行了改进:允许在接口中定义默认方法,默认方法必须使用default修饰。
  4. 新添加的StreamAPI支持对元素流进行函数式操作。Stream API集成在Collections API中,可以对集合进行批量操作,例如顺序或并行的map-reduce转换。
  5. Date Time API:加强对日期与时间的处理
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏