【Java】每日小结(内含常见面试知识)

简介: 【Java】每日小结(内含常见面试知识)

今日学习总结🎐🎐🎐


一、Java StringBuffer 和 StringBuilder 类🎋🎋🎋


当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。


和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。



在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。


特点: 封装了char[]数组,是可变的字符序列,提供了一直可以对字符串进行修改的方法

StringBuilder非线程安全,同步处理,始于jdk1.5

StringBuffer:线程安全,并发处理,性能稍慢,始于jdk1.0

执行效率:StringBuilder>StringBuffer>String

常用方法:


方法名

说明

public StringBuffer append(String s)

将指定的字符串追加到此字符序列。

public StringBuffer reverse()

将此字符序列用其反转形式取代。

public delete(int start, int end)

移除此序列的子字符串中的字符。

public insert(int offset, int i)

将 int 参数的字符串表示形式插入此序列中。

replace(int start, int end, String str)

使用给定 String 中的字符替换此序列的子字符串中的字符。


代码示例:


package cn.tedu.day17;
public class Test_String2 {
    public static void main(String[] args) {
        String str = "好好学习java";
        /**
         * public StringBuilder(String var1) {
         *         super(var1.length() + 16);
         *         this.append(var1);
         *         内部字符数组默认初识容量为16,if>16扩容
         */
        StringBuilder sb = new StringBuilder(str);//将str内容复制到StringBuilder里面,
        //追加
        sb.append("为了月薪过万");//好好学习java为了月薪过万
        //replace()替换部分内容
        sb.replace(10,sb.length(),"改变世界");//好好学习java为了改变世界
        //delete()删除部分内容
        sb.delete(8,14);//好好学习java   删除下标7-13,含头不含尾
        //insert()插入操作
        sb.replace(0,1,"我要");//我要好学习java
        //reverse()
        // 将此字符序列用其反转形式取代。
        sb.reverse();//avaj习学好要我
        System.out.println(sb);
    }
}


二、日期工具类Date🎏🎏🎏


概述:类 Date 表示特定的瞬间,精确到毫秒。,java.util 包提供了 Date 类来封装当前的日期和时间。


常用方法摘要:


方法

说明

long getTime()

返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

int getMonth()

获取当前月份(+1)

toLocaleString()

获取当前时间 yyyy-MM-dd hh:mm:ss

int getDay()

获取当前天

int getHours()

获取当前小时

int getMinutes()

获取当前分钟

int getSeconds()

获取当前秒数

String toString( )

把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。


获取当前日期时间


import java.util.Date;
public class DateDemo {
   public static void main(String[] args) {
       // 初始化 Date 对象
       Date date = new Date();
       // 使用 toString() 函数显示日期时间
       System.out.println(date.toString());
   }
}


SimpleDateFormat 格式化日期 🎏🎏🎏


SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");


把String类型的日期转化为Date类型,


SimpleDateFormat 类有一些附加的方法,特别是parse(),它试图按照给定的SimpleDateFormat 对象的格式化存储来解析字符串。


Demo: 输入生日求活了多少天


public static void method2() throws ParseException {
        Scanner scanner = new Scanner   (System.in);
        System.out.println("请输入你的生日");
        String birthday = scanner.nextLine();
        //long start = d.getTime()+32*365*24*60*60*1000;//毫秒
        //吧String类型的日期转化为Date类型
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date birthday1 = sdf.parse(birthday);
           //获取毫秒值
        long time = birthday1.getTime();//获取出生时的毫秒数
        long currentTime = System.currentTimeMillis();//1970到现在的毫秒数
        System.out.println((currentTime - time)/24/60/60/ 1000);//单位:天
    }


三、包装类:🎋🎋🎋


包装类:java中定义了8个包装类,目的是为了解决基本数据类型不能直接参与面向对象的开发问题

Integer、Character、Byte、Short、Long、Float、Double、Boolean

Character和Boolean继承自Object,其余六个都是继承自java.lang.Number

Number:是数字包装类的抽象父类


包装类Integer🎋🎋🎋

int 的包装类 Integer

Integer i0;//Integer以对象的形式存在,默认值null

Integer i1 = new Integer(1);//Integer


底层逻辑:


public Integer(int var1) {
        this.value = var1;
    }


方法

说明

static Integer valueOf(int i)

返回一个表示指定的 int 值的 Integer 实例。

static int parseInt(String s)

将字符串参数作为有符号的十进制整数进行解析。


自动拆箱,装箱🎋🎋🎋

装箱:把基本数据类型转换为对应包装类类型

拆箱:把包装类型转换为对应的基本数据类型

自动装箱底层发生的代码:Integer.valueOf(127); int -->Integer


public static void main(String[] args) {
        // - 装箱:把基本数据类型转换为对应包装类类型
        Integer i = Integer.valueOf(100);
        Integer ii =100;//自动装箱Integer.valueOf(100);
        //- 拆箱:把包装类型转换为对应的基本数据类型
       /* ii = ii.intValue()+200;
        System.out.println(ii);*/
        ii+=200;//内部隐含ii.intValue()
        System.out.println(ii);
        Integer iii = null;
        if(iii!=null){
            iii+=300;//NullPointerException//内部隐含ii.intValue(),所以null掉对象,会触发空指针异常
        }
    }


Integer iii = 5;//iii 是引用数据类型,5是基本数据类型,引用了包装类的地址

int a = iii;//编译器自动完成拆箱:从包装类型的值,自动变成基本数据类型的值


四、==与equals的区别✨✨✨


1.当使用== 比较时,如果相比较的两个两个变量是引用数据类型,那么比较的是两者的物理地址(内存地址),

如果相比较的两个变量是基本数据类型,那么比较的是具体数值是否相等;


2.当使用equals比较时,比较的结果实际上取决于equals方法的具体实现


3. 任何类都是继承自Object类,因此所有类都具有Object类的特性,比如String,Integer等

它们在自己的类中重写了equals方法,此时它们比较的就是内容是否相同,而在Object了类的默认实现中,

equals方法的底层是通过== 实现的


五、精度缺失处理方法:🎊🎊🎊


BigDecimal:常用来解决精确的浮点数运算


方法

说明

BigDecimal add(BigDecimal augend)

返回一个 BigDecimal,其值为 (this + augend),其标度为 max(this.scale(), augend.scale())。

BigDecimal negate()

返回 BigDecimal,其值为 (-this),其标度为 this.scale()。

BigDecimal multiply(BigDecimal multiplicand)

返回一个 BigDecimal,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。

BigDecimal divide(BigDecimal divisor, RoundingMode roundingMode)

返回一个 BigDecimal,其值为 (this / divisor),其标度为 this.scale()。


在除法中:
divisor - 此 BigDecimal 要除以的值。
scale - 要返回的 BigDecimal 商的标度。
roundingMode - 要应用的舍入模式。


代码示例:


package cn.tedu.day17;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
/**
 * 本类用来测试浮点数运算时不精确的解决方案
 */
public class Test_BigDecimal {
    public static void main(String[] args) {
        //method1();
        method2();
    }
    public static void method1(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要计算的两个小数");
        double a = sc.nextDouble();
        double b = sc.nextDouble();
        System.out.println(a+b);
        System.out.println(a-b);
        System.out.println(a*b);
        System.out.println(a/b);
    }
    public static void method2(){
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要计算的两个小数");
        double a = sc.nextDouble();
        double b = sc.nextDouble();
        /**
         * 创建工具类对象
         * 最好不要使用double类型作为构造函数参数,不然会产生精度丢失
         * 最好使用重载,参数类型是String类型的构造函数,double 转换成String ,直接拼接一个空字符串
         * BigDecimal(double val)不建议
         * BigDecimal(String val)建议,将String类型的字符串转化为BigDecimal
         */
        BigDecimal bd1 = new BigDecimal(a+"");
        BigDecimal bd2 = new BigDecimal(b+"");
        BigDecimal bd3;
        bd3 = bd1.add(bd2);//加法运算
        System.out.println(bd3);
        bd3 = bd1.subtract(bd2);//减法
        System.out.println(bd3);
        bd3 = bd1.multiply(bd2);//乘法运算
        System.out.println(bd3);
        bd3 = bd1.divide(bd2,3, RoundingMode.UP);//除法
        //第一个参数是要除以那个数,第二个是要保留的几位,第三个是舍入方式
        System.out.println(bd3);
        //divisor - 此 BigDecimal 要除以的值。
        //scale - 要返回的 BigDecimal 商的标度。
        //roundingMode - 要应用的舍入模式。
    }
}


目录
相关文章
|
23天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
61 2
|
11天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
35 14
|
28天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
29天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
86 4
|
2月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
110 1
Java面试题之Java集合面试题 50道(带答案)
|
2月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
59 5
|
2月前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
25 1
|
2月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
33 3