Java基础之冒泡排序、二分查找、封装

Java基础

1.冒泡排序

public static void main(String[] args) {
    /*
        TODO 定义数组的 冒泡排序
     */
    int[] intAr = {3, 2, 1, 5, 6, 4, 2, 1, 8};
    bubbleSort(intAr);
    System.out.println(getArrStr(intAr));
}

public static int[] bubbleSort(int[] intArr) {
    /*
        冒泡排序:
            对相邻两个数据进行比较,将较小的数据前置,较大的数据后置,之后再去拿下一个数据进行比较

          第一层 2,1,3,5,6,4,2,1,8
          第二层 2,1,3,5,6,4,2,1,8
            ① 3 v 2 => 2 3
            ① 3 v 1 => 1 3
     */
    for (int i = 0; i < intArr.length - 1; i++) {
        for (int j = 0; j < intArr.length - i - 1; j++) {
            if (intArr[j] > intArr[j + 1]) {
                int tmp = intArr[j + 1];
                intArr[j + 1] = intArr[j];
                intArr[j] = tmp;
            }
        }
    }

    return intArr;
}

2.二分查找

public static void main(String[] args) {
    /*
        TODO 定义数组的 二分查找
     */
    int[] intAr = {3, 2, 1, 5, 6, 4, 2, 1, 8};
    int index = binarySearch(intAr, 0);
    System.out.println("获取到下标:"+index);

}


/*
    二分查找:
        给定一个具体的数据,通过二分的方式在int类型的数组中进行遍历数据,如果遍历到,那么返回其下标
        如果没有遍历到则返回 -1
        [1, 1, 2, 2, 3, 4, 5, 6, 8]
        对于二分查找必须要求其数组为有序数组
        ① 先确定 开始下标 和结束下标
        ② 通过开始下标和结束下标确定 中间mid下标 通过mid 获取对应下标的值
        ③ 通过下标值和目标值进行比较
            1.如果相同则返回mid下标,程序结束
            2.如果当mid 小于 目标值那么需要将 开始下标设置为 mid + 1 再进行一轮比较
            3.如果当mid 大于 目标值那么需要将 结束下标设置为 mid - 1 再进行一轮比较
        注意:mid = 开始下标 + 结束下标 / 2 取整

 */
public static int binarySearch(int[] intArr, int search) {
    int startIndex = 0;
    int endIndex = intArr.length - 1;
    while (startIndex <= endIndex) {
        int mid = (startIndex + endIndex) / 2;
        if (intArr[mid] == search) {
            return mid;
        }else if (intArr[mid] < search){
            startIndex = mid + 1;
        }else {
            endIndex = mid - 1;
        }
    }
    return -1;
}

3. class(类)

 public static void main(String[] args) {
        /*
            在Java中使用class 修饰的成为类,如果当类中存在有main方法时,成为操作类或程序入口类
         */

        Person person = new Person(); //通过类可以获取到其对象
        person.name = "许康杰";
        person.age = 20;
        System.out.println(person.name);  // 通过对象.属性 可以获取到属性值
        System.out.println(person.age);  // 通过对象.属性 可以获取到属性值

        System.out.println(person.eat("金针菇")); // 对于成员方法可以直接通过对象进行调用
        person.play();

        Person person2 = new Person(); //通过类可以获取到其对象
        person2.name = "李国涛";
        person2.age = 18;
        System.out.println(person2.name);  // 通过对象.属性 可以获取到属性值
        System.out.println(person2.age);  // 通过对象.属性 可以获取到属性值

        Person person3 = person2; // 使用的是同一个内存地址中的数据
        System.out.println(person3.name);  // 通过对象.属性 可以获取到属性值
        System.out.println(person3.age);  // 通过对象.属性 可以获取到属性值

        useVar();

    }

    public static void useVar(){
        // 当{}中代码执行完成后,当前{}中所有变量都失效,会在特定时期被 垃圾回收器回收
        {
            int var = 10;
//            int var ;  对于局部变量来说,需要先定义赋值 后使用
            System.out.println(var);
        }

    }


Person类:
    
    public class Person {
    /*
        TODO 人类:
            属性:姓名 年龄 身高 体重 性别
            方法:吃 喝 玩 学习
           注意:
              1.类中的属性称为成员变量,定义在类中方法外
              2.对于成员变量,在定义时,可以不用给定其初始值,在构建对象时,会根据变量的类型初始化
                    引用类型 (String) => null
                    基本数据类型 (byte short int long) => 0
                               (float double) => 0.0
                               (char boolean) => ?
              3.类中的成员方法,在定义时,不能使用static修饰
     */
    String name;
    int age;
    double high;
    double weight;
    String gender;

    public String eat(String food){
        System.out.println(food+"被消化了一部分");
        return "消化过的食物";
    }

    public void drink(String drink){
        System.out.println("人类可以喝饮料...");
    }

    public void play(){
        System.out.println("人类可以玩游戏...");
    }


}

4.参数传递

public static void main(String[] args) {
    /*
        在Java中使用class 修饰的成为类,如果当类中存在有main方法时,成为操作类或程序入口类
     */

    Person person = new Person(); //通过类可以获取到其对象
    person.name = "易政";
    //将引用类型变量person作为参数传递给usePerson(),以此实现了person对象中属性值的变化
    usePerson(person);
    System.out.println(person.name); // 汪雨
    System.out.println(person.age); // 18


    /*
            TODO 匿名对象:
                当对象在方法中有且只使用一次的场景
                前后两次System.out.println(inPerson);所输出的值不同
         */

    usePerson(new Person());

}

public static void usePerson(Person inPerson) {
    System.out.println(inPerson);
    inPerson.name = "汪雨";
    inPerson.age = 18;
}

5.封装

 public static void main(String[] args) {
        Student student = new Student();
        /*
           TODO 封装概述
                是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
            private 修饰成员(成员变量和成员方法) 对当前的变量或方法私有化
                    一旦修饰后,仅只能在当前的类中使用
            当在setAge中使用参数名和属性名称相同时,赋值失败,原因:
                1.在方法中定义的参数为局部变量,仅仅在当前方法中生效,
                2.当参数名称和属性相同时,根据就近原则,选择当前方法内的局部变量进行调用
            this => 指代当前的对象 this.可以使用属性或方法
         */
        student.setName("李四");
        student.setAge(18);
        student.setGender("不知道");
        student.printInfo(); // 方法可以被调用 因为该方法为public 而其中的属性虽然为私有但是,在当前对象类内调用的

        // 通过封装的方法可以对其中属性值进行获取
        System.out.println(student.getName());
        System.out.println(student.getAge());

        Phone phone = new Phone();
        phone.setNumber("183****8888");
        phone.setUser("王五");
        System.out.println(phone.getUser());
        System.out.println(phone.getNumber());

    }



Student类:
    
    public class Student {
    private String name;
    private int age;
    private String gender;

    public void setName(String inName) {
        name = inName;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setGender(String inGender) {
        if (inGender.equals("男") || inGender.equals("女")){
            gender = inGender;
        }else {
            System.out.println("性别只能为男或女,您输入的信息不正确...");
        }
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender;
    }

    public void printInfo() {
        System.out.println("我叫:" + name + " 今年:" + age + " 性别是:" + gender);
    }

}

6.构造方法

 public static void main(String[] args) {
        /*
            TODO 构造方法
                1. new Phone(); 是使用 new 关键字 + 类名 + ()  => Java的方法中有() 表示 方法的调用
                2. 在定义类时,会默认给定一个当前类的无参构造方法
                        构造方法 作用是返回一个 当前类的一个对象 所以不需要指定其返回值类型
                   注意:
                       1.构造方法的格式 修饰符 类名(参数) {可以编写构造方法体}
                       2.对于显示定义构造方法,默认会覆盖无参构造

         */
        Phone phone = new Phone();
        phone.setNumber("183****8888");
        phone.setUser("陆玉龙");
        System.out.println(phone.getUser());
        System.out.println(phone.getNumber());

        Phone phone2 = new Phone("袁枫", "166****6666");
        System.out.println(phone2.getUser());
        System.out.println(phone2.getNumber());

        Phone phone3 = new Phone("汪雨");
        System.out.println(phone3.getUser());
        System.out.println(phone3.getNumber());

        // 对象调用方法
        phone2.call("188****8888");
        Phone phone4 = new Phone("袁枫女朋友", "188****8888");
        phone2.call(phone4);

        //非static的方法无法通过直接使用其方法名来调用该方法
        //usePhone(phone2);
        //以引用类型变量来作为传递参数
        useStaticPhone(phone2);
    }

    public void usePhone(Phone phone){
        System.out.println("手机号:"+phone.getNumber()+"正在被使用...");
    }
    public static void useStaticPhone(Phone phone){
        System.out.println( "Demo05中的代码:"+"手机号:"+phone.getNumber()+"正在被使用...");
    }



phone类:
    
    public class Phone {
    // public 表示公开的
    public Phone() {
        System.out.println("这是Phone的构造方法...");
    }

    /*
        有参构造方法
     */
    public Phone(String user, String number) {
        this.user = user;
        this.number = number;
        System.out.println("这是两个参数的Phone的构造方法...");
    }

    /*
      TODO 构造方法内部调用其他构造方法
          注意: 在当前类中构造方法调用需要使用 this([参数]) 进行调用
               同时,this([参数]) 需要放在当前构造方法的第一行
     */
    public Phone(String user) {
        this(user, "111****0000");
        System.out.println("这是1个参数的Phone的构造方法...");
//        this.user = user;
//        this.number = "111****0000";
    }


    private String user;
    private String number;

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public void call(String number) {
        System.out.println(this.number + "正在打电话给" + number);
    }


    //以引用类型变量来作为传递参数
    public void call(Phone phone) {
        System.out.println(this.user + "\t" + this.number + "正在打电话给" + phone.user + "\t" + phone.number);
    }


    public void show(){
        System.out.println("当前用户为:"+user+"其手机号码为:"+number);
    }

}

7.成员方法

public class Demo06UseObjectFunction {
    
    public static void main(String[] args) {
        /*
            TODO 成员方法
                定义:属于对象的,在类中定义,格式为:
                    修饰符 返回值类型 方法名(参数列表) {方法体}
                调用:
                    成员方法的调用,必须要通过对象进行
                    静态方法是属于类的,其调用方式:
                        1.如果在当前类中的static方法中使用 可以直接通过方法名调用
                        2.如果在其他类中的静态方法内调用,可以通过类名.方法名调用
                        3.对于对象也可以调用类中的静态方法,但是不合规
                    注意:
                        1. 静态方法内部,只能调用静态方法,或者通过其对象调用成员方法

         */

        Phone phone2 = new Phone("袁枫", "166****6666");
        System.out.println(phone2.getUser());
        System.out.println(phone2.getNumber());

//        usePhone(phone2); //不能使用

        //创建本类对象
        Demo06UseObjectFunction demo06UseObjectFunction = new Demo06UseObjectFunction();
        //通过本类对象调用其成员方法usePhone()
        demo06UseObjectFunction.usePhone(phone2);

        useStaticPhone(phone2);  // 静态方法,可以直接被调用
        Demo05GetObject.useStaticPhone(phone2);
        //可以调用类中的静态方法,但是不合规
        demo06UseObjectFunction.useStaticPhone(phone2);

        phone2.show();

    }

    public void usePhone(Phone phone){
        System.out.println("手机号:"+phone.getNumber()+"正在被使用...");
//        useStaticPhone(phone);  // 成员方法中可以直接调用类中的静态方法
    }

    // static 修饰的成为静态方法
    public static void useStaticPhone(Phone phone){
//        usePhone(phone);  // 不可以
        System.out.println("Demo06中的代码:"+"手机号:"+phone.getNumber()+"正在被使用...");
    }

}

8. static

package com.shujia.Day04_packaging;

public class Demo07StaticVar {
    static int value;
    static int data = 20;

    int var = 1;

    public static void main(String[] args) {
        /*
            TODO static 修饰成员变量
                1. 提供了一种全局的方式,可以在多个静态方法中进行调用变量
                2. 对于成员变量只能在成员方法中使用,不能在静态方法中使用
                3. 对于成员方法中,可以使用静态变量
                4. 对于成员变量使用static修饰,那么该变量为静态变量 -> 属于类的 -> 是所有对象共有的 ->
                        内存中的存储位置是在方法区(元空间中) -> jdk7之后存在堆空间中  -> 在全局有且仅有一个
         */
        Demo07StaticVar.value = 10;
        System.out.println(value);
        System.out.println(data);
        useVar();
        
//        var = 10;
//        Demo07StaticVar demo07StaticVar = new Demo07StaticVar();
//        demo07StaticVar.objectVar();
        //匿名对象
        new Demo07StaticVar().objectVar();


        Per per1 = new Per("张三", "美国");
        per1.show();
        Per per2 = new Per("李四", "中国");
        per2.show();
        // 现象 :由于nationality属性为static,
        // 第二次创建Per对象时输入的nationality"中国"覆盖了第一次输入的张三的nationality"美国"
        per1.show();  


    }

    public static void useVar() {
        //静态方法中无法使用非静态方法中定义的变量
//        var = 10;
        System.out.println("获取到Value:" + value);
        System.out.println("获取到data:" + data);
    }

    public void objectVar() {
        var = 10;
        data = 30;
        System.out.println("当前data:" + data);
        System.out.println("当前var:" + var);
    }

}


Per类:
    
public class Per {
    String name;
    static String nationality;

    // alt + insert 按键  快捷方式(快速创建get、set方法)
    // select None
    public Per() {
    }

    public Per(String name, String nationality) {
        this.name = name;
        this.nationality = nationality;
    }

    public void show() {
        System.out.println("姓名:" + name + "\t" + "国籍:" + nationality);
    }
}

9. main方法

public class Demo08Main {
    public static void main(String[] args) {
        // String[] args => 是一个字符串数组
        /*
            String[] args 表示在程序运行时传入的一些参数
              类似于  mysql -uroot -p123456
            参数之间使用空格隔开
         */
        int length = args.length;
        System.out.println(length);
        if (length > 0){
            for (String arg : args) {
                System.out.println("argument:"+arg);
            }
        }
    }
}


public class Demo08UseMain {
    public static void main(String[] args) {
        String[] arguments = {"1","2"};
        /*
            main方法是属于类的 就可以使用类.main进行调用
         */
        Demo08Main.main(arguments);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558837.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

torchvision指定版本whl安装(Ubuntu20环境)

pytorch教程需要torchvision下载数据集&#xff0c;使用pip安装指定版本&#xff0c;首先使用conda list torch查看自己安装torch版本&#xff0c;我的pytorch版本1.9.0对应cuda版本11.1 在以下网址查找对应torchvision版本&#xff0c;https://pytorch.org/get-started/prev…

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别&#xff08;vue-cli2 与 vue-cli3 &#xff09; 2、例子1&#xff08;vue2项目&#xff09; 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 &#xff08;1&#xff09;package.json 文件 &#xff08;2&#xff09;webpack.dev.conf.js文件 &#…

【备战算法岗】—— 控制模块复习(持续更新!!!)

1 控制理论基础 1.1 控制模块概述 输入&#xff1a;轨迹线Reference、地图信息、定位信息、车辆反馈信息 输出&#xff1a;刹车、油门、转向 CANBUS&#xff1a;车辆底盘交互协议 底盘、速度、四轮转速、健康状况、底盘报错、自动驾驶状态 运动学模型&#xff1a;刚体运动&a…

linux的线程概念

目录 1.原理 2.线程的周边概念 3.创建线程的接口 1.pthread_create 2.pthread_join 3.pthread_detach 4.终止线程 5.C11封装的多线程库 4.线程库的大概结构 5.__thread&#xff08;只能修饰内置类型&#xff09; 6.线程的互斥 1.了解原理 2.加锁 1.接口 2.代码示…

遍历取后端数据推送到地图上,实现图标点标记地图效果

遍历取后端数据推送到地图上&#xff0c;实现图标点标记地图效果 示例链接&#xff1a; 功能示例(Vue版) | Mars3D三维可视化平台 | 火星科技 踩坑注意点&#xff1a; 1. id: 1 是地图底图的id 后台也返回之后 id直接会有冲突 此时图标标记之后无法单击 相关代码&#xff1a…

异步 IO 机制 io_uring

一、io_uring 原理 如何解决频繁 copy 的问题 → mmap 内存映射解决。 submit queue 中的节点和 complete queue 中的节点共用一块内存&#xff0c;而不是把 submit queue 中的节点 copy 到 complete queue 中。 如何做到线程安全 → 无锁环形队列解决。 二、io_uring 使用 内…

了解 Python 底层的解释器 CPython 和 Python 的对象模型

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、CPython CPython 是 Python 编程语言的官方和最广泛使用的实现。它是用 C 语言编写的&#xff0c;因此得名 “CPython”。作为 Python 生态系统的核心&#xff0c;了解 CPython 的工作原理、主要特…

【新版】系统架构设计师 - 知识点 - 结构化开发方法

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识点 - 结构化开发方法结构化开发方法结构化分析结构化设计 数据流图和数据字典模块内聚类型与耦合类型 架构 - 知识点 - 结构化开发方法 结构化开发方法 分析阶段 工具&#xff1a;数据流图、…

如何实现文件上传到阿里云OSS!!!(结合上传pdf使用)

一、开通阿里云OSS对象存储服务 对象存储 OSS_云存储服务_企业数据管理_存储-阿里云阿里云对象存储 OSS 是一款海量、安全、低成本、高可靠的云存储服务&#xff0c;提供 99.995 % 的服务可用性和多种存储类型&#xff0c;适用于数据湖存储&#xff0c;数据迁移&#xff0c;企…

股票战法课程之主力的痕迹

文章目录 1. 主力的操作痕迹2. 主力的建仓2.1 建仓的三种方式2.2 建仓的五个特点2.3 建仓的迹象2.4 建仓的成交量特征 1. 主力的操作痕迹 序号痕迹原因1不跟随大盘节奏筹码都在主力手中2突发利空消息&#xff0c;股价不跌反涨主力被套&#xff0c;不希望散户抛盘3很小的成交量…

智己汽车数据驱动中心PMO高级经理张晶女士受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 智己汽车科技有限公司数据驱动中心PMO高级经理张晶女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“规模化敏捷落地实践”。大会将于5月25-26日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2…

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

【Java】Comparable和Comparator的区别

文章目录 区别Comparable示例Comparator示例参考资料 都可以用于排序。都是接口。 区别 Comparable示例 让被排序的类实现 Comparable 接口&#xff0c;重写 compareTo() 方法。 import java.util.*;public class Main {public static void main(String[] args){TreeSet<…

端点安全时刻影响着网络安全,我们应该如何保护

端点&#xff08;Endpoint&#xff09;是网络通信中的一个重要概念&#xff0c;指的是网络通信中的发送或接收信息的设备或节点。在一个网络中&#xff0c;端点可以是硬件设备&#xff08;如计算机、服务器、手机、路由器等&#xff09;&#xff0c;也可以是软件应用或服务。端…

PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出)

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 PSO-BP和BP多输入多输出回归预测模型 matlab (多输入多输出) 订阅专栏只能获取一份代码 部分源码 %------

ceph osd分组

一、前言 使用分组可以更好的管理osd&#xff0c;将不同类型的磁盘&#xff0c;分到不同的组中&#xff0c;例如hhd类型的osd分配到hhd组&#xff0c;ssd类型的osd分配到ssd组&#xff0c;将io要求不高的分配到hhd组做存储&#xff0c;io要求高的分配到ssd组做存储 二、配置 查…

Linux驱动开发笔记(一)字符驱动

文章目录 前言一、字符设备驱动程序框架二、基本原理1. 设备号的申请与归还2. 保存file_operations接口3. 设备节点的创建和销毁4. 创建文件设备4.1 mknod4.2 init_special_incode( )函数 5. 查找file_operation接口函数速查表 三、程序编写1. 模块初始化及关闭2. 文件操作方式…

墨子web3时事周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团&#xff0c;凭借其在前沿科技领域的深耕不辍&#xff0c;已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻&#xff0c;集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c…

【Godot4自学手册】第三十八节给游戏添加音效

今天&#xff0c;我的主要任务就是给游戏添加音效。在添加音效前&#xff0c;我们需要了解一个东西&#xff1a;音频总线。这个东西或许有些枯燥&#xff0c;如果你只为添加一个音效没必要了解太多&#xff0c;但如果你以后将要经常与音频播放打交道&#xff0c;还是要了解一下…

ARM学习(26)链接库的依赖查看

笔者今天来聊一下查看链接库的依赖。 通常情况下&#xff0c;运行一个可执行文件的时候&#xff0c;可能会出现找不到依赖库的情况&#xff0c;比如图下这种情况&#xff0c;可以看到是缺少了license.dll或者libtest.so&#xff0c;所以无法运行。怎么知道它到底缺少什么dll呢&…
最新文章