当前位置: 首页 > news >正文

Android Studio音频视频播放器课程设计

这个项目适合刚刚学习Android studio的初学者,实现音视频的基本播放功能,各项功能的页面都做的比较简单,特别适用于初学者,其特点在于本项目抛开了各种花里胡哨的制作,以最接近初学者的样式画面呈现,完全不用担心被质疑套用别人的项目,要是实在追求完美的话,本文末尾也附上了经过美化后的相同项目链接。

基于Android Studio的音视频播放系统设计与实现

一、问题描述

音视频播放系统包括:使用sqlite创建数据库用于存储用户信息、启动效果、用户注册、用户登录、显示用户信息、音乐播放、视频播放等功能。

二、功能描述

设计一个音视频播放器app,使之能够实现以下功能:

  1. 创建一个数据库用于存储用户信息。
  2. 启动效果:该App设计了启动页面,启动后倒计时3s后可进入app。
  3. 用户登录注册:该App提供用户登录和注册功能,用户可以创建新账户或使用现有账户登录。当用户注册完成后跳转回到登录页面进行用户登录。用户需要提供有效的用户名和密码进行身份验证。
  4. 显示用户信息:用户登录后可点击信息按钮查看用户信息,包括历史登录用户的用户信息。
  5. 音乐播放功能:用户登录后,可以通过该App浏览和播放音乐文件。App提供音乐列表,用户可以浏览并选择要播放的音乐。点击音乐后,将跳转到音乐播放页面,可进行音乐的播放、暂停、上一曲和下一曲以及拖动进度条来控制音乐播放。
  6.  视频播放功能:该App还提供视频播放功能。用户可以通过App浏览并选择要播放的视频文件。点击视频后,跳转到音乐播放页面,可以控制视频播放和暂停。

三、功能实现

项目目录:

 1.创建数据库,建立一个用户表,表结构如下:

2.实现app启动页面,页面效果如下:

 3.实现用户登录功能,用户需要提供有效的用户名和密码,否侧提示用户名无效或密码无效:

4.实现用户注册功能,点击注册按钮跳转至用户注册页面,用户注册成功跳转回用户登录页面进行用户登录:

5.显示历史登录用户信息功能,登录成功后,点击信息后,跳转至用户信息显示界面,用户可查看历史登录用户信息。

6.实现音乐播放功能,登录成功后,默认显示音乐列表,点击音乐后,跳转至音乐播放界面,用户可通过点击播放按钮进行音乐的播放、暂停、上一曲和下一曲操作,同时用户也可以通过拖动进度条控制音乐的播放进度:

7.实现视频播放功能,在默认页面点击视频按钮后,跳转至视频列表,点击视频可进入视频播放页面,用户可通过点击播放、暂停、继续播放按钮对视频进行播放控制。

四、源代码

1.用户类定义User.java

package and.yjg.music_app.Login;
public class User {public User() {}public User(String account, String password, String phone, String address) {this.account = account;this.password = password;this.phone = phone;this.address = address;}public String account;public String password;public String phone;public String address;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public void setPhone(String phone) {this.phone = phone;}public void setAddress(String address){this.address = address;}public String toString () {return "用户名:" + account + "\n" +"密码:" + password + "\n " +"电话:" + phone + "\n " +"地址:" + address + "\n";}}

2.UserDao.java

package and.yjg.music_app.Login;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;
import and.yjg.music_app.DataBaseHelper;
public class UserDao {private Context context;       private DataBaseHelper dbHelper;private SQLiteDatabase db;   public UserDao(Context context) {this.context = context;}public void open() throws SQLiteException {dbHelper = new DataBaseHelper(context);try {db = dbHelper.getWritableDatabase();} catch (SQLiteException exception) {db = dbHelper.getReadableDatabase();}}public void close() {if (db != null) {db.close();db = null;}}public void addUser(User user) {ContentValues values = new ContentValues();values.put("account", user.account);values.put("password", user.password);values.put("phone", user.phone);values.put("address", user.address);db.insert("user", null, values);}public void deleteUser(User user) {db.delete("user", "account = ?", new String[]{user.account});}public void update(User user) {ContentValues values = new ContentValues();values.put("password", user.password);db.update("user", values, "account = ?", new String[]{user.account});}public boolean find(User user) {Cursor cursor = db.query("user", null, "account = ?", new String[]{user.account}, null, null, null);if (cursor == null || cursor.getCount() < 1) {return false;}if (cursor.moveToFirst()) {do {String acc = cursor.getString(cursor.getColumnIndex("account"));String pass = cursor.getString(cursor.getColumnIndex("password"));String pho = cursor.getString(cursor.getColumnIndex("phone"));String addr = cursor.getString(cursor.getColumnIndex("address"));Log.d("UserDao", "user account is" + acc);Log.d("UserDao", "user password is " + pass);Log.d("UserDao", "user phone is " + pho);Log.d("UserDao", "user address is " + addr);} while (cursor.moveToNext());}cursor.close();return true;}public boolean isExist(String account) {Cursor cursor = db.query("user", null, "account = ?", new String[] {account}, null, null, null);return cursor != null && cursor.getCount() > 0;}public String getPassword(String account) {Cursor cursor = db.query("user", null, "account = ?", new String[] {account}, null, null, null);cursor.moveToFirst();String password = cursor.getString(cursor.getColumnIndex("password"));return password;}

3.启动效果WelcomeActivity.java

package and.yjg.music_app; 
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import Login.LoginActivity;
public class WelcomeActivity extends AppCompatActivity {private TextView tvCountdown;private CountDownTimer countDownTimer;private long timeLeftInMillis = 3000;protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);tvCountdown = findViewById(R.id.tv_countdown);startCountdown();}private void startCountdown() {countDownTimer = new CountDownTimer(timeLeftInMillis,1000){public void onTick(long millisUntilFinished){timeLeftInMillis = millisUntilFinished;int secondsRemaining = (int) (millisUntilFinished/1000);tvCountdown.setText(secondsRemaining+"s");}public void onFinish(){startActivity(new Intent(WelcomeActivity.this, LoginActivity.class));finish();}}.start();}
protected  void onDestroy(){super.onDestroy();if (countDownTimer != null){countDownTimer.cancel();}}
}

4.用户登录LoginActivity.java

package Login;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import and.yjg.music_app.MainActivity;
import and.yjg.music_app.R;
public class LoginActivity extends AppCompatActivity {private Button btn_login;    private Button btn_register;private EditText et_account;private EditText et_password;private UserDao dao;        @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);initView();}public void initView() {ActionBar actionBar = getSupportActionBar();if(actionBar != null){actionBar.hide();}btn_login = findViewById(R.id.btn_login);btn_register = findViewById(R.id.btn_register);et_account = findViewById(R.id.et_account);et_password = findViewById(R.id.et_password);btn_login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String acc = et_account.getText().toString().trim();String pass = et_password.getText().toString().trim();dao = new UserDao(getApplicationContext());dao.open();if (dao.isExist(acc) == false) {Toast.makeText(LoginActivity.this,"账号不存在,请重新输入!", Toast.LENGTH_SHORT).show();} else {if (dao.getPassword(acc).equals(pass)) {Intent intent = new Intent(LoginActivity.this, MainActivity.class);startActivity(intent);finish();} else {Toast.makeText(LoginActivity.this, "密码错误,请重新输入!", Toast.LENGTH_SHORT).show();}}dao.close();}});btn_register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);startActivityForResult(intent,1);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);if(data != null){if(requestCode == 1 && resultCode == 1){String name = data.getStringExtra("acc");String password = data.getStringExtra("pass");et_account.setText(name);et_password.setText(password);}}

五、各类布局文件

  activity_welcom.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".WelcomeActivity"><TextViewandroid:id="@+id/tv_countdown"android:layout_width="100dp"android:layout_height="60dp"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="6dp"android:layout_marginBottom="89dp"android:background="@color/Blue"android:gravity="center"android:text="3s"android:textSize="30dp" /><ImageViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:src="@mipmap/action" />
</RelativeLayout>

activity_login.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/White"android:orientation="vertical"><ImageViewandroid:id='@+id/iv'android:layout_width="match_parent"android:layout_height="30dp"android:layout_centerHorizontal="true"android:layout_marginTop="0dp"android:background="@color/Black"/><LinearLayoutandroid:id="@+id/account"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/iv"android:layout_centerVertical="true"android:layout_marginBottom="5dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:layout_marginTop="40dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_account"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="账 号"android:textColor="#000"android:background="@drawable/text_style"android:textSize="25sp" /><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/Gray"/><EditTextandroid:id="@+id/et_account"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/edit_style"android:hint="请输入账号"android:textColor="@color/Gray"android:textSize="20sp"android:gravity="center"android:inputType="text"android:padding="10dp" /></LinearLayout><LinearLayoutandroid:id="@+id/password"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@+id/account"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="10dp"android:text="密 码"android:background="@drawable/text_style"android:textColor="#000"android:textSize="25sp"/><Viewandroid:layout_width="1dp"android:layout_height="match_parent"android:background="@color/Gray"/><EditTextandroid:id="@+id/et_password"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_toRightOf="@id/tv_password"android:hint="请输入密码"android:textColor="@color/Gray"android:textSize="20sp"android:gravity="center"android:background="@drawable/edit_style"android:inputType="textPassword"android:padding="10dp"/></LinearLayout><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="40dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="@drawable/button_style"android:gravity="center"android:text="登录"android:textColor="#ffffff"android:textSize="30sp"android:layout_below="@+id/password"/><Buttonandroid:id="@+id/btn_register"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:layout_marginLeft="10dp"android:layout_marginRight="10dp"android:background="@drawable/button_style"android:gravity="center"android:text="注册"android:textColor="#ffffff"android:textSize="30sp"android:layout_below="@+id/btn_login" />
</RelativeLayout>

总结:在这次基于Android Studio的音视频播放系统设计与实现的课程设计中,我不仅掌握了一系列关键技术和工具,还对整个项目开发流程有了更深入的理解。:熟悉并掌握了Android Studio的开发环境,包括如何设置、配置项目,以及使用内置的工具如模拟器进行测试。深入了解了Android SDK和相关API,特别是与音视频播放相关的部分,如MediaPlayer、VideoView等。

此外,这次实验中,我还遇到一些数据传递中断问题,所以我还查看了一些使用断电调试的方法,也是得我掌握了一些关于断点调试的有关用法,这也让我意识到断点调试与良好的代码组织和注释习惯是相辅相成的。一个清晰、有良好注释的代码结构使得断点调试更为有效,因为你可以快速了解每一部分代码的作用和相互关系。

通过这次课程设计,我不仅提高了技术能力,更重要的是学会了如何综合运用这些技术来解决实际问题。

由于篇幅限制,此处就只放了部分代码,其实也还够用,有需要的尽可拿去用。另外在这里附上这个项目的完整代码链接https://download.csdn.net/download/weixin_74924162/89248276​​​​​​

这里分享一个做了页面美化的版本链接给有需要的伙伴:Android studio音频视频播放器课程设计(继上一个项目,这里做了稍许的美化改动以及部分功能的改动)-CSDN博客

相关文章:

Android Studio音频视频播放器课程设计

这个项目适合刚刚学习Android studio的初学者&#xff0c;实现音视频的基本播放功能&#xff0c;各项功能的页面都做的比较简单&#xff0c;特别适用于初学者&#xff0c;其特点在于本项目抛开了各种花里胡哨的制作&#xff0c;以最接近初学者的样式画面呈现&#xff0c;完全不…...

速盾:CDN是否支持屏蔽IP?

CDN&#xff08;内容分发网络&#xff09;是一种用于提高网站性能和可靠性的技术&#xff0c;通过将内容分发到距离终端用户更近的节点&#xff0c;减少了数据传输的延迟并提高了用户体验。在CDN中&#xff0c;屏蔽IP是一项重要的功能&#xff0c;可以帮助网站屏蔽无效或恶意请…...

机器学习—学习曲线

学习曲线是帮助理解学习算法如何工作的一种方法&#xff0c;作为它所拥有的经验的函数。 绘制一个符合二阶模型的学习曲线&#xff0c;多项式或二次函数&#xff0c;画出交叉验证错误Jcv&#xff0c;以及Jtrain训练错误&#xff0c;所以在这个曲线中&#xff0c;横轴将是Mtrai…...

在 macOS 和 Linux 中,波浪号 `~`的区别

文章目录 1、在 macOS 和 Linux 中&#xff0c;波浪号 ~macOS示例 Linux示例 区别总结其他注意事项示例macOSLinux 结论 2、root 用户的主目录通常是 /root解释示例切换用户使用 su 命令使用 sudo 命令 验证当前用户总结 1、在 macOS 和 Linux 中&#xff0c;波浪号 ~ 在 macO…...

【Java】实战:多数元素

一、题目描述 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例 1&#xff1a; 输入&#xff1a;nums [3,2,3] 输出&#x…...

一文解决Latex中的eps报错eps-converted-to.pdf not found: using draft setting.

在使用Vscode配的PDFLatex编译IEEE TII的Latex模板时&#xff0c;出现eps文件不能转换为pdf错误&#xff0c;看了几十篇方法都没用&#xff0c;自己研究了半天终于可以正常运行了。主要原因还是Settings.JSON中的PDFLatex模块缺少&#xff1a;"--shell-escape", 命令…...

计算光纤色散带来的相位移动 matlab

需要注意的地方 1.以下内容纯属个人理解&#xff0c;很有可能不准确&#xff0c;请大家仅做参考 2.光速不要直接用3e8 m/s&#xff0c;需要用精确的2.9979.... 3.光的频率无论在真空还是光纤(介质)都是不变的&#xff0c;是固有属性&#xff0c;但是波长lambdac/f在不同的介…...

国内docker pull拉取镜像的解决方法

访问网站&#xff0c;查找该网站上可用的镜像源&#xff0c;然后替换掉下面代码中的hub-mirror.c.163.com&#xff1a; docker pull hub-mirror.c.163.com/library/nginx:latest 另外&#xff0c;进入到镜像之后&#xff0c;可以使用下面的命令查看操作系统版本。 lsb_releas…...

“Kafka面试攻略:核心问题与高效回答”

1&#xff0c;生产者发送消息的原理 发送消息的过程中&#xff0c;涉及到两个线程&#xff0c;main线程和sender线程&#xff0c;main线程会创建一个双端队列&#xff0c;main线程向双端队列发送消息&#xff0c;sender线程从双端队列里拉取消息&#xff0c;发送给Kafka Broke…...

C++ 多线程std::thread以及条件变量和互斥量的使用

前言 本文章主要介绍C11语法中std::thread的使用&#xff0c;以及条件变量和互斥量的使用。 std::thread介绍 构造函数 std::thread 有4个构造函数 // 默认构造函&#xff0c;构造一个线程对象&#xff0c;在这个线程中不执行任何处理动作 thread() noexcept;// 移动构造函…...

新华三H3CNE网络工程师认证—子接口技术

子接口&#xff08;subinterface&#xff09;是通过协议和技术将一个物理接口&#xff08;interface&#xff09;虚拟出来的多个逻辑接口。在VLAN虚拟局域网中&#xff0c;通常是一个物理接口对应一个 VLAN。在多个 VLAN 的网络上&#xff0c;无法使用单台路由器的一个物理接口…...

【MySQL】InnoDB内存结构

目录 InnoDB内存结构 主要组成 缓冲池 缓冲池的作用 缓冲池的结构 缓冲池中页与页之间连接方式分析 缓冲池如何组织数据 控制块初始化 页面初始化 缓冲池中页的管理 缓冲区淘汰策略 查看缓冲池信息 总结 变更缓冲区-Chang Buffer 变更缓冲区的作用 主要配置选项…...

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…...

蓝桥杯每日真题 - 第19天

题目&#xff1a;&#xff08;费用报销&#xff09; 题目描述&#xff08;13届 C&C B组F题&#xff09; 解题思路&#xff1a; 1. 问题抽象 本问题可以看作一个限制条件较多的优化问题&#xff0c;核心是如何在金额和时间约束下选择最优方案&#xff1a; 动态规划是理想…...

CentOS7.9.2009的yum更换vault地窖保险库过期源,epel的archive归档源 笔记241117

CentOS7.9.2009的yum更换vault地窖保险库过期源,epel的archive归档源 笔记241117 备份 /etc/yum.repos.d 文件夹 tempUri/etc/yum.repos.d ; sudo cp -a $tempUri $tempUri.$(date %0y%0m%0d%0H%0M%0Sns%0N).bak清空 /etc/yum.repos.d 文件夹 sudo rm -rf /etc…...

Spark SQL大数据分析快速上手-完全分布模式安装

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 大数据与数据分析_夏天又到了的博客-CSDN博客 Hadoop完全分布式环境搭建步骤-CSDN博客,前置环境安装参看此博文 完全分布模式也叫集群模式。将Spark目…...

Java面试题2024-Java基础

Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、…...

局域网协同办公软件,2024安全的协同办公软件推荐

在2024年&#xff0c;随着数字化转型的深入和远程工作需求的增加&#xff0c;协同办公软件已成为企业提升工作效率、优化沟通流程的重要工具。 以下是一些值得推荐的安全的协同办公软件&#xff1a; 钉钉 功能全面&#xff1a;钉钉是一款综合性极强的企业级协同软件&#xff…...

osg、osgearth简介及学习环境准备

一、osg简介&#xff08;三维场景图渲染与调度引擎&#xff09; OSG是Open Scene Graphic 的缩写&#xff0c;OSG于1997年诞生于以为滑翔机爱好者之手&#xff0c;Don burns 为了对滑翔机的飞行进行模拟&#xff0c;对openGL的库进行了封装&#xff0c;osg的雏形就这样诞生了&…...

nodejs基于微信小程序的云校园的设计与实现

摘 要 相比于传统的校园管理方式&#xff0c;智能化的管理方式可以大幅提高校园的管理效率&#xff0c;实现了云校园管理的标准化、制度化、程序化的管理&#xff0c;有效地防止了云校园信息的不规范管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确地…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...