当前位置:网站首页 > Java基础 > 正文

java基础提高



一、面向对象编程(高级)

1、类变量和类方法 static

               也称为静态变量和静态方法

        ①类变量

             基本介绍:

        类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。  

        注意:static变量是同一个类所有对象共享,并且在类加载的时候就生成了。jdk7之前存放在方法区,之后存放在堆区。类变量放在一个内存空间,大家都是在这个内存空间访问的类变量。

        如何定义类变量:              访问修饰符    static     数据类型      变量名;

        如何访问类变量:              对象名 . 类变量名;   

 
类变量使用注意事项和细节讨论:

对于6,我们不需要创建对象,直接 类名.类变量名 便能使用类变量。

②类方法

       基本介绍:

        类似于类变量,类方法也叫静态方法。

        如何定义类变量:              访问修饰符    static     数据返回类型      方法名(){ }  

        如何访问类变量:              对象名 . 类方法名  or  类名 . 类方法名

        类方法的使用:
 

        当方法中不涉及到任何和对象相关的成员,则可以将方法设计成静态方法,提高开发效率。

     比如工具类utils当中的方法。

     我们在开发途中,往往将一些通用的方法设计成静态方法,比如排序、打印数组等等。

类方法使用注意事项和细节讨论:

        对于2,普通方法不能通过类名来调用,需要先创建对象再调用。

        对于4,注意是不能在类方法中使用this和super之类的和对象有关的关键字,因为static是所有对象共享的,而使用了对象的关键字则是针对某个对象的。

        对于5,类方法不能访问成员变量和成员方法,静态方法只能访问静态成员。

        总结:

                 静态方法,只能访问静态成员;

                 非静态方法,可以访问所有的成员;

                 在编写代码时,仍要遵守访问权限规则。

2、理解main方法语法  static

        ①main语法说明

        ②main语法特别说明

(1) 在 main()方法中,我们可以直接调用 main 方法所在类的静态方法或静态属性

(2) 但是,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静、

态成员。

3、代码块

①基本介绍       

       也可以说是,只有方法体的方法

        基本语法           

        对于1,可选指的是,可以写,可以不写。

②代码块的好处

        (1)相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化操作。

        (2)如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性。

        (3) 下面是代码块入门

 

      运行结果:

        从运行结果能够看出来代码块是先于构造器被调用。

        并且无论调用哪一个构造器,每创建对象都会先调用代码块。

③代码块使用注意事项和细节讨论

          对于1,我们可以把静态代码块看成一次性道具,只要用了一次就无法再用了

        对于2,在我们new一个对象时,类会被加载,并且如果是new的子类对象的话,父类也会跟着被加载,也就是父类的静态代码块也会执行。我们直接调用静态成员的时候,类也会被加载,静态代码块也会执行。        了解2后,我们就知道静态代码块什么时候执行了。

        对于3,调用静态成员,普通代码块不会跟着执行。

调用顺序就是1、2、3。

        属性初始化就是,定义属性的那条语句包括了给该属性赋值,如    private  static  int n = 10;

        对于4,我们看看代码

 

        我们再看运行结果

在优先级一样的情况下,那么调用的顺序取决于你定义的顺序。也就是说,我们先看①②③的优先级顺序然后再看定义的顺序。(静态>普通>构造器0 )

        先super再调用代码块,就是父类的调用完了才能轮到子类。

        对于6,

        静态的属性和代码块永远是优先级最高的,这其中父类比子类更先执行。

        子类的静态的属性和代码块比父类的普通属性和代码块优先级高。

        同优先级按定义顺序执行。

        对于7,有点类似于类方法。

4、单例设计模式

        ①什么是设计模式?

                (1)静态方法和属性的经典使用。

                (2java基础提高)设计模式是大量的实践中总结和理论化之后优选的代码结构、编程风格、已经解决问题的思考方式。

            什么是单例模式?(单个的实例的意思)

                (1)所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

                (2)单例模式有两种方式:饿汉式与懒汉式。

        ②单例模式的实现——饿汉式

                (1)对构造器私有化

                (2)类的内部创建对象

                (3)向外暴露一个静态的公共方法             

 

 饿汉式就是可能还没有用到这个对象,但是已经把对象创建好了,很着急就饿汉。

        ③单例模式的实现——懒汉式

        (1)仍然构造器私有化
        (2)定义一个 static 静态属性对象
        (3)提供一個 public 的 static 方法,可以返回一個 Cat 对象

 

        懒汉式,只有当用户使用 getInstance 时,才返回 cat 对象,后面再次调用时,会返回上次创建的 cat 对象。保证只会创造这么一个对象

        懒汉式跟饿汉式不同的是懒汉式把创建对象放在了方法中,而不是作为成员。

        ④两者的对比

        ⑤小结

5、final 关键字

        ①基本介绍

        加上这个关键字,就让类、属性、方法或者是局部变量成为最后一个,不能被继承或者修改或者重写。

        ②final 使用注意事项和细节讨论

        对于1,这是个命名规范,最好遵守。

        对于2,

 

        对于3,用final修饰的静态的属性不能在构造器中赋值。 因为在类加载的时候静态属性就已经被赋初始值了,再进行到构造器因为是final修饰过的所以不能二次赋值。

        对于4和5,final修饰只是不能修改,不代表不能使用。

        对于5,这个类已经不能继承了,那就说明无法写出子类来重写方法,所以没必要再final修饰方法。

6、抽象类

        ①基本介绍

       设计模式用到的比较多。

        ②抽象类使用的注意事项和细节讨论

        对于2,抽象类还可以有实现的方法。

        对于3,抽象类可以没有抽象方法,但是抽象方法必须在抽象类中。

        对于5,抽象类的本质还是一个类,一个类能够拥有的抽象类也可以有。

        对于6,抽象方法不能有方法体。

        对于7,父亲债务没完成,孩子就必须得偿还,父类的抽象方法,子类要完成实现(只要有方法体就算是实现)。到子类实现这个方法时就要去掉abstract了。

        对于8,static关键字和方法重写无关。

        ③抽象类的**实践-模板设计模式

        基本介绍:

        抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。

        模板设计模式能解决的问题:

        我们利用动态绑定机制,那么我们在父类创造的通用方法中调用抽象方法(这个抽象方法是不确定的,所以才用通用方法调用它),这样我们只需要在子类中去实现这个抽象方法,然后利用动态绑定机制来使用通用方法。

 

        caculaterTime方法就是通用方法,job是抽象方法。

        我们在子类中实现job方法,在主类中访问通用方法,即

                A   a  = new A();

                a.caculaterTime();由于动态绑定机制,通用方法中的job是实现后的方法。

7、接口

       usb插槽就是现实中的接口。

        ①基本介绍

在接口中,抽象方法可以省略abstract关键字。

默认实现方法需要用default关键字来修饰。比如

 

        ②注意事项和细节

        对于1,接口本身是一个抽象的概念,是希望让别的类去实现它,然后再去创建实现接口的类的实例。

        对于2,所以我们在接口中书写方法时,直接写返回值类型加方法名()即可

        对于3,idea有快捷键可以快速实现接口的所有方法,光标移到implements后的接口名字,然后 Alt+enter。这样防止接口有太多的方法我们要一 一实现很麻烦。

        对于4,接口实际上是更抽象的抽象的类。

        对于5,如下,并且两个接口的方法都要实现。

 

        对于6,接口的所有属性都要是公开的、静态的、final的,即public static final修饰符,接口的属性都是默认前面加上这一串,所以我们必须要初始化属性,因为有final。

        对于7,因为是静态的。

        对于8,接口与接口之间是继承,接口与类之间是实现

        ③接口对比继承

        我们可以这么理解,继承是生下来就有的,接口是别人告诉你方法,要你自己去学。所以我们说,接口是对单继承机制的一种补充。

 

小结:

        当子类继承了父类,就自动的拥有父类的功能

        如果子类需要扩展功能,可以通过实现接口的方式扩展

        可以理解 实现接口 是 对 java 单继承机制的一种补充.

        怎么理解 is a和like a    ,我们可以说,cat is a animal,但是不能说 cat is a fish,而是说cat like a fish。

        ④接口的多态特性

         对于1,利用向上转型和动态绑定就可以体现多态参数,另外抽象类也有多态。就是,我们可以用实现接口的类创建实例然后传递给接口。即编译类型是接口,运行类型是实现了该接口的类。

 

        对于2,我们演示案例

 

        对于3,多态传递就是,如果 B 继承了 A 接口,而 T 类实现了 B 接口 ,那么,实际上就相当于 T 类也实现了 A接口。

        ⑤一个小练习

        直接用System.....(x);输出x会造成混淆,不知道输出的x是接口A的还是父类B的。

 

8、内部类(重难)

        ①基本介绍

        基本语法

        

        内部类的分类

        ②局部内部类

 

        对于2,就是不能添加访问修饰符,但是可以用final修饰。(可以想想局部变量是怎么声明的)

        对于3,局部内部类就相当于一个局部变量,只不过这个局部变量的类型是一个类而已,所以作用域和局部变量一样在定义它的方法中,或者是在代码块中。 

        对于5,我们想访问内部类的方法,直接在作用域内,也就是在外部类用来定义局部内部类的方法中创建实例并访问,我们在主方法中调用外部类这个方法就会执行到那个实例。

        对于6,作用域不支持。

        对于7, Outer.this 本质就是外部类的对象, 即哪个对象调用了 m1, Outer.this 就是哪个对象,        System.out.println("n1=" + n1 + " 外部类的 n1=" + Outer.this.n1);

③匿名内部类(重中之重)

        基本介绍:

        它在我们底层的框架和以后的开发中用的非常多

 

上面是基于接口的匿名内部类。这个内部类是实现接口。

实际上,我们还可以使用基于类的匿名内部类。这个内部类是继承父类。

 

也有基于抽象类的匿名内部类。

 

       我们用匿名内部类主要是方便,这样我们就不需要大费周章的创建类然后实现或者继承才能实现或者重写方法,而是直接编写匿名内部类然后实现接口或者继承类。      

          使用细节:

        对于2,我们有两种调用方式

看第二个,new了一个对象,然后让a来接收,我们就能用a来调用其方法。而我们也能像第一个,用这个new出来的匿名内部类的匿名对象直接调用方法。

        对于3、4、5、6和7,匿名内部类的地位相当于局部变量。

        对于8,和局部内部类类似。

        匿名内部类的使用:

        我们可以直接用匿名内部类当作实参。(很好用)

传统方法我们要专门创建一个类然后实现或者继承,才能当作实参,而我们利用匿名内部类可以直接当作实参。

 

        ④成员内部类      

        基本介绍:

        成员内部类就是外部类的一个成员。        

        想要调用成员内部类的方法,我们直接在外部类中写一个成员方法。在里面创建内部类的对象然后调用,在外部其他类中,我们也只需要调用这个外部类的成员方法。

        使用细节:

        对于6,上面说了一种外部其他类访问成员内部类的方法,还有其他的

第一种和第三种用的多。

        ⑤静态内部类

        定义于成员位置且有static修饰

        对于1,静态还是只能访问静态的。

        对于6,有两种方式

 

        对于7,我们不需要加this了,因为访问的是静态成员。

        本章作业

二、枚举 注解

1、枚举介绍

 提出问题:

        要求创建 季节Season对象

        按照传统的方式,我们创建一个Season类,然后在主类中创建它的对象。可是这样的设计,不能体现季节只有四个固定的对象,因为我们可以创建无数个Season的对象。

如何解决:

        分析问题我们发现,季节的值是有限的几个值,且只读不需要修改。

于是可以使用枚举:

       (1)枚举属于一种特殊的类,里面只包含一组有限的特定的对象。

       (2)枚举是一组常量的集合。

       (3)枚举有二种实现方式:1,自定义类实现枚举 

                                                2,使用 enum 关键字实现枚举

2、自定义类实现枚举

        ①基本介绍:

我们利用自定义类实现枚举来解决上面的问题

 

        ②小结:进行自定义类实现枚举,有如下特点:

(1) 构造器私有化

(2) 本类内部创建一组对象[四个 春夏秋冬]

(3) 对外暴露对象(通过为对象添加 public final static 修饰符)

(4) 可以提供 get 方法,但是不要提供 set

3、enum关键字实现枚举

        ①如何使用enum关键字

在自定义类实现枚举的基础上对Seaon类改动,利用enum关键字实现

 

        ②enum 关键字实现枚举注意事项:

(1) 当我们使用 enum 关键字开发一个枚举类时,默认会继承 Enum 类, 而且开发的默认是 final 类

(2) 传统的 public static final Season2 SPRING = new Season2("春天", "温暖"); 简化成 SPRING("春天", "温暖"), 这里必 须知道,它调用的是哪个构造器.

(3) 如果使用无参构造器 创建 枚举对象,则实参列表和小括号都可以省略

(4) 当有多个枚举对象时,使用,间隔,最后有一个分号结尾 5) 枚举对象必须放在枚举类的行首

        ③Enum的成员方法

        从上面我们知道,使用枚举类会默认继承Enum类,所以我们要知道Enum类中有哪些方法我们可以使用。

        enum常用方法一览表:

(1) toString:Enum 类已经重写过了,返回的是当前对象 名,子类可以重写该方法,用于返回对象的属性信息

(2) name:返回当前对象名(常量名),子类中不能重写

(3) ordinal:返回当前对象的位置号,默认从 0 开始

(4) values:返回当前枚举类中所有的常量对象(这个方法返回的是个对象数组)

(5) valueOf:将字符串转换成枚举对象,要求字符串必须 为已有的常量名,否则报异常!用来匹配的,相当于查字典吧

(6) compareTo:比较两个枚举常量,比较的就是编号!(比较的形式有点像equals)

        ④enum 实现接口:

1) 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制。

2) 枚举类和普通类一样,可以实现接口,如下形式。

        enum 类名 implements 接口 1,接口 2{}

4、JDK内置的基本注解类型

        ①注解的理解:

(1) 注解(Annotation)也被称为元数据(Metadata),用于修饰解释 包、类、方法、属性、构造器、局部变量等数据信息。

(2) 和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息。

(3) 在 JavaSE 中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在 JavaEE 中注解占据了更重要的角 色,例如用来配置应用程序的任何切面,代替 java EE 旧版中所遗留的繁冗代码和 XML 配置等。

        ②基本的 Annotation 介绍

        使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用。用于修饰它支持的程序元 素

        三个基本的 Annotation:

(1) @Override: 限定某个方法,是重写父类方法, 该注解只能用于方法

(2) @Deprecated: 用于表示某个程序元素(类, 方法等)已过时

(3) @SuppressWarnings: 抑制编译器警告

        ③注解案例

(1)@Override注解

        如果你写了@Override 注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误。

        在真的重写了方法时,无论写没写@Override注解 对重写都没有影响。

        写这个的最重要的一点就是可以验证语法是否正确。

        @interface 表示一个 注解类。

(2)@Deprecated注解

        @Deprecated 修饰某个元素, 表示该元素已经过时,即不在推荐使用,但是仍然可以使用。

(3)@SuppressWarnings注解

在我们编写代码后,有些地方可能会出现黄色警告

1. 当我们不希望看到这些警告的时候,可以使用 SuppressWarnings 注解来抑制警告信息

2. 在{""} 中,可以写入你希望抑制(不显示)警告信息

 

3.可以指定的警告类型有

 

往{"  "}里面填你想要去掉的警告类型 ,而且里面可以填多个{"  ","  ", ... },因为该注解类有数组 String[] values()。

4. 关于 SuppressWarnings 作用范围是和你放置的位置相关

比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main

通常我们可以放置具体的语句, 方法, 类.

5、元注解:对注解进行注解      

        ①元注解的基本介绍

        JDK 的元 Annotation 用于修饰其他 Annotation 元注解: 本身作用不大,只需要看源码时可以知道他是干什么的。

        ②元注解的种类 (使用不多,了解, 不用深入研究)

(1) Retention //指定注解的作用范围,三种 SOURCE,CLASS,RUNTIME

(2) Target // 指定注解可以在哪些地方使用

(3) Documented //指定该注解是否会在 javadoc 体现

(4) Inherited //子类会继承父类注解

本章作业

       和上一章在一起

三、异常——Exception

        当抛出异常后,程序就退出,崩溃了 , 下面的代码就不在执行。以后写的软件体系十分庞大,程序不应该出现了一个不算致命的问题,就导致整个系统崩溃,这样的程序健壮性太差。

1、异常的概念

        编译时异常就是你没run的时候就已经提示错误,运行时异常就是你run了之后报错。

2、异常体系图

        绿色虚线是实现,蓝色实线是继承。

我们对异常体系图进行小结:

3、常见的异常

        ①常见的运行时异常包括:

(1) NullPointerException 空指针异常

        当应用程序试图在需要对象的地方使用 null 时,抛出该异常

 

(2) ArithmeticException 数学运算异常

        当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例

 

(3) ArrayIndexOutOfBoundsException 数组下标越界异常

        用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引.

 

(4) ClassCastException 类型转换异常 

        当试图将对象强制转换为不是实例的子类时,抛出该异常

 

5) NumberFormatException 数字格式不正确异常

        当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 => 使用异常我们 可以确保输入是满足条件数字.

 

        ②编译异常

编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。

        常见的编译异常

4、异常处理概念

        异常处理就是:当异常发生时,对异常的处理方式。

        ①异常处理的方式有两种:

        ②示意图

        try-catch-finally示意图

        throw示意图

5、try-catch异常处理

        ①try-catch 方式处理异常说明

        ②try-catch 方式处理异常的注意事项

        对于4,因为Exception是已经包含了所有的异常了,如果把它写在前面那么所有异常都会被它捕获,后面的catch语句就没有意义了。

 

        没catch,那运行完finally里面的语句就退出程序了。

        ③练习

        如果有finally语句块,那么它是必须要执行的,所以catch中的return不会立马返回而是临时保存这个值temp = 3,到finally后会把这个值改掉。所以打印的是4。

        ④try-catch-finally 执行顺序小结

6、throws

        ①基本介绍

       异常列表就是在throws后面写多个异常。

        ②注意事项和使用细节

        对于2,你不用try catch也会有默认的throws将异常向上抛出,就是声明的方法默认的有throws关键字,但是不会给你看到。

        对于3,子类的重写方法异常不能比父类的还大,扩大了异常的范围就会报错

        ③面试问题

 
 

7、自定义异常

        当程序中出现了某些错误,但是该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计yy异常类,用于描述该错误信息。

        ①自定义异常步骤

        把自定义异常做成 运行时异常,好处是,我们可以使用默认的处理机制,比较方便。

        ②例子

 

8、throw和throws的对比

本章作业

四、常用类

1、包装类(Wrapper)

        ①包装类的分类

(1) 针对八种基本数据类型相应的引用类型—包装类

(2) 有了类的特点,就可以调用类中的方法。

        ②包装类和基本数据的转换(装箱与拆箱)

 

        手动自动本质上是一样的。自动只是底层帮你调用方法。

        ③小测验(含面试题)

第二题,三元运算符要看做一个整体,输出的结果是转为最高精度的类型,面试。

        ④包装类型和String类型相互转换

 

        ⑤Integer类和character类的常用方法

输出

        ⑥integer类面试题

        解释

 

        还有要注意,只要==两边有基本数据类型那么判断的就是两者的值。

        如int   a  =127;  integer  b =127;这时候a==b输出true。

2、String类

        ①String 类的理解

                对于1,String   name="jack";这里的jack'就是字符串常量

(5) String 类实现了

        接口 Serializable【String 可以串行化:可以在网络传输】

        接口 Comparable [String 对象可以比较大小]

(6). String 是 final 类,不能被其他的类继承

(7). String 有属性 private final char value[]; 用于存放字符串内容

所以我们会说字符串的本质还是char数组

(8). 一定要注意:value 是一个 final 类型, 不可以修改(地址而非字符):即 value 不能指向 // 新的地址,但是单个字符内容是可以变化

        ②创建 String 对象的两种方式

        字符数组可以通过创建String对象来转变为字符串;

        char[] chars= {'2','a'};

        String str = new String(chars);

        ③字符串 的对象特性

        因为string是final类,所以常量池中没有haha那就直接创建一个,而不是去修改helllo(只读),两个对象都是字符串常量对象。前面讲到value数组说不能改地址的,是说的堆中String对象中的属性value的地址不能变,这里变的是栈中String引用的指向,它没有在堆中创建空间,也就没有value,即没有new(用的方式二创建string对象)

        说到底,这个题目的目的是让我们知道,字符串不可变,会留在常量池内。

        经过上一道题,我们会自然的想到这里创建了三个对象分别是hello、abc和helloabc,但是实际上编译器会做出优化,即不创建hello和abc而是直接创建helloabc

        编译器不会做这么没效率的事。

        我们主要分析 c = a+ b。底层是先创建StringBuilder sb = newStringBuilder();

                                                执行sb.append("hello");再执行sb.append("abc");

                                                最后String  c = sb.toString();完成

        最后c指向堆中的String类型对象,它的value数组又指向常量池中的helloabc。

于是我们得到一个规则:

        String c = "ad" +"cb";常量相加,看的是池

        String c = a + b;        变量相加,是在堆中

        输出 hsp and hava

        为什么不是java and hava呢?在chang方法内,str和成员变量中的str都指向同一个string对象空间,然而方法内的str的指向被更改为常量池中的java常量,但是并没有影响到堆里的str。

但是我们在主函数中引用的还是堆里的str,也就是指向string空间再指向hsp。

        ④String类的常见方法

 String类的常见方法一览:(知道怎么用即可)

第一组

 

第二组

 

3、StringBuffer和StringBuilder类

        ①StringBuffer结构

1. StringBuffer 的直接父类 是 AbstractStringBuilder

2. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化

3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final , 该 value 数组存放 字符串内容,引出存放在堆中的

4. StringBuffer 是一个 final 类,不能被继承

5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除) // 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String

         而每次String类的更新,实际上是在堆中new了一个新的String对象,这个对象的value属性指向了常量池中新的字符串常量,因此效率较低

第四个,让你实参的字符串的长度再加上16

        ②StringBuffer与String的转换

 代码演示:

 

        ③StringBuffer的常用方法

注意都是不含end;insert是把内容放在那个索引的位置,原先的往后推移。

代码演示

 

        append方法如果传入实参是null,那么会变成null字符串(被底层调用的是 AbstractStringBuilder 的 appendNull方法)。‘       

        ④StringBulider结构        

单线程操作StringBuilder是最好选择,优先采用指的是单线程情况

        StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用  StringBuilder

        StringBulider的方法

        StringBuilder和StringBuffer的方法是一样的,所以StringBuffer怎么使用,StringBuilder就怎么使用

        ⑤String、StringBuffer 和 StringBuilder 的比较

String虽然效率低但是复用率高,就是可以重复指向创建过的字符串,但是我们大量修改字符串就不能用String,因为会极大影响程序性能。

        ⑥认识到三者的差异后,总结怎么选择使用记住

4、Math类

        ①基本介绍

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

        ②常用方法

代码演示

 

5、Date日期类、Calendar日历类以及新的日期

     对于日期类我们只需知道怎么查怎么用不需要把每个方法背下来

        ①第一代日期类

代码演示

 

        ②第二代日期类

代码演示:

 

        ③第三代日期类

所以看第三代日期类:

DateTimeFormatter 格式日期类:(是对LocalDateTime或者另外两个的对象进行格式化)

Instant 时间戳:

第三代日期类更多方法:(实际上还有很多其他的,需要的时候查看API)

代码演示:

 

6、System类

System 类常见方法

对于(2),比起Array的copyOf两者是一样的效果,只不过System的更加底层。

代码演示:

 

7、Arrays类

和Math类一样都是静态方法

对于(2),我们需要利用模拟排序来理解

 

利用冒泡排序是为了更好理解sort的定制排序,实际上底层是二叉树排序而非冒泡。

一般的使用其实是:  

 

对于(3),

1. 使用 binarySearch 二叉查找,返回下标

2. 要求该数组是有序的. 如果该数组是无序的,不能使用 binarySearch

3. 如果数组中不存在该元素,就返回 return -(low + 1); 即这个数应该存在的位置的下标加1取反

对于(4),

1. 从 arr 数组中,拷贝 arr.length 个元素到 newArr 数组中

2. 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null字符串

3. 如果拷贝长度 < 0 就抛出异常 NegativeArraySizeException

4. 该方法的底层使用的是 System.arraycopy()

对于(5),可以理解成是替换原来的元素,执行后是[ 99,99,99 ]

对于(6),

1. asList 方法,会将 (2,3,4,5,6,1)数据转成一个 List 集合

2. 返回的 asList 编译类型 List(接口)

3. asList 运行类型 java.util.Arrays#ArrayList, 是 Arrays 类的

8、BigInteger类和BigDecimal类

        ①基本介绍

        当我们编程中,需要处理很大的整数,long 不够用时,可以使用 BigInteger 的类来搞定

同样,当我们需要保存一个精度很高的数时,double 不够用时,可以是 BigDecimal。

        ②BigInteger 和 BigDecimal 常见方法

BigInteger代码演示

 

BigDecimal代码演示                

 

我们看到数据是以字符串形式放进去的。而且他们都是实例,那么值也要由实例接收

本章作业

版权声明


相关文章:

  • java基础 java高级面试2025-04-04 13:02:02
  • java基础入门高中2025-04-04 13:02:02
  • java常见基础笔试2025-04-04 13:02:02
  • 咸宁java基础2025-04-04 13:02:02
  • java语言基础教程2025-04-04 13:02:02
  • java基础接口构造2025-04-04 13:02:02
  • java基础-总结2025-04-04 13:02:02
  • java高级基础书2025-04-04 13:02:02
  • 黑马java基础资料2025-04-04 13:02:02
  • java语录基础教学2025-04-04 13:02:02