Android中的GPS开发

news2024/12/27 9:56:03

GPS简介

Gobal Positioning System,全球定位系统,是美国在20世纪70年代研制的一种以人造地球卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息;它是具有在海、陆、空进行全方位实时三维导航与定位功能的新一代卫星导航与定位系统。

中国用的定位系统是北斗卫星导航系统Beidou Navigation Satellite System,简称BDS,BDS、GPS、俄罗斯的GLONASS、欧盟的GALILEO是联合国卫星导航委员会已经认定的供应商。

手机的定位功能应用广泛,本章来学习GPS的应用开发。

GPS的常用API

GPS系统有三部分组成,卫星空间部分、地面监控部分和用户设备部分。

对于Android机来说,是用户设备部分,是GPS定位系统的接收机,也就是说GPS定位需要有硬件支持GPS功能。对于Android开发人员来说,通过LocationManager、LocationProvider、Location这三个API的一些方法就能开发出GPS应用。

程序的LocationManger对象不能直接创建,而是要通过Context.getSystemService方法获取

LocationManager locationManager= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> allProviders = locationManager.getAllProviders();

通过询问chatGPT,整理出了这样的一个表格,LocationManger的方法以及作用如下:

方法名

返回值

作用

getLastKnownLocation(String provider)

Location

获取指定 provider 的最近一次位置信息

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

void

注册位置监听器,以获取 provider 的位置更新。参数 minTime 和 minDistance 分别表示位置更新的最小时间间隔和最小距离间隔

removeUpdates(LocationListener listener)

void

取消位置监听器的注册

isProviderEnabled(String provider)

boolean

判断指定 provider 是否可用

addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)

void

注册一个“地理围栏”,当设备进入指定半径的圆形区域时触发 intent

removeProximityAlert(PendingIntent intent)

void

取消“地理围栏”的注册

使用 LocationManager 时需要申请适当的权限,比如 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

还有一个API是LocationProvider,他不是Android中的类,而是 Android 系统中的一个抽象类,定义了位置提供者的标准接口,它的实现类用于提供位置信息。LocationProvider 的实现类可以通过系统服务 LocationManager 来获取。当应用程序请求获取位置信息时,LocationManager 会选择合适的位置提供者来获取位置信息,根据不同的需求选择不同的位置提供者。

方法名

返回值

作用

getName()

String

获取位置提供者(locationProvider)的名称

getAccuracy()

int

获取该位置提供者的精度

getPowerRequirement()

int

获取该位置提供者的电量消耗

hasMonetaryCost()

boolean

判断该位置提供者是否需要支付费用

requiresCell()

boolean

判断该位置提供者是否需要使用移动网络

requiresNetwork()

boolean

判断该位置提供者是否需要使用数据网络

requiresSatellite()

boolean

判断该位置提供者是否需要使用卫星

supportsAltitude()

boolean

判断该位置提供者是否支持海拔信息

supportsBearing()

boolean

判断该位置提供者是否支持方向信息

supportsSpeed()

boolean

判断该位置提供者是否支持速度信息

还有一个API是Location,Location 是 Android 中用于表示位置信息的类,它包含了经度、纬度、海拔、速度、方向等位置信息。Location 对象是由 LocationProvider 提供的,LocationManager 负责获取 LocationProvider 提供的位置信息,并将其封装成 Location 对象,然后提供给应用程序使用。方法如下:

方法名

返回值

作用

getLatitude()

double

获取该位置的纬度

getLongitude()

double

获取该位置的经度

getAltitude()

double

获取该位置的海拔

getAccuracy()

float

获取该位置的精度

getBearing()

float

获取该位置的方向

getSpeed()

float

获取该位置的速度

getTime()

long

获取该位置信息的时间戳

hasAccuracy()

boolean

判断该位置信息是否包含精度信息

hasAltitude()

boolean

判断该位置信息是否包含海拔信息

hasBearing()

boolean

判断该位置信息是否包含方向信息

hasSpeed()

boolean

判断该位置信息是否包含速度信息

需要注意的是,获取 Location 对象时可能会出现空值,因此在使用 Location 对象前需要先进行非空判断。另外,获取位置信息需要申请适当的权限,比如 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限。

上面三个API就是Android GPS定位支持的三个核心API。使用步骤如下:

1 获取系统的LocationManger对象。

2 使用LocationManger,通过指定的locationProvider来获取定位信息,定位信息由Location表示。

3 从Location对象中获取定位信息。

locationProvider

写一个简单的demo来获取当前系统所有的locationProvider

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private ListView listView;
    private LocationManager locationManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = findViewById(R.id.list);
        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        //获取所有的locationProvider名称
        List<String> allProviders = locationManager.getAllProviders();
        ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_list_item_1,allProviders);
        listView.setAdapter(adapter);
    }
}

在真机上运行可以看到该系统上有如下四个LocationProvider

 

移动端通常通过WIFI、GPS、基站这三种方式来定位设备。

以下这四种provider分别来介绍一下

    public static final String NETWORK_PROVIDER = "network";
    public static final String GPS_PROVIDER = "gps";
    public static final String PASSIVE_PROVIDER = "passive";
    public static final String FUSED_PROVIDER = "fused";

NETWORK_PROVIDER:通过移动网络的基站或者 Wi-Fi 来获取地理位置;优点:只要有网络,就可以快速定位,室内室外都可;缺点:精确度不高;

GPS_PROVIDER:通过 GPS 来获取地理位置的经纬度信息;优点:获取地理位置信息精确度高;缺点:只能在户外使用,获取经纬度信息耗时,耗电;

PASSIVE_PROVIDER:被动接收更新地理位置信息,而不用自己请求地理位置信息。

PASSIVE_PROVIDER 返回的位置是通过其他 providers 产生的,可以查询 getProvider() 方法决定位置更新的由来,需要 ACCESS_FINE_LOCATION 权限,但是如果未启用 GPS,则此 provider 可能只返回粗略位置匹配;

FUSED_PROVIDER:已经被废弃了

通过名称获取指定的locationProvider

LocationProvider provider = locationManager.getProvider(LocationManager.GPS_PROVIDER);

使用GPS获取位置信息

 

代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private LocationManager locationManager;
    private TextView showInfo;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        showInfo = findViewById(R.id.show_location);
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},0x123);
    }

    private void updateView(Location location) {
        if (location != null) {
            Log.d(TAG, "updateView: 222");
            String res = "实时位置:\n" +
                    "经度:" + location.getLongitude() +
                    "\n纬度:" + location.getLatitude() +
                    "\n高度:" + location.getAltitude() +
                    "\n速度:" + location.getSpeed()
                    + "\n方向:" + location.getBearing();
            showInfo.setText(res);
        } else {
            Log.d(TAG, "updateView: 111");
            showInfo.setText("");
        }
    }
    @SuppressLint("MissingPermission")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0x123 && grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //创建locationManger对象
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //获取最新的定位信息
            Location lastKnownLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            updateView(lastKnownLocation);
            //每隔三秒获取一次GPS信息
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 8f, new LocationListener() {
                @Override
                public void onLocationChanged(@NonNull Location location) {
                    updateView(location);
                }
            });
        }
    }
}

这里代码也很简单,我布局文件只写了一个textView来展示经纬度信息,首先在onCreate方法里动态申请权限。在Android6.0以上不仅仅要在声明文件里静态注册,还有动态申请,否则会出现安全异常。然后就是一个更新UI的方法,通过传入的location获取经纬度高度等信息。选择完获取权限后,会执行onRequestPermissionsResult回调函数,然后就是获取定位信息更新UI。

最后需要在声明文件里静态注册权限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

我获取到的是北京市内某地区的经纬度,把该程序和地图功能结合,就能反映出该经纬度在地图上的具体位置,即可开发出GPS导航系统。

室内WIFI定位

室内WIFI定位主要根据WIFI路由器所在的位置进行定位,主要应用于室内较小的空间的精准定位。

Android 9 添加了WiFi 室内定义功能(RTT),以下内容来自 developer.android.com

Android 9 添加了对 IEEE 802.11mc Wi-Fi 协议(也称为 Wi-Fi Round-Trip-Time (RTT))的平台支持,从而让您的应用可以利用室内定位功能。
在运行 Android 9 且具有硬件支持的设备上,应用可以使用 RTT API 来测量与附近支持 RTT 的 Wi-Fi 接入点 (AP) 的距离。 设备必须已启用位置服务并开启 Wi-Fi 扫描(在 Settings > Location 下),同时您的应用必须具有 ACCESS_FINE_LOCATION 权限。

设备无需连接到接入点即可使用 RTT。 为了保护隐私,只有手机可以确定与接入点的距离;接入点无此信息。

如果您的设备测量与 3 个或更多接入点的距离,您可以使用一个多点定位算法来预估与这些测量值最相符的设备位置。 结果通常精准至 1 至 2 米。

室内WIFI定位的管理器是WifiRttManager,获取方式如下,由于在Android9后才增加该功能,所以需要先判断。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
    WifiRttManager wifiRttManager= (WifiRttManager) getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
}

获取到wifirttmanger对象后,可以用startRanging开始定位,该方法里有三个参数。

startRanging(@NonNull RangingRequest request, @NonNull Executor executor, @NonNull RangingResultCallback callback)

RangingRequest:该参数代表一个定位请求,该参数管理本次定位是基于哪个WIFI节点进行访问的

Executor:创建一个新的线程来执行WIFI定位,避免阻塞UI线程。

RangingResultCallback:定位成功或失败的时候触发该对象内的特定方法

写一个具体的案例来实现室内WIFI定位,代码如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    WifiRttManager mWifiRttManager;

    //定义监听WIFI状态改变的BroadcastReceiver
    public class WIfiChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())) {
                //开始执行wifi定位
                startWifiLoc();
            }
        }

    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //定义一个监听网络状态的改变 WIFI状态改变的intentFilter
        IntentFilter wifiFilter = new IntentFilter();
        wifiFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        wifiFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
        registerReceiver(new WIfiChangeReceiver(), wifiFilter);
    }

    @SuppressLint("MissingPermission")
    private void startWifiLoc() {
        //获取wifi管理器
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        //判断是否支持室内wifi定位功能
        boolean hasRtt = getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT);
        Log.d(TAG, "startWifiLoc: 是否具有室内WIFI定位功能:" + hasRtt);
        //Android版本大于9才能使用
        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            //获取室内WiFi定位管理器
            mWifiRttManager = (WifiRttManager) getSystemService(Context.WIFI_RTT_RANGING_SERVICE);
            RangingRequest request = new RangingRequest.Builder()
                    .addAccessPoints(wifiManager.getScanResults())//添加WiFi扫描结果
                    .build();//创建RangingRequest对象
            Log.d(TAG, "startWifiLoc: request:"+request);
            //开始请求执行室内WIFI定位
            mWifiRttManager.startRanging(request, Executors.newCachedThreadPool(), new RangingResultCallback() {
                @Override
                public void onRangingFailure(int i) {
                    //WIFI定位出错执行的方法
                    Log.d(TAG, "onRangingFailure:错误码是: "+i);
                }

                @Override
                public void onRangingResults(@NonNull List<RangingResult> list) {
                    //室内WiFi定位返回结果时触发
                    for (RangingResult rr : list){
                        Log.d(TAG, "onRangingResults:与 "+rr.getMacAddress()+" WIFI的距离是:"+rr.getDistanceMm());
                    }
                }
            });
        }
    }

}

运行后报错了

 查询了一下原因是我设备硬件不支持WIFIRTT功能。

 

总结WIFI定位的步骤:

1 获取WifiRttManger对象

2 通过RangingRequest.Builder来创建对象,创建之前应该先添加WiFi扫描得到WiFi访问点的信息

3 调用WifiRttManger对象的startRanging方法

近距离警报

之前学习的API方法中有一个函数:

addProximityAlert(double latitude, double longitude, float radius, long expiration, PendingIntent intent)

代码:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    private LocationManager locationManager;

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 0x123);

    }


    @SuppressLint("MissingPermission")
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 0x123 && grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            //定义靠近点的经纬度信息
            double lon = 116.00;
            double lat = 46.00;
            float radius = 500F; //定义半径500M
            Intent intent = new Intent(this, ProxAlertReciever.class);
            //将intent封装成pendingIntent
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, -1, intent, 0);
            //添加临近警告
            locationManager.addProximityAlert(lat, lon, radius, -1, pendingIntent);
        }
    }
}

注册一个广播监听变化:

public class ProxAlertReciever extends BroadcastReceiver {
    private static final String TAG = "ProxAlertReciever";

    @Override
    public void onReceive(Context context, Intent intent) {
       boolean isEnter= intent.getBooleanExtra(LocationManager.KEY_PROXIMITY_ENTERING,false);
       if (isEnter){
           //靠近提示
           Log.d(TAG, "onReceive: 快靠近了!!");
       }else {
           Log.d(TAG, "onReceive: 离开了!!");
       }
    }
}

至此 Android中的GPS的就讲完了,想开发出具体的导航系统还要结合地图功能。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年房地产抵押贷款研究报告

第一章 概述 房地产抵押贷款是一种以房地产为抵押品的贷款形式&#xff0c;包括个人和企业两种情况。个人房地产抵押贷款是指个人将名下房产作为抵押品向银行或其他金融机构申请贷款&#xff0c;而企业房地产抵押贷款则是指企业将自己名下的商业房产作为抵押品向金融机构申请贷…

202309读书笔记|《野性之美:非洲野生动物初窥》——走进自然界的野性之美

《野性之美: 非洲野生动物初窥》微读的一本书&#xff0c;图片居多&#xff0c;非常有视觉上的震撼。拍摄者也是我们孙姓的一员&#xff0c;孙长智。正如作者所说&#xff0c;与自然对话&#xff0c;你会感悟到生命之美、竞争之美、进化之美、和谐之美&#xff01; 我喜欢自然…

SPSS如何绘制常用统计图之案例实训?

文章目录 0.引言1.绘制简单条形图2.绘制分类条形图3.绘制分段条形图4.绘制简单线图5.绘制多重线图6.绘制垂直线图7.绘制简单面积图8.绘制堆积面积图9.绘制饼图10.绘制直方图11.绘制简单散点图12.绘制重叠散点图13.绘制矩阵散点图14.绘制三维散点图15.绘制简单箱图16.绘制分类箱…

【markdown工具配合图床】PicGo图床配置教程,一秒读懂配置

前言 看到这篇文章的大佬&#xff0c;我默认大家都会配置git&#xff0c;已经配置好ssh公钥。 此时你看到的这篇文章就是基于markdown工具&#xff08;VSCode&#xff0c;Typora&#xff09;编写的。 PicGo作为图床转换工具&#xff0c;并配合gitee作为图片服务器&#xff0…

java元注解和自定义注解的区别

Java的元注解和自定义注解是两个不同的概念。 元注解是Java内置的一组用于修饰其他注解的注解&#xff0c;包括Retention、Target、Inherited和Documented。它们可以控制被修饰的注解的保留策略、目标范围、是否继承等属性&#xff0c;并且可以在编写自定义注解时使用。 Retent…

国考省考结构化面试:综合分析题,社会现象(积极消极政策)、名言哲理(警句观点启示)、漫画反驳题等

国考省考结构化面试&#xff1a;综合分析题&#xff0c;社会现象&#xff08;积极消极政策&#xff09;、名言哲理&#xff08;警句观点启示&#xff09;、漫画反驳题等 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&…

【Java数据结构】优先级队列(堆)

优先级队列&#xff08;堆&#xff09; 概念模拟实现堆的概念堆的存储方式堆的创建向下调整堆的创建建堆的时间复杂度 堆的插入和删除堆的插入堆的删除 用堆模拟实现优先级队列 常用接口PriorityQueue的特性PriorityQueue常用接口介绍构造方法插入/删除/获取优先级最高的元素 P…

孙溟㠭篆刻,红木上的‘’椎凿稚趣‘’

了解中国传统篆刻的人&#xff0c;一定知道篆刻作品中追求的“金石气”。作为拥有3700多年历史的中国传统艺术&#xff0c;篆刻艺术是将书法&#xff08;主要是篆书&#xff09;和镌刻&#xff08;包括凿、铸&#xff09;相结合&#xff0c;制作印章&#xff0c;亦是汉字独有的…

Vivado 仿真器中以批处理或脚本模式(Batch or Scripted Mode)进行仿真

以下说明来自ug900:在 Vivado 仿真器中以批处理或脚本模式进行仿真 具体可以内容可自行查找 其中代码运行截图为自己实践的实例 Note: xelab, xvlog and xvhdl are not Tcl commands. The xvlog, xvhdl, xelab are Vivado-independent compiler executables. Hence, there is…

20230505使用amazon来批量翻译SRT格式的日语字幕为简体中文

20230505使用amazon来批量翻译SRT格式的日语字幕为简体中文 2023/5/5 19:03 百度搜索&#xff1a;使用 amazon 批量翻译 请严重注意&#xff1a;可能会扣费的&#xff01; https://aws.amazon.com/cn/blogs/china/translating-documents-with-amazon-translate-aws-lambda-and…

线性判别分析LDA计算例题详解

线性判别分析(Linear Discriminant Analysis, LDA)的核心思想是&#xff1a;将给定训练集投影到特征空间的一个超平面上&#xff0c;并设法使同类样本投影点尽可能接近&#xff0c;异类样本投影点尽可能远离 由于做题时针对的是解题过程&#xff0c;因此原理相关方面省略&#…

回文数:探索数字世界中的对称美学

本篇博客我会讲解力扣中的“9. 回文数”这道题&#xff0c;大家重点理解判断回文数的方法。 先来审题&#xff1a;这是题目链接。 来看几个输出示例&#xff1a; 还有一些条件&#xff1a; 第一反应是&#xff1a;为啥是个整数呢&#xff1f;万一是个字符串&#xff0c;那不…

windows下安装OpenCL

由于我的电脑是windows10&#xff0c;显卡是集显Intel UHD Graphics 630。 下载Intel的SDK for OpenCL&#xff0c;下载地址https://software.intel.com/en-us/opencl-sdk/choose-download&#xff0c;也可以在我的资源里面直接下载https://download.csdn.net/download/qq_363…

System verilog【2】字符串,函数,任务

前言 素手青颜光华发&#xff0c;半世尘缘半世沙。我唤青天睁开眼&#xff0c;风霜怎奈并蒂花 \;\\\;\\\; 目录 前言字符串packed组合型结构体组合型数组 过程块initial & always functiontask 字符串 module chertanis;initial beginstring s"hola,mundo!",s2…

Java 多线程知识

参考链接&#xff1a;https://www.cnblogs.com/kingsleylam/p/6014441.html https://blog.csdn.net/ly0724ok/article/details/117030234/ https://blog.csdn.net/jiayibingdong/article/details/124674922 导致Java线程安全问题最主要的原因&#xff1a; &#xff08;1&#…

修改亮度、对比度、色调、饱和度,达到预期效果

用户态可以通过v4l2自带工具进行一些UVC相机参数的设定&#xff0c;包括采集卡驱动之类&#xff0c;也可以通过v4l2自带工具进行参数设定。 通过修改这些参数的值&#xff0c;可以弥补相机本身彩色部分自带不足。 总的来说就这么几种命令&#xff1a; 查看设备所有参数信息&a…

C++系列三:变量、常量

常量、变量 1. 变量1.1 定义变量1.2 初始化变量1.3 变量数据类型1.4 变量作用域 2. 常量2.1 定义常量2.2 常量类型2.3 常量作用域2.4 常量用法 3. 总结 1. 变量 变量是一个用于存储值的命名内存位置&#xff0c;可以存储多种不同类型的数据&#xff0c;例如整数、实数、字符或…

淘宝搜广推技术备注

第一篇文章 一、序列特征处理方式 1&#xff1a;淘宝的类目体系中&#xff0c;有大类目、小类目&#xff08;淘宝大类目和小类目怎么区分&#xff1f;有何运营技巧&#xff1f;-卖家网&#xff09;&#xff0c;在做推荐系统时&#xff0c;有个sim建模&#xff08;search-base…

【Java】抽象类接口

目录 1.抽象类 2.接口 2.1实现多个接口 2.2接口之间的关系 2.3接口使用实例 2.3.1Comparable接口 2.3.2Comparator接口 2.3.2Clone接口 2.4抽象类与接口的区别 1.抽象类 定义&#xff1a;抽象方法&#xff1a;这个方法没有具体的实现&#xff1b; 抽象类&#xff1a;不…

边学边记——数据结构☞和搜索有关的数据结构(搜索树,Set,Map,哈希表)

目录 模型 一、搜索 1. 场景 2. 搜索树 2.1 概念 2.2 查找 2.3 插入 2.4 删除 2.5 实现 2.6 性能分析 2.7 和Java的关系 二、Set 1. 常见方法 2. 注意 三、Map 1. 关于Map.Entry的说明,> 2. Map的常用方法说明 3. 注意 四、哈希表 1. 概念 2. 冲突 2…