Kotlin学习日志(二)数据类型(1)

| 整型 | Int | int 和 Integer |

| 长整型 | Long | long 和 Long |

| 浮点型 | Float | float 和 Float |

| 双精度 | Double | double 和 Double |

| 布尔类型 | Boolean | boolean 和 Boolean |

| 字符型 | Char | char |

| 字符串 | String | String |

这样就很立体了吧,请注意小写和大写的区别,Java中严格区分大小写的。

1.1变量声明


接下来声明一个变量了,

Java的写法如下:

int i = 0;

Kotlin的写法如下:

var i:Int = 0

解释:上面的 var 表示后面是一个变量声明语句,后面是“变量名:变量类型”的格式声明,不同于Java中常见的“变量类型:变量名”这种格式,(PS:这个在刚开始接触Kotlin的时候很容易搞混,用久了就可以了),后面是没有分号的,Java则有,在Kotlin中如果你后面还有其他语句的话则要加上分号,如果无其他语句则回车换行就行,不需要加分号,如下图所示:

在这里插入图片描述

1.2变量转换


Kotlin中进行数据转换和Java中不同,就不一一对比了,直接说Kotlin中如何进行数据类型转换,Kotlin中都是使用类型转换函数来进行数据类型转换的,让我们来认识一下,如下表

| Kotlin的数据类型转换函数 | 转换函数说明 |

| — | — |

| toInt | 转换为整型 |

| toLong | 转换为长整型 |

| toFloat | 转换为浮点数 |

| toDouble | 转换为双精度数 |

| toChar | 转换为字符 |

| toString | 转换为字符串 |

接下来我们用代码来演示一下:

修改一下布局文件如下

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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:orientation=“vertical”

android:gravity=“center_horizontal”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<TextView

android:layout_marginTop=“20dp”

android:id=“@+id/tv_data”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_toInt”

android:text=“转换为整型”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_toLong”

android:text=“转换为长整型”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_toDouble”

android:text=“转换为双精度数”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_toChar”

android:text=“转换为字符”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

然后是MainActivity.kt代码

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

val data:Float = 65.0f

tv_data.text = data.toString()

//转整数型

btn_toInt.setOnClickListener {

var dataInt:Int = data.toInt()

tv_data.text = dataInt.toString()

}

//转长整数型

btn_toLong.setOnClickListener {

var dataLong:Long = data.toLong()

tv_data.text = dataLong.toString()

}

//转双精度数

btn_toDouble.setOnClickListener {

var dataDouble:Double = data.toDouble()

tv_data.text = dataDouble.toString()

}

//转字符

btn_toChar.setOnClickListener {

var dataChar:Char = data.toChar()

tv_data.text = dataChar.toString()

}

}

}

上面的代码是比较好理解的,一开始我们定义了一个val data:Float

这里的val相当于Java的final,然后赋值给TextView显示出来,接下来点击Button按钮来转换data的值,不同的按钮对应不同的值。

二、数组

=================================================================

说到数组,我们首先看一下Java中的声明数组并初始化

int[] int_array = new int[] {1,2,3};

然后是Kotlin中声明数组并初始化

var int_array:IntArray = intArrayOf(1,2,3)

两者对比,对于同一整型数组的声明,KotlinJava之间有以下区别:

(1) Kotlin另外提供了新的整型数组类型,即IntArray

(2) 分配一个常量数组,Kotlin调用的是 intArrayOf 方法,并不使用new关键字

下面用一个表格来详细说明Kotlin的数组类型及初始化方法

| Kotlin的基本数组类型 | 数据类型的名称 | 数组类型的初始化方法 |

| — | — | — |

| 整型数组 | IntArray | intArrayOf |

| 长整型数组 | LongArray | longArrayOf |

| 浮点数组 | FloatArray | floatArrayOf |

| 双精度数组 | DoubleArray | doubleArrayOf |

| 布尔类型数组 | BooleanArray | booleanArrayOf |

| 字符型数组 | CharArray | charArrayOf |

下面是这些基本类型数组的初始化例子:

var int_array:IntArray = intArrayOf(1,2,3)

var long_array:LongArray = longArrayOf(1,2,3)

var float_array:FloatArray = floatArrayOf(1.0f,2.0f,3.0f)

var double_array:DoubleArray = doubleArrayOf(1.0,2.0,3.0)

var boolean_array:BooleanArray = booleanArrayOf(false,true,false)

var char_array:CharArray = charArrayOf(‘A’,‘B’,‘C’)

我们是不是少了一个数据类型呢,对了就是字符串数组,这个和在Java中是不一样的,Kotlin中不存在名为StringArray的数组类型,因为String是一种特殊的基本数据类型,要想在Kotlin中声明字符串数组,得使用Array<String>类型,同时,分配字符串数组的方法也变成了arrayOf,下面是Kotlin中声明字符串数组的代码示例

var string_array:Array = arrayOf(“One”,“Two”,“Three”)

这个方式就和Java的代码比较相像了,既然字符串数组可以这样写,那个其他的数据类型同样可以这么写,如下所示:

var int_array:Array = arrayOf(1,2,3)

var long_array:Array = arrayOf(1,2,3)

var float_array:Array = arrayOf(1.0f,2.0f,3.0f)

var double_array:Array = arrayOf(1.0,2.0,3.0)

var boolean_array:Array = arrayOf(false,true,false)

var char_array:Array = arrayOf(‘A’,‘B’,‘C’)

了解了数组的声明与初始化,接下来就是操作这个数组了,

2.1数组元素的操作


对于数组的操作,常见的处理包括获取数组的长度、获取指定位置的数组元素,这些操作在Kotlin与Java中是有区别的,如下:

(1)获取数组长度,Java使用**.length**,Kotlin使用**.size**(PS:前面有一个点)

(2)获取指定位置的数组元素,Java通过方括号加下标来获取,比如“ string_array[2]”(PS:获取该数组的第三个元素,下标是从0开始的),Kotlin也能通过方括号加下标来获取指定元素,不过Kotlin还有getset两个方法,通过get方法获取元素值,通过set方法修改元素值,我们演示一下,代码如下:

布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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:orientation=“vertical”

android:gravity=“center_horizontal”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<TextView

android:layout_marginTop=“20dp”

android:id=“@+id/tv_item”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_string”

android:text=“测试”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

//声明字符串数组

var string_array:Array = arrayOf(“Day”,“Day”,“Up”)

btn_string.setOnClickListener {

var str:String = “”

var i:Int = 0

while (i<string_array.size){

//数组元素通过下标访问

// str = str + string_array[i] + “,”

//数组元素通过get方法访问

str = str + string_array.get(i) + “,”

i++

}

tv_item.text = str

}

}

}

运行效果图如下

在这里插入图片描述

代码也比较简单,说明一下,先声明一个字符串数组,在点击按钮的代码中,声明一个String变量,一个Int变量,并初始化,然后使用while循环,判断String数组的长度大于变量 i,当条件不满足时跳出循环,并显示最终结果在TextView上,循环中的逻辑也比较简单,取出i对应的数组元素,赋值给str,并用逗号隔开,取出的方式可以自选其一,这里就不过多的赘述了,赋值完成之后,i++,这是i就变成1,然后取数组中第二个值,再加一,变成2,取第三个值,再加一,变成3,3>3?,条件不满足,跳出循环,此时就将数组中的值都取出来了,(PS:我相信有基础的人会觉得我很啰嗦,但是这是必要的,后面会精简的),数组的操作就是这样了。

三、字符串

==================================================================

3.1字符串与基本类型的转换


这里我们对比一下Java的转换方式,如下表:

| 字符串转换目标 | Kotlin的转换方式 | Java的转换方式 |

| — | — | — |

| 字符串转整型 | 字符串变量的toInt方法 | Integer.parseInt(字符串变量) |

| 字符串转长整型 | 字符串变量的toLong方法 | Long.parseInt(字符串变量) |

| 字符串转浮点数 | 字符串变量的toFloat方法 | Float.parseInt(字符串变量) |

| 字符串转双精度数 | 字符串变量的toDouble方法 | Double.parseInt(字符串变量) |

| 字符串转布尔类型 | 字符串变量的toBoolean方法 | Boolean.parseInt(字符串变量) |

| 字符串转字符数组 | 字符串变量的toCharArray方法 | 字符串变量的toCharArray方法 |

可以看到Kotlin相对于Java的转换要简单一些,通过方法即可实现。

3.2字符串的常用方法


常用方法:查找子串、替换子串、截取指定位置的子串、按特定字符分隔子串等,在这方面Kotlin基本兼容Java的相关方法,

1.查找子串,都调用indexOf方法。

2.截取指定位置子串,都调用substring方法。

3.替换子串,都调用replace方法。

4.按特定字符分隔子串,都调用split方法

下面是查找和截取的使用示例:

布局文件代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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:orientation=“vertical”

android:gravity=“center_horizontal”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<LinearLayout

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“初始值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:text=“200.56”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_data”/>

<LinearLayout

android:visibility=“gone”

android:id=“@+id/result_lay”

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“结果值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_result”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_substring”

android:text=“截取字符串”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import android.view.View

import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

//截取小数点之前的字符串

//1.获取要截取的字符串

var data:String = tv_data.text.toString()

//2.声明一个结果值

var result:String = data

btn_substring.setOnClickListener {

//查找目标字符,

if(result.indexOf(‘.’) > 0){

//如果有,则截取,substring有两个参数,

// 分别是startIndex开始位置和endIndex结束位置,从第一个字节开始,到小数点停止,之间的内容

result = result.substring(0,result.indexOf(‘.’))

//结果赋值

tv_result.text = result

//控件显示 一开始我隐藏了,所以这个时候显示

result_lay.visibility = View.VISIBLE

}

}

}

}

运行效果图如下:

在这里插入图片描述

在这里插入图片描述

代码的解释我都已经写好了,一目了然。

接下来是替换字符串,使用replace方法,如下所示:

我们在布局文件activity_main.xml文件中添加如下代码

<LinearLayout

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“初始值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:text=“abcabcabcabcabcabc”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_replace_data”/>

<LinearLayout

android:visibility=“gone”

android:id=“@+id/replace_result_lay”

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“结果值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_replace_result”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_replace”

android:text=“替换字符串”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

在MainActivity.kt中新增如下代码:

//替换字符串

var replaceData:String = tv_replace_data.text.toString()

btn_replace.setOnClickListener {

if(replaceData.indexOf(‘c’) > 0){

//replace方法也有两个参数,oldChar 要替换的目标字符,newChar替换后的字符,我们把c替换成a

tv_replace_result.text = replaceData.replace(‘c’,‘a’)

replace_result_lay.visibility = View.VISIBLE

}

}

运行效果如下图所示:

在这里插入图片描述

最后我们再写上截取字符串的示例代码

activity_main.xml文件中再加上如下代码

<LinearLayout

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“初始值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:text=“abc_def_ghi_jkl_mno_pqr”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_split_data”/>

<LinearLayout

android:visibility=“gone”

android:id=“@+id/split_result_lay”

android:layout_marginTop=“20dp”

android:gravity=“center”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

<TextView

android:textColor=“#000”

android:text=“结果值:”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content” />

<TextView

android:textColor=“#000”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:id=“@+id/tv_split_result”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_split”

android:text=“替换字符串”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt里面中新增如下代码:

//截取字符串

var splitData:String = tv_split_data.text.toString()

btn_split.setOnClickListener {

if(splitData.indexOf(‘_’) > 0){

// split方法我们只要用到一个参数,就是我们要截取的字符,我们将下划线截掉,截取的值用List装起来再toString显示出来

var strList:List = splitData.split(“_”)

tv_split_result.text = strList.toString()

split_result_lay.visibility = View.VISIBLE

}

}

运行效果如下图

在这里插入图片描述

现在常用的方法都介绍完毕了,(PS:讲真的,挺繁琐的)

3.2字符串模板及拼接


Kotlin格式化字符串,

在这里插入图片描述

在这里插入图片描述

var str:String = “How Are You”

btn_format.setOnClickListener { btn_format.text = “你好吗?$str” }

我们可以看到,Kotlin中拼接字符串是很简单的,在$后面跟变量名即可,另外有可能变量会先进行计算,再把运算结果拼接到字符串中,此时需要用大括号把运算表达式给括起来,如下所示

布局文件中加一个按钮

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_can_format”

android:text=“计算字符串”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

代码中

var dangerous:String = “dangerous”

btn_can_format.setOnClickListener { btn_can_format.text = “危险${dangerous.length}” }

在上面的Kotlin代码中,我们频繁用到了 $ ,美元符号,它在Kotlin中属于特殊字符,因此不能直接打印,需要经过转义后方可打印,转义的方法是使用${’***’}表达式,该表达式外层的“ ${‘’} ”为转义声明,内层的“ ** ”为需要原样输出的字符串,如下所示:

写个按钮

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_dollar”

android:text=“美元符号”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

代码中

var money:Int = 10

btn_dollar.setOnClickListener { btn_dollar.text = “美元金额为KaTeX parse error: Expected '}', got 'EOF' at end of input: {''}$money” }

还有另一种方式,针对于单个美元符号,如下所示:

btn_dollar.setOnClickListener { btn_dollar.text = “美元金额为$$money” }

字符串的讲解大致就这些了

四、容器

=================================================================

与Java类似,Kotlin也拥有三类基本的容器,分别是集合Set、队列List、映射Map,然后每类容器又分作只读与可变两种类型,这是为了判断该容器能否进行增、删、改等变更操作,Kotlin对变量的修改操作很慎重,每个变量在定义的时候就必须指定能否修改,比如添加val修饰表示该变量不可修改,添加var修饰表示该变量允许修改。至于容器则默认为只读容器,如果需要允许修改该容器变量,就需要加上Mutable前缀形成新的容器,比如MutableSet表示可变集合,MutableList表示可变队列,MutableMap表示可变映射,只有可变的容器才能够对其内部元素进行增、删、改操作。

既然集合Set、队列List、映射Map三者都属于容器,那么他们必定拥有相同的容器方法,一些公共方法具体说明说下。

isEmpty 判断该容器是否为空。

isNotEmpty 判断该容器是否非空。

clear 清空该容器。

contains 判断该容器是否包含指定元素。

iterator 获取该容器的迭代器。

count 获取该容器包含的元素个数,也可通过size来获取。

另外,Kotlin允许在声明容器变量是就进行初始赋值,这一点在Java中是不行的,当然,不同容器的初始化方法有所不同,如下表所示

| kotlin的容器 | 容器名称 | 容器的初始化方法 |

| — | — | — |

| 只读集合 | Set | setOf |

| 可变集合 | MutableSet | mutableSetOf |

| 只读队列 | List | listOf |

| 可变队列 | MutableList | mutableListOf |

| 只读映射 | Map | mapOf |

| 可变映射 | MutableMap | mutableMapOf |

下面我们逐个来讲解

4.1 集合Set/MutableSet


集合是一种最简单的容器,它有以下特性:

(1)容器内部的元素不按顺序排列,因此无法按照下标进行访问。

(2)容器内部的元素存在唯一性,通过哈希值校验是否存在相同的元素,若存在,则将其覆盖。

因为Set是只读集合,初始化赋值后便不可更改,所以元素变更的方法只适用于可变集合MutableSet,但MutableSet的变更操作尚有以下限制

(1)MutableSetadd方法仅仅在集合中添加元素,由于集合是无序的,因此不知道添加的具体位置。

(2)MutableSet没有修改元素值的方法,一个元素一旦被添加,就不可被修改。

(3)MutableSetremove方法用于删除指定元素,但无法删除某一个位置的元素,这是因为集合的元素不是按照顺序来排列的。

对于集合的便利操作,Kotlin提供了好几种方式,有熟悉的for - in 循环、迭代器遍历,还有新的面孔forEach,下面一一进行说明

1.for-in循环

示例如下:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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:orientation=“vertical”

android:gravity=“center_horizontal”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<TextView

android:layout_marginTop=“20dp”

android:textColor=“#000”

android:padding=“20dp”

android:id=“@+id/tv_set_result”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_set_for”

android:text=“for-in”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import kotlinx.android.synthetic.main.activity_main.*

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
d=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”

android:orientation=“vertical”

android:gravity=“center_horizontal”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

tools:context=“.MainActivity”>

<TextView

android:layout_marginTop=“20dp”

android:textColor=“#000”

android:padding=“20dp”

android:id=“@+id/tv_set_result”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”/>

<Button

android:layout_marginTop=“20dp”

android:id=“@+id/btn_set_for”

android:text=“for-in”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”/>

MainActivity.kt

package com.llw.kotlinstart

import androidx.appcompat.app.AppCompatActivity

import android.os.Bundle

import kotlinx.android.synthetic.main.activity_main.*

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-5CuoNW09-1715671574194)]

[外链图片转存中…(img-Vi9rK5gZ-1715671574197)]

[外链图片转存中…(img-VYbVCO0p-1715671574199)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值