java基础--常用类



一、Object类

(1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。

(2)Object类的构造方法有一个,并且是无参构造,这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造

(3)要掌握的方法:

A:toString()

返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。

这个表示其实是没有意义的,一般子类都会重写该方法。

如何重写呢?基本上就是要求信息简单明了。

B:equals()

比较两个对象是否相同。默认情况下,比较的是地址值是否相同。

而比较地址值是没有意义的,所以,一般子类也会重写该方法。

(4)要了解的方法:

A:hashCode() 返回对象的哈希值。不是实际地址值,可以理解为地址值。

B:getClass() 返回对象的字节码文件对象,反射中我会详细讲解

C:finalize() 用于垃圾回收,在不确定的时间

D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。

(5)两个注意问题;

A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。

B:面试题 

==和equals()的区别?

A:==

基本类型:比较的是值是否相同

引用类型:比较的是地址值是否相同

B:equals()

只能比较引用类型。默认情况下,比较的是地址值是否相同。

但是,我们可以根据自己的需要重写该方法。


二、Scanner的使用(了解)

(1)在JDK5以后出现的用于键盘录入数据的类。

(2)构造方法:

A:讲解了System.in这个东西。

它其实是标准的输入流,对应于键盘录入

B:构造方法

InputStream is = System.in;

Scanner(InputStream is)

C:常用的格式

Scanner sc = new Scanner(System.in);

(3)基本方法格式:

A:hasNextXxx() 判断是否是某种类型的

B:nextXxx() 返回某种类型的元素

(4)要掌握的两个方法

A:public int nextInt()

B:public String nextLine()

import java.util.Scanner;

/*
 * 基本格式:
 * 		public boolean hasNextXxx():判断是否是某种类型的元素
 * 		public Xxx nextXxx():获取该元素
 * 
 * 举例:用int类型的方法举例
 * 		public boolean hasNextInt()
 * 		public int nextInt()
 * 
 * 注意:
 * 		InputMismatchException:输入的和你想要的不匹配
 */
public class ScannerDemo {
	public static void main(String[] args) {
		// 创建对象
		Scanner sc = new Scanner(System.in);

		// 获取Int类型数据
		if (sc.hasNextInt()) {
			int x = sc.nextInt();
			System.out.println("x:" + x);
		} else {
			System.out.println("你输入的数据有误");
		}
	}
}


三、String类的概述和使用

(1)多个字符组成的一串数据。

其实它可以和字符数组进行相互转换。

(2)构造方法:

A:public String()

B:public String(byte[] bytes)

C:public String(byte[] bytes,int offset,int length)

D:public String(char[] value)

E:public String(char[] value,int offset,int count)

F:public String(String original)

下面的这一个虽然不是构造方法,但是结果也是一个字符串对象

G:String s = "hello";

(3)字符串的特点

A:字符串一旦被赋值,就不能改变。

注意:这里指的是字符串的内容不能改变,而不是引用不能改变。

B:字面值作为字符串对象和通过构造方法创建对象的不同

String s = new String("hello");和String s = "hello"的区别?

(4)字符串的面试题(看程序写结果)

A:==和equals()

		String s1 = new String("hello");
		String s2 = new String("hello");
		System.out.println(s1 == s2);// false
		System.out.println(s1.equals(s2));// true

		String s3 = new String("hello");
		String s4 = "hello";
		System.out.println(s3 == s4);// false
		System.out.println(s3.equals(s4));// true

		String s5 = "hello";
		String s6 = "hello";
		System.out.println(s5 == s6);// true
		System.out.println(s5.equals(s6));// true


B:字符串的拼接

		String s1 = "hello";
		String s2 = "world";
		String s3 = "helloworld";
		System.out.println(s3 == s1 + s2);// false
		System.out.println(s3.equals((s1 + s2)));// true

		System.out.println(s3 == "hello" + "world");// true
		System.out.println(s3.equals("hello" + "world"));// true


(5)字符串的功能

A:判断功能

boolean equals(Object obj)  比较字符串的内容是否相同,区分大小写

boolean equalsIgnoreCase(String str)  比较字符串的内容是否相同,忽略大小写

boolean contains(String str)   判断大字符串中是否包含小字符串

boolean startsWith(String str)  判断字符串是否以某个指定的字符串开头

boolean endsWith(String str)  判断字符串是否以某个指定的字符串结尾

boolean isEmpty()  判断字符串是否为空

B:获取功能

int length()   获取字符串的长度

char charAt(int index)   获取指定索引位置的字符

int indexOf(int ch)   返回指定字符在此字符串中第一次出现处的索引

int indexOf(String str)   返回指定字符串在此字符串中第一次出现处的索引

int indexOf(int ch,int fromIndex)   返回指定字符在此字符串中从指定位置后第一次出现处的索引

int indexOf(String str,int fromIndex)   返回指定字符串在此字符串中从指定位置后第一次出现处的索引

String substring(int start)   从指定位置开始截取字符串,默认到末尾

String substring(int start,int end) 从指定位置开始到指定位置结束截取字符串

C:转换功能

byte[] getBytes() 把字符串转换为字节数组

char[] toCharArray() 把字符串转换为字符数组

static String valueOf(char[] chs) 把字符数组转成字符串

static String valueOf(int i) 把int类型的数据转成字符串

String toLowerCase() 把字符串转成小写

String toUpperCase() 把字符串转成

String concat(String str) 把字符串拼接

D:替换功能

String replace(char old,char new)

String replace(String old,String new)

E:去空格功能

String trim()

F:按字典比较功能

int compareTo(String str)

int compareToIgnoreCase(String str) 

(6)字符串的案例:统计大串中小串出现的次数

/*
 * 统计大串中小串出现的次数
 * 举例:
 * 		在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"
 * 结果:
 * 		java出现了5次
 * 
 * 分析:
 * 		前提:是已经知道了大串和小串。
 * 
 * 		A:定义一个统计变量,初始化值是0
 * 		B:先在大串中查找一次小串第一次出现的位置
 * 			a:索引是-1,说明不存在了,就返回统计变量
 * 			b:索引不是-1,说明存在,统计变量++
 * 		C:把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
 * 		D:回到B
 */
public class StringTest {
	public static void main(String[] args) {
		// 定义大串
		String maxString = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
		// 定义小串
		String minString = "java";

		// 写功能实现
		int count = getCount(maxString, minString);
		System.out.println("Java在大串中出现了:" + count + "次");
	}

	/*
	 * 两个明确: 返回值类型:int 参数列表:两个字符串
	 */
	public static int getCount(String maxString, String minString) {
		// 定义一个统计变量,初始化值是0
		int count = 0;

		// 先在大串中查找一次小串第一次出现的位置
		int index = maxString.indexOf(minString);

		// 索引不是-1,说明存在,统计变量++
		while (index != -1) {
			count++;
			// 把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
			int startIndex = index + minString.length();
			maxString = maxString.substring(startIndex);
			// 继续查
			index = maxString.indexOf(minString);
		}

		return count;
	}
}


四、StringBuffer

(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类。StringBuffer供我们使用。

(2)StringBuffer的构造方法

A:StringBuffer() 无参构造方法

B:StringBuffer(int size) 指定容量的字符串缓冲区对象

C:StringBuffer(String str) 指定字符串内容的字符串缓冲区对象

(3)StringBuffer的常见功能

A:添加功能

public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身

public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身

B:删除功能

public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身

public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身

C:替换功能

public StringBuffer replace(int start,int end,String str):从start开始到end用str替换

D:反转功能

public StringBuffer reverse()

E:截取功能(注意返回值类型不再是StringBuffer本身了)

public String substring(int start)从指定位置开始截取字符串,默认到末尾

public String substring(int start,int end)从指定位置开始到指定位置结束截取字符串

(4)StringBuffer的小应用

String和StringBuffer相互转换

String  --StringBuffer

		String s = "hello";
		// 方式1:通过构造方法
		StringBuffer sb = new StringBuffer(s);
		// 方式2:通过append()方法
		StringBuffer sb2 = new StringBuffer();
		sb2.append(s);

StringBuffer -- String

		// 方式1:通过构造方法
		String str = new String(buffer);
		// 方式2:通过toString()方法
		String str2 = buffer.toString();

(5)面试题

小细节:

StringBuffer:同步的,数据安全,效率低。

StringBuilder:不同步的,数据不安全,效率高。

A:String,StringBuffer,StringBuilder的区别

1、String是内容不可变的,而StringBuffer,StringBuilder都是内容可变的

2、StringBuffer是同步的,数据安全,效率低;StringBuilder是不同步的,数据不安全,效率高

B:StringBuffer和数组的区别?

二者都可以看出是一个容器,装其他的数据

但是呢,StringBuffer的数据最终是一个字符串数据

而数组可以放置多种数据,但必须是同一种数据类型的


五、数组高级以及Arrays

(1)排序

A:冒泡排序

相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他的元素。

/*
 * 数组排序之冒泡排序:
 * 	相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处。同理,其他元素
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);
		
		bubbleSort(arr);//排序
		System.out.println("排序后:");
		printArray(arr);
	}
	
	//冒泡排序代码
	public static void bubbleSort(int[] arr){
		for (int x = 0; x < arr.length - 1; x++) {
			for (int y = 0; y < arr.length - 1 - x; y++) {
				if (arr[y] > arr[y + 1]) {
					int temp = arr[y];
					arr[y] = arr[y + 1];
					arr[y + 1] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}
}

B:选择排序

把0索引的元素,和索引1以后的元素都进行比较,第一次完毕,最小值出现在了0索引。同理,其他的元素。

/*
 * 数组排序之选择排序:
 * 		从0索引开始,依次和后面元素比较,小的往前放,第一次完毕,最小值出现在了最小索引处
 */
public class ArrayDemo {
	public static void main(String[] args) {
		// 定义一个数组
		int[] arr = { 24, 69, 80, 57, 13 };
		System.out.println("排序前:");
		printArray(arr);

		selectSort(arr);//排序
		System.out.println("排序后:");
		printArray(arr);

	}
	//选择排序
	public static void selectSort(int[] arr){
		for(int x=0; x<arr.length-1; x++){
			for(int y=x+1; y<arr.length; y++){
				if(arr[y] <arr[x]){
					int temp = arr[x];
					arr[x] = arr[y];
					 arr[y] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printArray(int[] arr) {
		System.out.print("[");
		for (int x = 0; x < arr.length; x++) {
			if (x == arr.length - 1) {
				System.out.print(arr[x]);
			} else {
				System.out.print(arr[x] + ", ");
			}
		}
		System.out.println("]");
	}
}


(2)查找

A:基本查找

针对数组无序的情况

	public static int getIndex(int[] arr, int value) {
		int index = -1;

		for (int x = 0; x < arr.length; x++) {
			if (arr[x] == value) {
				index = x;
				break;
			}
		}

		return index;


B:二分查找(折半查找)

针对数组有序的情况(千万不要先排序,在查找)

/*
 * 查找:
 * 		二分查找(折半查找):数组元素有序
 * 
 * 分析:
 * 		A:定义最大索引,最小索引
 * 		B:计算出中间索引
 * 		C:拿中间索引的值和要查找的值进行比较
 * 			相等:就返回当前的中间索引
 * 			不相等:
 * 				大	左边找
 * 				小	右边找
 * 		D:重新计算出中间索引
 * 			大	左边找
 * 				max = mid - 1;
 * 			小	右边找
 * 				min = mid + 1;
 * 		E:回到B
 */
public class ArrayDemo {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = {11,22,33,44,55,66,77};
		
		//写功能实现
		int index = getIndex(arr, 33);
		System.out.println("index:"+index);
		
		//假如这个元素不存在后有什么现象呢?
		index = getIndex(arr, 333);
		System.out.println("index:"+index);
	}
	
	/*
	 * 两个明确:
	 * 返回值类型:int
	 * 参数列表:int[] arr,int value
	 */
	public static int getIndex(int[] arr,int value){
		//定义最大索引,最小索引
		int max = arr.length -1;
		int min = 0;
		
		//计算出中间索引
		int mid = (max +min)/2;
		
		//拿中间索引的值和要查找的值进行比较
		while(arr[mid] != value){
			if(arr[mid]>value){
				max = mid - 1;
			}else if(arr[mid]<value){
				min = mid + 1;
			}
			
			//加入判断
			if(min > max){
				return -1;
			}
			
			mid = (max +min)/2;
		}
		
		return mid;
	}
}


(3)Arrays工具类

A:是针对数组进行操作的工具类。包括排序和查找等功能。

B:要掌握的方法

public static String toString(int[] a) 把数组转成字符串

public static void sort(int[] a) 对数组进行排序

public static int binarySearch(int[] a,int key) 二分查找


六、Integer

(1)为了让基本类型的数据进行更多的操作,Java就为每种基本类型提供了对应的包装类类型

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

(2)Integer的构造方法

A:Integer i = new Integer(100);

B:Integer i = new Integer("100");

注意:这里的字符串必须是由数字字符组成

(3)String和int的相互转换

A:String -- int

Integer.parseInt("100");

B:int -- String

String.valueOf(100);

(4)其他的功能(了解)

进制转换

(5)JDK5的新特性

自动装箱 基本类型--引用类型

自动拆箱 引用类型--基本类型

(6)面试题

-128到127之间的数据缓冲池问题:

Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据,并不创建新的空间


七、Character(了解)

(1)Character构造方法

Character ch = new Character('a');

(2)要掌握的方法:

public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符

public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符

public static boolean isDigit(char ch):判断给定的字符是否是数字字符

public static char toUpperCase(char ch):把给定的字符转换为大写字符

public static char toLowerCase(char ch):把给定的字符转换为小写字符


八、Math

(1)针对数学运算进行操作的类

(2)常见方法

public static int abs(int a):绝对值
public static double ceil(double a): 向上取整
public static double floor(double a): 向下取整
public static int max(int a,int b): 最大值 (min自学)
public static double pow(double a,double b): a的b次幂
public static double random(): 随机数 [0.0,1.0)
public static int round(float a): 四舍五入(参数为double的自学)
public static double sqrt(double a): 正平方根

(3)案例:

获取任意范围的随机数

/*
 * 需求:请设计一个方法,可以实现获取任意范围内的随机数。
 * 
 * 分析:
 * 		A:键盘录入两个数据。
 * 			int strat;
 * 			int end;
 * 		B:想办法获取在start到end之间的随机数
 * 			我写一个功能实现这个效果,得到一个随机数。(int)
 * 		C:输出这个随机数
 */
public class MathDemo {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入开始数:");
		int start = sc.nextInt();
		System.out.println("请输入结束数:");
		int end = sc.nextInt();

		for (int x = 0; x < 100; x++) {
			// 调用功能
			int num = getRandom(start, end);
			// 输出结果
			System.out.println(num);
		}
	}

	/*
	 * 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end
	 */
	public static int getRandom(int start, int end) {
//		 int number = (int) (Math.random() * 100) + 1;
//		 int number = (int) (Math.random() * end) + start; //但是如果数据100以上会出现问题,所以改成下面
		int number = (int) (Math.random() * (end - start + 1)) + start;
		return number;
	}
}


九、Random(理解)

(1)用于产生随机数的类

(2)构造方法:

A:Random() 默认种子,每次产生的随机数不同

B:Random(long seed) 指定种子,每次种子相同,随机数就相同

(3)成员方法:

A:int nextInt() 返回int范围内的随机数

B:int nextInt(int n) 返回[0,n)范围内的随机数


十、System

(1)系统类,提供了一些有用的字段和方法

(2)成员方法

public static void gc():运行垃圾回收器运行垃圾回收器

public static void exit(int status):退出jvm,根据惯例,非 0 的状态码表示异常终止

public static long currentTimeMillis():获取当前时间的毫秒值

public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length):从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。


十一、BigInteger(理解)

(1)针对大整数的运算

(2)构造方法

BigInteger(String val)

(3)成员方法

public BigInteger add(BigInteger val) :加

public BigInteger subtract(BigInteger val) :减

public BigInteger multiply(BigInteger val) :乘

public BigInteger divide(BigInteger val) :除

public BigInteger[]  divideAndRemainder(BigInteger val) :返回商和余数的数组


十二、BigDecimal(理解)

(1)浮点数据做运算,会丢失精度。所以,针对浮点数据的操作建议采用BigDecimal。(金融相关的项目)

(2)构造方法

BigDecimal(String s)

(3)成员方法:

public BigDecimal  add(BigDecimal  augend)   加

public BigDecimal  subtract(BigDecimal  subtrahend)   减

public BigDecimal  multiply(BigDecimal  multiplicand)   乘

public BigDecimal  divide(BigDecimal  divisor)   除

public BigDecimal  divide(BigDecimal  divisor,int  scale, int  roundingMode)   商,几位小数,如何舍取



十三、Date/DateFormat

(1)Date是日期类,可以精确到毫秒。

A:构造方法

Date() 根据当前的默认毫秒值创建日期对象

Date(long time)  根据给定的毫秒值创建日期对象

B:成员方法

public long getTime():获取时间,以毫秒为单位

public void setTime(long time):设置时间

C:日期和毫秒值的相互转换

Date --String(格式化)

public final String format(Date date)

String -- Date(解析)

public Date parse(String source)

/*
 * Date	 --	 String(格式化)
 * 		public final String format(Date date)
 * 
 * String -- Date(解析)
 * 		public Date parse(String source)
 * 
 * DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat。
 * 
 * SimpleDateFormat的构造方法:
 * 		SimpleDateFormat():默认模式
 * 		SimpleDateFormat(String pattern):给定的模式
 * 			这个模式字符串该如何写呢?
 * 			通过查看API,我们就找到了对应的模式
 * 			年 y
 * 			月 M	
 * 			日 d
 * 			时 H
 * 			分 m
 * 			秒 s
 * 
 * 			2014年12月12日 12:12:12
 */
public class DateFormatDemo {
	public static void main(String[] args) throws ParseException {
		// Date -- String
		// 创建日期对象
		Date d = new Date();
		// 创建格式化对象
		// SimpleDateFormat sdf = new SimpleDateFormat();
		// 给定模式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		// public final String format(Date date)
		String s = sdf.format(d);
		System.out.println(s);
		
		
		//String -- Date
		String str = "2008-08-08 12:12:12";
		//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date dd = sdf2.parse(str);
		System.out.println(dd);
	}
}


案例:你来到这个世界多少天了?

/*
 * 算一下你来到这个世界多少天?
 * 
 * 分析:
 * 		A:键盘录入你的出生的年月日
 * 		B:把该字符串转换为一个日期
 * 		C:通过该日期得到一个毫秒值
 * 		D:获取当前时间的毫秒值
 * 		E:用D-C得到一个毫秒值
 * 		F:把E的毫秒值转换为年
 * 			/1000/60/60/24
 */
public class MyYearOldDemo {
	public static void main(String[] args) throws ParseException {
		// 键盘录入你的出生的年月日
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你的出生年月日:");
		String line = sc.nextLine();

		// 把该字符串转换为一个日期
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = sdf.parse(line);

		// 通过该日期得到一个毫秒值
		long myTime = d.getTime();

		// 获取当前时间的毫秒值
		long nowTime = System.currentTimeMillis();

		// 用D-C得到一个毫秒值
		long time = nowTime - myTime;

		// 把E的毫秒值转换为年
		long day = time / 1000 / 60 / 60 / 24;

		System.out.println("你来到这个世界:" + day + "天");
	}
}


十四、Calendar

(1)日历类,封装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。

(2)如何得到一个日历对象呢?

Calendar rightNow = Calendar.getInstance();

本质返回的是子类对象

(3)成员方法

A:根据日历字段得到对应的值

public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型

public class CalendarDemo {
	public static void main(String[] args) {
		// 其日历字段已由当前日期和时间初始化:
		Calendar rightNow = Calendar.getInstance(); // 子类对象

		// 获取年
		int year = rightNow.get(Calendar.YEAR);
		// 获取月
		int month = rightNow.get(Calendar.MONTH);
		// 获取日
		int date = rightNow.get(Calendar.DATE);

		System.out.println(year + "年" + (month + 1) + "月" + date + "日");
	}
}

B:根据日历字段和一个正负数确定是添加还是减去对应日历字段的值

public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作

C:设置日历对象的年月日

public final void set(int year,int month,int date):设置当前日历的年月日

(4)案例:

计算任意一年的2月份有多少天?

/*
 * 获取任意一年的二月有多少天
 * 
 * 分析:
 * 		A:键盘录入任意的年份
 * 		B:设置日历对象的年月日
 * 			年就是A输入的数据
 * 			月是2
 * 			日是1
 * 		C:把时间往前推一天,就是2月的最后一天
 * 		D:获取这一天输出即可
 */
public class CalendarTest {
	public static void main(String[] args) {
		// 键盘录入任意的年份
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入年份:");
		int year = sc.nextInt();

		// 设置日历对象的年月日
		Calendar c = Calendar.getInstance();
		c.set(year, 2, 1); // 其实是这一年的3月1日
		// 把时间往前推一天,就是2月的最后一天
		c.add(Calendar.DATE, -1);

		// 获取这一天输出即可
		System.out.println(c.get(Calendar.DATE));
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值