Java——匿名内部类、Object类、Scanner类、String类、StringBuffer类、基本数据类型包装类和数组排序

简介: Java——匿名内部类、Object类、Scanner类、String类、StringBuffer类、基本数据类型包装类和数组排序

文章目录


匿名内部类

Object类

Objects类

Scanner类

String类

StringBuffer类

包装类


基本类型转换为String

包装类Integer类


数组排序


匿名内部类


匿名内部类时局部内部类的简写,使用代码如下:

public abstract class Animal {
    public abstract void eat();
}
public interface MyInterFace {
    public abstract void method();
}
public class Dog  {
    public Animal dshow(){
        return (new Animal() {
            @Override
            public void eat() {
                System.out.println("匿名内部类作为返回值");
            }
        });
    }
    public MyInterFace dshow1() {
        return (new MyInterFace() {
            @Override
            public void method() {
                System.out.println("匿名内部类作为返回值");
            }
        });
    }
}
public class Test {
    public static void main(String[] args) {
        //匿名内部类作为show()的形参第一种形式
        show(new Animal() {
            @Override
            public void eat() {
                System.out.println("匿名内部类直接作为方法的形参");
            }
        });
        System.out.println("-----------------------------------");
        //匿名内部类作为show()的形参第二种形式
        Animal an1=new Animal() {
            @Override
            public void eat() {
                System.out.println("匿名内部类间接作为方法的形参");
            }
        };
        show(an1);
        System.out.println("-----------------------------------");
        //匿名内部类作为返回值
        Dog dog=new Dog();
        Animal an2=dog.dshow();
        show(an2);
        System.out.println("-----------------------------------");
        Dog dog1=new Dog();
        MyInterFace my =dog1.dshow1();
        show1(my);
    }
    public static void show(Animal an){
        an.eat();
    }
    public static void show1(MyInterFace my){
        my.method();
    }
}


需要注意的是:向下转型


Object类


20190907215506735.png


在刚才IDEA自动重写equals代码中,使用到了java.util.Objects类,那么这个类是什么呢?


在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。


在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:


public static boolean equals(Object a, Object b):判断两个对象是否相等。

我们可以查看一下源码,学习一下:

public static boolean equals(Object a, Object b) {  
    return (a == b) || (a != null && a.equals(b));  
}


Scanner类


20190907215444295.png


String类


20190907220329445.png


注意:


(1)对String类的特点:字符串被创建,其值不在改变,改变的是其引用的值,利用内存图对其进行详解:

2019090722180573.png


(2)对String s=new String(“hello”)和String s1="hello"的区别,利用内存图展示:

20190907221826572.png

(3)理解好含左不含右的意义。


StringBuffer类


20190907222146756.png


(1)String和StringBuffer的相互转换,代码如下:

public class StringBufferTest2 {
    public static void main(String[] args) {
        //String-----StriingBuffer
        String str="sgjjlk";
        StringBuffer stringBuffer1 = new StringBuffer(str);
        StringBuffer stringBuffer2 = new StringBuffer().append(str);
        System.out.println(stringBuffer1);
        System.out.println(stringBuffer2);
        System.out.println("-------------------------------");
        //StringBuffer-------String
        StringBuffer s1 = new StringBuffer("cvhjbjk");
        String s2 = s1.toString();//toString()是转换为字符串输出
        System.out.println(s2);
        String s3 = s1.substring(0);//substring()截取字符串,返回的是字符串类型
        System.out.println(s3);
    }
}


(2)String和StringBuffer的作为形参的区别,代码如下:

public class StringBUffertest3 {
    public static void main(String[] args) {
        /*String 作为形参,虽然是引用类型,但是是一个常量,
        可以作为基本数据类型进行数据传递,但是其形参的改变不会改变实参的值
        * */
        String str="asdfg";
        setString(str);
        System.out.println(str);
        /**
         * StringBuffer作为形参,其是引用类型,形参的改变会影响实参的改变
         */
        StringBuffer s= new StringBuffer("asdfghjkl");
        setStringBuffer(s);
        System.out.println(s);
    }
    public static void setString(String str){
        str = str.replace('d', 'e');
        System.out.println(str);
    }
    public static void setStringBuffer(StringBuffer str){
        str=str.append("asdf").replace(2,5,"ty");
        System.out.println(str);
    }
}


包装类


Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:

image.png


装箱与拆箱


基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:


  • 装箱:从基本类型转换为对应的包装类对象。
  • 拆箱:从包装类对象转换为对应的基本类型。


用Integer与 int为例:(看懂代码即可)


基本数值---->包装对象

Integer i = new Integer(4);//使用构造函数函数
Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法


包装对象---->基本数值

int num = i.intValue();


自动装箱与自动拆箱


由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:

Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
//加法运算完成后,再次装箱,把基本数值转成对象。


基本类型与字符串之间的转换


基本类型转换为String


基本类型转换String总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式:

基本类型直接与””相连接即可;如:34+""


String转换成对应的基本类型



除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:


  • public static byte parseByte(String s):将字符串参数转换为对应的byte基本类型。
  • public static short parseShort(String s):将字符串参数转换为对应的short基本类型。
  • public static int parseInt(String s):将字符串参数转换为对应的int基本类型。
  • public static long parseLong(String s):将字符串参数转换为对应的long基本类型。
  • public static float parseFloat(String s):将字符串参数转换为对应的float基本类型。
  • public static double parseDouble(String s):将字符串参数转换为对应的double基本类型。
  • public static boolean parseBoolean(String s):将字符串参数转换为对应的boolean基本类型。


代码使用(仅以Integer类的静态方法parseXxx为例)如:

public class Demo18WrapperParse {
    public static void main(String[] args) {
        int num = Integer.parseInt("100");
    }
}


注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException异常。


包装类Integer类


(1)int与String的相互转换代码:

public class Test {
    public static void main(String[] args) {
        //int ------------String
        int num=1000;
        //字符串的拼接
        String str="";
        str+=num;
        System.out.println(str);
        System.out.println("-----------------------");
        //valueOf(),将任意的数据类型转换为字符串
        String s = String.valueOf(num);
        System.out.println(s);
        System.out.println("-----------------------");
        //int---Integer---String
        Integer i1 = new Integer(num);
        String s1 = i1.toString(num);//toString()必须对象调用方法
        System.out.println(s1);
        System.out.println("-----------------------");
        //String-----int
        String st="111111";
        Integer in1 = new Integer(st);
        int in2 = in1.intValue(); //不是静态方法,返回的是int型数字
        System.out.println(in2);
        System.out.println("----------------------");
        int in3 = Integer.parseInt(st);   //静态的方法,只能通过类名来调用
        System.out.println(in3);
    }
}


特别注意,静态方法的调用时类名调用而不是对象的调用。


数组排序


image.png


(1)冒泡排序代码:

import java.util.Arrays;
public class MaoPaoSort {
    public static void main(String[] args) {
        int[] arr={24,69,80,57,13};
        sort(arr);
    }
    public static void sort(int[] arr){
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}


(2)选择排序代码:

public class XUanZeTest {
    public static void main(String[] args) {
        int[] arr={24,69,80,57,13};
        sort(arr);
    }
    public static void sort(int[] arr){
        for(int i=0;i<arr.length-1;i++){
            for(int j=i+1;j<arr.length;j++){
                if(arr[i]>arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j ];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}


(3)二分法排序代码:

public class ErFenFa {
    public static void main(String[] args) {
        int[] arr={12,54,2,4,89};
        sort(arr);
        int index=erfenfa(arr,4);
        System.out.println(index);
    }
    public static void sort(int[] arr){
        for(int i=0;i<arr.length;i++){
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    public static int erfenfa(int[] arr,int value){
        int minIdex=0;
        int maxIndex=arr.length-1;
        int midIndex=(minIdex+maxIndex)/2;
        while(minIdex<=maxIndex) {
            if (value == arr[midIndex]) {
                System.out.println("找到对应的值,索引值为:" );
                return midIndex;
            } else if (value < arr[midIndex]) {
                maxIndex = midIndex - 1;
            } else {
                minIdex = midIndex + 1;
            }
            midIndex=(minIdex+maxIndex)/2;
        }
        return -1;
    }
}


目录
相关文章
|
2月前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
2月前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
2月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
2月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
3月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
150 7
|
3月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
87 2
|
5月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
58 0
java基础(13)String类
|
4月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
85 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
4月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
98 2
|
5月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①