Java复习
在开篇前首先申明一下,本文虽不够系统,但复习够用,尤其是快速回忆( •̀ ω •́ )✧与提问。
主打一个速度。
本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。
一、Java的基础语法:
1、Java入门
JRE和JDK
JDK:分为三大类:Jvm(虚拟机)、核心类库,开发工具;
核心类库:javac编译工具;java运行工具;jdb调试工具;jhat内存分析工具;
JRE:运行工具;
备注:
单行备注( // );多行备注( /* */ );文档备注( /** */ );
2、小概念
public class HelloWorld{}
// class: 用于(创建/定义)一个类,类是Java最基本的组成单元
包:
包 (package) 是组织类的一种方式。使用包的主要目的是保证类的唯一性
类与对象:
所谓对象,就是类产生的一个实体。
例如:盖房子的图纸就是java类,根据这个图纸修建起来的能够被看到的就相当于对象。java类实际是一个抽象意义上的概念,对象就是通过这个Java类的抽象概念具体化之后的的具体的一个概念。
总结:
1、java类是构成对象的模板。
2、对象就是这个模板的具现后的具体现实。
关键字
被Java赋予了特定含义的英文单词;(class关键字,后面跟随类名)
变量:
整数变量,小数变量。(这两个能直接写在System.out.println()后的()中,如(1),(1.900)等等)
字串类型(" "),字符类型(' ')。
布尔类型(true false),空类型(null,但在输入空类型时,需要加字符串如" " )。
一般用boolean类型时,不要用==号(例:boolean a=true;if(a)...就可以运行。)
成员变量:
成员变量、类中方法外。
局部变量:
局部变量、类中方法内。
储存方式:
二进制:由0和1组成,代码以0b开头。八进制:以0开头,16进制以0x开头
任意进制转化为10进制。公式:系数*基的权次幂 相加()
系数:就是每一位上的数;
基数:当前进制数;
权:从左往右依次为0、1、2.....|| (例如:101转化为 1*2^0+0*2^1+1*2^2;)
十进制转其他进制:除基取余法。
标识符:
首先说明,不按规则命名或许不错,但这样就像有些人偷看美女一样,猥琐。所以为了正常,就要接受命名规则---软性建议
小驼峰命名法:方法、变量---> 规范1:标志符是一个单词时,全部小写(name)。规范2:标识符有多个单词组成时,第一个单词首字母小写,其他单词首字母大写(firstname)。
大驼峰命名法:类名 ---->规范1:标识符是一个单词时,首字母大写。 规范2:标识符有多个单词组成时,每个单词首字母多大写。
注意!! 命名时,有一个潜在规则,就是见名知义。
键盘录入:
java帮我们写好了一个类叫Scanner,这个类就可以接收键盘输入的数字。(英文scanner:秒扫仪)
// 步骤一:导包---导包的动作必须在类定义的前面:
import java.util.Scanner;
// 步骤二:创建对象--表示要开始使用Scanner这个类了
Scanner sc = new Scanner(System.in);
// 步骤三:接受数据--真正开始干活
int i = sc.nextInt();
键盘录入的另一种方法:
拓展next():
第一套体系:
nextInt()
- 接收整数
nextDouble()
- 接收小数
next()
- 接受字符串,遇到空格、Tab键,回车就会停止。
第二套体系:
nextLine() ---> (会接收一行)。无视空格和Tab。
3、idea
在idea中编程的前提:
首先:新建project(项目) 其次:module(模块)
然后:在模块中创建package(包) 最终:在src中创建class(类)
运算符
先说一下运算符的总和:
- 算术运算符
- 关系运算符
- 位运算符
- 逻辑运算符
- 赋值运算符
- 其他运算符
运算符详解--网页,可以详解
1、算术运算符
--与c几乎无异。注意%(取余,取模)
注意:mod就是取模的意思。
--在进行带小数点运算时,与c无异的是结果都有可能不精确。
--隐式转换(自动类型提升)与c无异:范围为byte->short->int->long->float->double
---注意:byte short char 三种类型的数据在运算的时候,都会直接提升为int,然后在进行运算。
--强制转换(与c大致相同):目标函数类型 变量名=(目标数据类型)被强转的类型;
--算数运算符“+”的操作(与c有大不同):具体介绍是他有时比c根方便,不用putchar()而用“ ”就能把字符串输入;例:“a:”+1.1+2.3//输出为a:1.12.3 但是1.1+2.3+“a:”//输出3.4a:
---当字符+字符||字符+数字时,会把字符通过ASCLL码表查询到对应的数字在进行计算。
System.out.println(1+'a');// 结果为98 System.out.println('a'+"abc");//结果为aabc,有字符串时就不符合规则了。
2、自增自减运算符
++,--等与c几乎无异;
3、赋值运算符(与c无异)
4、关系运算符(与c无异)
5、逻辑运算符(与c差别不大)
&-->逻辑与(且): 并且,两边都为真,结果才真。 |-->逻辑或:或者,两边都为假,才假
^--->逻辑异或: 两边相同为false,不同为true。 !-->逻辑非:取反
System.out.println(true^true); // false
System.out.Println(false^true); // true
System.out.println(!false);//true--一般用逻辑非,"!"要么用一个,要么不用。
6、三元运算符(与c无异)
一元:如a++,整个式子只有一个变量(操作数),如a
二元:a+b,有两个操作数。a和 b
三元格式,关系表达式?表达式1:表达式2;
在此有一感受就是java有时开放性,大于c;(暂时是这么认为)--大一 ·上
import java.util.Scanner;
public class day3{public static void main(String[] args){Scanner sc=new Scanner(System.in);int a=sc.nextInt();System.out.println("请输入第一只:"+a);int b=sc.nextInt();System.out.println("请输入第二只:"+b);String c=a==b?"相同":"不同";System.out.println(c);//结果是相同}
}
7、运算符优先级
8、原码、反码、补码
原码:十进制数据的二进制表现形式,最左边是符号位,0为正,1为负
原码弊端:利用原码进行计算时,如果是正数完全没问题。但是如果是负数,结果就出错,实际的运算的方向,根正确的运算方向相反
反码:为了解决原码不能计算负数的问题而出现的。
反码计算规则:正数反码不变,负数的反码在原码的基础上,符号位不变。数值取反,0变1,1变。
反码的弊端:负数运算的时候,如过结果跨0,跟实际结果就会有1的偏差。
补码出现的目的:为了解决负数计算时跨0的问题而出现的。
补码的计算规则:正数的补码不变,负数的补码在反码的基础上+1。另外补码还能多记录一个特殊的值-128,该数在一个字节(8个bite位)下,没有原码和反码。
补码的注意点:计算机的储存和计算都是以补码的形式存在的。
public class day3{public static void main(String[] args){int a=200;//0000 0000 1100 1000byte b=(byte)a;//1100 1000System.out.println(b);//并且在计算机负数的储存都是补码,要取反加 1。}
}
9、基本数据类型在计算机中的储存
数据类型所占字节默认值:
更加详细如下:
四类八种:
引用数据类型:
类、数组、接口、String字符串.....等等
10、其他运算符(可能我c只学了入门级别的,我暂时未在c中见到这)
格式依次为:运算符->含义->运算规则
&: 逻辑与 0为false 1为true
|: 逻辑或 0为false 1为true
>>:右移 向右移动,高位补0或1
>>>:无符号右移 向右移动,最高位补0
(1)、在&和 | 中,运算规则(暂时不知道有啥用,可能还没学到,并且我在c中没学到这个):
&是上下(对位处)都为1时,才是1。 而 | 只要上下有一个就会是1。
(2)、>和 >>>他们的计算规则为
>>中补的0或1中,1是符号位。在有一规则向右移一位
4、判断和循环
循环
1、顺序结构
流程控制语句,计算机就是从上到下依次解读翻译的
2、分支结构
if(与c几乎无差异)
if(关系表达式1){语句体1;
}else if(关系表达式2){语句体2;
}
...
else {语句体 n+1;
}
switch (在c大体上相同,只在简写的地方不同)
switch(表达式){case 值1:语句体1;break;case 值2:... ...default:语句体n+1;break;
}
switch其他知识点(1、2 与c还差不多,3大大不同)
1、default(无论写到这个循环的哪个空位置都会发挥其作用,哪怕是两个case判断题之间,平时是为了美观)
2、case的穿透,必须要用break阻止。
3、switch的新特性(不过我试过了,我这个idea版本不能用这个办法):
int number=1;
switch (number){ case 1-> System.out.println("一");case 2-> System.out.println("二");case 3-> System.out.println("三");case 4-> System.out.println("四");default -> System.out.println("没有这种选择");
}//注意:这是idea新版本的用法,其他版本的不一定支持。
3、循环结构
while循环
while
格式:
初始化语句
while(条件判断语句){循环体语句;条件控制语句;
}
do while
格式:
初始化语句
while(条件判断语句){循环体语句;条件控制语句;
}
for循环
for循环有两种格式,
第一种:for( ; ; ;)
第二种:foreach语句与数组
//for(type element: array)
//for(int i : arr)
就相当于对这个数组循环一遍,从i开始,到最后。
for与while对比:
- 相同点
- 运行规则都是一样的
- for与while的区别
- 其一
- for循环中,控制循环的变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了
- while循环中,控制循环的变量,对于while循环来说是不归属其算法结构中,在循环结束后,该变量还可以继续使用
- 其二
- for循环中:知道循环的次数;
- while循环:不知道循环的次数和范围,只知道循环的结束条件。
- 其一
无限循环:
如:for( ; ; ;);
但是for(int i=0; i<0; ++i); // 这玩意,是一次循环都进入不了
条件控制语句:
continue:跳过本次循环,继续执行下次循环。
break:结束整个循环。
loop:while(true){
break loop;}
这两个是一起使用的,用于跳出整个循环。
可以跳出多个循环,而loop有两点应用,
one:是在要跳出的循环的前面如本题while。
two:loop只是一个起标记作用的标志,也能用其他英文标志,如aaa等....
System.exit(0);
在java循环中,应用System.exit(0)表示整个程序直接结束。
扩展 · 随机数()
获取随机数:java帮我们写好了一个类叫Random,这个类就可以生成一个随机数。
使用步骤:
/导包 -- Random这个类在哪
imprt java.util.Random;//导包的动作必须出现在类定义的上边
//创建对象 -- 表示我要开始用Random这个类了
Random r=new Random();//上面这个表格里面,只有r是变量名,可以变,其他的都不允许
//生成随机数 --- 真正开始干活了
int number = r.nextInt(bound:随机数的范围);//上面这个格式里面,只有number是变量名,可变,其他都不行
//切记,bound后面的数,为范围 : [0~(bound-1)]
/*
在学完创建对象(类与对象)后,在根据栈与堆的应用、“.”的作用,我明白了
为什么要用“r.nextInt()”且为什么还要加“.” ,new在堆中创建了新空间,
并把地址传给了r。而“.”的作用就是进入某个地址,r.就是进入了new所创建的
新地址,然后将找到的值穿给number。
*/
与c区别:
c中也要做类似
于导包的动作,是#include
然后下面才能用 rand();
其中#include是编译预处理指令,他的含义是让编译程序在头文件目录中搜索指定名称的头文件并将其插入到指令所在的位置。
5、方法
什么是方法
方法(method)是程序中最小的执行单元。
定义:把一些代码打包放在一起,改过程称之为方法。
实际开发中什么时候用到方法?
重复的代码、具有独立功能的代码可以抽取到方法中。
实际开发中,方法有什么好处?
可以提高代码的复用性,提高可维护性、
方法的重载
- 在同一个类中,方法名相同,参数不同,与返回值无关;
- 参数不同:个数不同、类型不同、顺序不同。
方法的格式
//当有多个参数时
public class void sum(int number1,int number2....)
形参和实参
形参:全称形式参数,全称方法定义中的参数。
实参:全称实际参数,方法调用中的参数。
带方法的返回值
public static 返回值类型 方法名 (参数){方法体;return 返回值;
}
方法的内存
- 方法调用的基本内存原理
- 从main函数开始,一次将方法放入栈中。
- 方法传递 基本数据类型 的内存原理
- 基本数据类型:整数类型,浮点数类型,布尔类型,字符类型
- 方法传递 引用数据类型 的内存原理
- 引用数据类型:除基本数据类型的其他所用类型
6、数组
一、一维数组:
数组介绍
- 数组指的是一种容器,可以用来储存同种数据类型的多个值
- 例如:int类型的数组容器(boolean不可以 byte short int double不可以 )
- 例如:double类型的数组容器(byte short int long float double)(不划线的都是可以写入数组)
- 建议:容器的类型,和储存的数据类型保持一致。
数组的定义与静态初始化
格式一:数据类型[ ] 数组名----->范例:int[ ] array
格式二:数据类型 数组名 [ ]------> int arry [ ]
一般默认推荐使用格式一。
初始化:
静态初始化:
就是在内存中,为数组容器开辟空间,并将数据存入容器的过程。
//完整格式:数据类型[] 数组名=new 数据类型[] {元素1,元素2,元素3....}
int[] array = new int[]{11,22,33};
double[] array2 = new double[]{11.1,22.2,33.3};数组的地址值:
int[] arr = {1,2,3,4,5};
System.out.println(arr);//[I@5d03e736
//[:表示当前是一个数组;
//D:表示当前数组里面的元素都是double类型的
//@:表示一个间隔符号。(固定格式)
//5d03e736:才是数组真正的地址值(16进制)
//平时我们会习惯性的把整体叫做地址值
索引:
索引也叫下标,角标。
特点:从0开始,逐个加1,连续不断;
动态初始化:
(如下)
(暂时有些难,会托后面一点讲)
数据遍历
便历:将数组所有的能容取出来,取出来后可以(打印,求和,判断...)
注意:便历指的是取出数据的过程,不要局限的理解为,便历就是打印。
数据动态初始化
动态初始化:初始化只能指定数组长度,由系统为数组分配初始值
格式:数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ]
范例:int [ ] arr = new int[3]
与静态的区别
- 动态
- 手动输入数组长度,由系统给出默认值。
- 只明确元素个数,不明确具体数值,推荐使用动态初始化
- 手动输入数组长度,由系统给出默认值。
//使用数组容器来储存键盘录入的5个整数。
int [] arr ={??????};
int [] arr =new int[5];
- 静态
- 手动指定数组元素,系统会根据元素个数,计算出数组的长度
- 已经明确了操作的具体数据,直接静态初始化即可。
- 手动指定数组元素,系统会根据元素个数,计算出数组的长度
int[] arr={11,22,33};
数组常见操作
求最值
//定义max变量准备记录擂台上的变化
int max = arr[0];
//便利数组获得每一个元素
for(int i=1;i<arr.length;i++){arr[i];
}
//让每一个元素跟max进行比较,如果找到更大的就让max记录该元素
for(int i=1;i<arr.length;i++){if(arr[i]>max){max = arr[i]; }
}
求和
交互数据
for(int i=0,j=arr.length-1;i<j;i++,j--){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;
}
打乱数据
二、二维数组:
(1)、二维数组静态初始化:
- 格式:数据类型[][] 数组名 = new 数据类型[][]{ {元素1,元素2} , { 元素1,元素2} }
- 范例:int[][] arr = new int[][]{ {11,22},{33,44} }
- 简化格式:数据类型[][] arr = { {元素1,元素2} , { 元素1,元素2} }
- 一般就推荐这种,是因为阿里巴巴代码规范中,就是这么规范的。
(2)、二维数组的动态初始化:
- 格式:数据类型[][] 数组名 = new 数据类型[m][n];
- m表示这个二维数组,可以存放多少个一维数组;
- n表示这个二维数组,可以存放多少个元素;
- 范例:int[][] arr = new int[2][3];
- 存放两个一维数组,每个数组可以存放3个int类型元素;
二维数组中两个特殊操作:
1:
public static void main(String[] args){int[][] arr = new int[2][];int[] arr1 = {11,22};int[] arr2 = {33,44,55};arr[0] = arr1;arr[1] = arr2;
}
配图解释如下:
2:初始化方式
public static void main(String[] args){int[][] arr = new int[2][3];int[] a1=new int[]{11,22};int[] a2=new int[]{33,44,55};arr[0] = a1;arr[1] = a2;
}
拓展:
数组的长度属性
a=arr.length,其中a为长度
Java的内存分配:
1、栈
- 方法运行时使用的内存。
- 比如main方法运行
- 进入方法栈中执行
2、堆
- new来创建的
- 都储存在堆内存
但两个数组指向同一个小空间时,其中一个数组对空间的值发生改变,那么其他数组再次访问的时候都是修改过的值。
这才是栈和堆的真正用法
3、方法区
存储可以运行的class文件
4、本地方法栈
JVM在使用操作系统功能的时候使用,和我们开发无关
5、寄存器
给CPU使用,和我们开发无关
二、面向对象
1、类和对象:
- 类(设计图):是对对象共同特征的描述。
- 对象:是真实存在的具体东西;
- 在java中,必须先设计类,才能获取对象。
//---->类:
public class 类名{1、成员变量(代表属性,一般是名词)2、成员方法(代表行为,一般是动作)3、构造器(后面学习)4、代码块(后面学习)5、内部类(后面学习)
}
//---->实例:
public class Phone{//属性(成员变量)String brand;double price;//行为(方法)public void call(){ }public void playGame(){ }
}
2、如何得到类的对象:
就相当于 ——> 创建对象
类名 对象 = new 类名();
Phone p = new Phone();
3、如何使用对象:
- 访问属性:对象名.成员变量
- 访问行为:对象名.方法名(....)
4、补充:
(定义类的补充注意事项)
- 用来描述一类事物的类,专业叫做:javabean类。
- 在javabean类中,是不写main方法的。
- 在以前编写main方法的类,叫做测试类。
- 我们可以在测试类中创建Javabean类的对象并进行赋值调用。
- 在一个java文件中可以定义多个class类,且只能有一个类是public修饰的,而且public修饰的类名,必须成为代码文件名。
- 实际开发中,还是建议一个文件只定义一个class类。
- 成员变量的完整格式是:修饰符 数据类型 变量名称 = 初始化;
面向对象的三大特征
-
封装
- 封装告诉我们,如何正确的设计属性和方法。
- 对象代表什么,就得封装对应的数据,并提供数据对应的行为。
- 告诉我们如何正确设计对象的属性和方法。
- 封装扩展之包:为了更好的管理项目,把多个类收集到一起组成一组,称为软件包。通俗的说就是文件夹。
好处: 让编程变得更简单,有什么事,找对象,调方法。
降低学习成本,可以少学、少记。不用记对象有哪些方法,有需要去找就行。
将不需要对外界提供的内容和属性都隐藏起来,提供公共方法对其访问。
-
继承
-
多态
面向对象的思想
java是一个面向对象的程序程序设计的语言,在程序中使用对象来描述具体的事物,当多个事物具有共同的特点时,可以将事物的共同特点提取出来,进行抽象,让后封装成一个包含事物共同特征的集合。
Java语言的特性
1、private关键字
- 是一个权限修饰符。
- 可以修饰成员(成员变量和方法)。
- 被private修饰的变量只能在本类中才能被修饰访问。
- 针对private成员变量,如果需要被其他服务类使用,提供相用的操作。如下
public class GirlFriend{private int age;//set(赋值)public void setAge(int a){if(a>=18&&a<=50)age = a;elseSystem.out.println("非法数据");}//get(获取)public int getAge(){return age; }
}
可变参数
java中,我们把名称相同,功能也相同,但是形参个数不同的多个函数封装到一个函数。
比如:要求多个个数的和,但是此时并不确定一共要求几个数,如果形参每变化一次,就要有一个新的函数,那我们效率就会大打折扣,于是出现了-->可变参数;
格式:
返回值类型 方法名(固定参数列表,数据类型... 可变参数名){方法体
}
2、this关键字
- 就近原则
System.out.println(age);
System.out.println(age);
- this的作用
可以区分_成员变量 和_局部变量。
public void setName(String name){ //等号左边:就是成员变量位置的name。
this.name = name; //局部变量表示测试类中调用方法传过来的数据。
3、构造方法
构造方法能完成创建对象时的初始化。在一个类中,要同时定义有参和无参的构造方法。因为定义有参的构造方法时,电脑就无法默认生成无参的构造方法。构造方法一般是由new调用的。(在创造对象时,虚拟机会自动调用构造方法,目的是给成员变量进行赋值)
格式:修饰符 类名(参数)
{ 方法体 };
public class StudentDemo{
public static void main(String[] args){Student s1 = new Student();}
}
构造方法有两种
有参构造:初始化对象时,对成员变量直接赋值
无参构造:初始化对象时,成员直接使用默认值
建议有参、无参一起写
4、标准JavaBean
什么是:是用Java语言写成的可重用的组件。
Bean是java可从重用软件组件的习惯叫法。
1、必须有驼峰命名法,见名知意。
2、必许有private关键字
3、同时用有参和无参两种构造方法。
4、成员方法:每一个成员变量都至少提供对应的:setXxx()/getXxx()
5、对象内存图
Java内存分配介绍:堆、栈、方法区。
先后顺序为:字节码加载进入方法区-->方法运行时进入栈内存(包括变量)-->new出来时进入堆内存,开辟空间产生地址 同时将堆内存传给左边的局部变量
加载.class文件 --> 申请局部变量 --> 在堆内开辟空间 --> 默认,显示初始化,构造方法初始化 --- > 将堆中的地址值赋给左边的局部变量
6、this的内存
作用:区分成员变量和局部变量。 本质:所在方法调用者的地址值。
例:this.name = name。其实就是this知道name作为成员变量时的地址值。
成员变量:类中方法外。 局部变量:方法中
三、API
API基本:
一句话描述api:应用api就是(如何使用别人已经写好的东西)。
1、API:
(Application Programming Interface) 应用程序接口
2、简单理解:
API就是别人写好的东西,我们不需要自己编写,直接使用即可。
3、javaAPI:
- 指的是JDK中,提供的各种功能的java类。
- 这些功能将底层的实现封装起来,我们不需要知道,这些类是如何实现的,只需要知道如何应用即可。
- 将来还会学习其他知识,还会有其他的API。
4、API和API帮助文档:
API:目前是jdk提供的各种java类,将底层的实现封装起来。
API帮助文档:帮助开发人员更好的使用API和查询API的一个工具。
如何使用API帮助工具:
- 打开API帮助文档(我的电脑在E盘,develop中,名为jdk...中文版)。
- 点击左上方,索引,输入关键字,然后单击右键。
- 查看类所在的包。
- 先看构造方法。
- 再看成员方法。
四、字符串
一、String
1、String概述:
java.lang.String类 代表字符串,java程序中,所有字符串文字(例如“abc”)都为此类的对象。
例:String name = "尼古拉丝·啊伟"(对象)
String的注意点:
- 字符串的内容是不会发生改变的,他的对象在创建后不能被改变。
- String是java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
- java程序中所有字符串文字都被视为此类的对象。
- 就像1.所强调的一样,字符串被创建后,便不可变。
2、创建String对象的两种方式:
直接赋值:
例:String name = “abcde”;
new
构造方法 说明
public String() 创建空白字符串,不包含任何内容
public String(String original) 根据传入的字符串,创建字符串对象
public String(char[] chs) 根据字符串数组,创建字符串对象
public String(byte[] chs) 根据字节数组,创建字符串对象
例:
3、内存分配:
==号,到底比的是什么:
基本数据类
例:
int a=20;
int b=20;
System.out.println(a==b);//true
基本数据类型比的是数据值。
引用数据类
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1 == s2);//false
引用数据类型比的是地址值。
4、字符串比较:
- boolean equals方法(要比较的字符串) 完全一样为true,否则为false。
- boolean equalsIgnoreCase(要比较的字符串) 忽略大小写的比较。
- 以上就是例图喽,我暂时还没用到equalsIgnoreCase。
5、几个String方法的应用
String replace(旧值,新值)替换;
注意点,只有返回值才是替换之后的结果。
java charAt()方法
语法:public char charAt(int index);
index -- 字符串的索引。
返回值:返回指定索引处的字符。
实例:1
public class Test{public static void main(String args[]){String str = "www.run.com";char result = str.charAt(3);System.out.println(result);// 为 . }
}
public int length() : 返回字符串长度;
String str = "hello world!"
int len = str.length();//12
注意:""引的是String字符串,''单引号引的是char,一个字符。
长度计算:
数组长度:数组名.length;
字符串的长度:字符串对象.length();
String substring(int beginindex,int endindex) 截取
注意点:包头不包尾,包左不包右,只有返回值才是截取后的结果。
String substring(int beginindex) 截取到结尾。//index索引,指数。
二、StringBuilder
StringBuilder可以看成一个容器,创建之后里面的内容是可变的。作用---高效。
1、StringBuilder构造方法:
空参:public StringBuilder();
实参:public StringBuilder(String str);//根据字符串内容来创建对象。
2、StringBuilder常用方法:
- append() 添加数据
- reverse() 翻转内容
- length() 返回长度
- toString() 通过toString()可以把toString转化为String。
链式编程
---->在我们使用一个方法时,不需要其他变量继续接收,可以继续调用其他方法。
三、StringJoiner
StringJoiner根StringBuilder一样
同:都是一个容器,可以改变;
不同:StringJoiner在jdk8后才出现,很少有人用,但是更高效。
StringJoiner构造:
1、add
添加数据,并返回对象本身。
2、length()
返回长度(字符个数)
3、toString()
返回字符串并把StringJoiner转化成toString
四、字符串原理
扩展1:字符串储存原理
1、直接赋值会复用字符串常量池中的。
2、new出来的不会复用,而是直接开辟一个新空间。
扩展2:==号比较的到底是什么?
1、基本数据类型比较的就是数据值。
2、引用数据类型比较地址值。
扩展3:字符串拼接的底层原理
1、没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
2、如果有变量参与,会创建新的字符串,浪费内存。
详解:
public class Test{public static void main(String[] args){String s1 = "111";//直接赋值,在串池中进行String s2 = s1+"222";//由于是拼接先在StringBuilder中存放String s3 = s2+"333"; }
}
其中:new StringBuilder()--拼接-->toString()
以上与String s="111"+"222"+"333",不同。
扩展4:StringBuilder提高效率原理图
1、所有要拼接的内存都会往StringBuilder中放,不会创建很多无用的空间。
扩展5:StringBuilder原码分析
· 默认创建一个长度为16的数组
·添加的长度小于16,直接存
·添加的长度大于16,先扩容在存(容量为*2+2为34)
·如果扩容之后还不够,才以实际长度为准。
扩展6:字符串转变成字符数组
//"ABC" ['A' , 'B' , 'C' ];
· char[] arr = str.toCharArray();
衍生问题:
· 如何把字符数组当成字符串输出:sout(arr);
五、集合
集合:
介绍:集合与数组同又不同。(与数组的区别)
同:都是用来存储数据的。
不同:数组长度固定,可以储存基本、引用两种数据类型。
集合长度可变,只能储存引用这一种数据类型。
应用:
ArrayList list = new ArrayList<>();
ArrayList 变量名 = new ArrayList<(在jdk8以后就可以不填)>();
- boolean add() 添加
list.add("aaa");
list.add("bbb");
list.add("bbb");
- boolean remove() 删除
list.remove("aaa");//其实这样就可以了,下面那个是检查。
boolean result1 = list.remove("aaa");
- E set(int index,E e) 修改
boolean result2 = list.remove("bbb");
- E get(int index) 查询
String str = list.get(0);
- int size() 获取长度
int number = list.size();
ArrayList:
是java中的一个动态数组实现,属于java集合框架中的一部分,它提供了一个可以动态增长的数组,可以灵活地添加,删除和访问。ArrayList是list接口的实现类。
集合有很多,但ArrayList是常用的那一个。
并且在应用ArrayList时,要进行导包。
import java.util.ArrayList。
六、进阶学习
1、static
static--->表示静态,是java中的一个修饰符,可以修饰成员变量和成员方法。
被static修饰的成员变量叫静态变量
特点:
特点:
- 被该类的所有对象共有
- 不属于对象,属于类
- 随着类的加载而加载,优先于对象的存在。
解释:
调用方法:
- 类名调用(推荐)
用static修饰的方法,直接用类名调用,如:Student.teacherName();
因为,static随着类名调用时,直接被调用。它是优先于对象出现的。
- 对象名调用
被static修饰的成员方法叫静态方法
特点:
- 多用于测试类和工具类中
- javabean类中很少会用
调用方法:
- 类名调用(推荐)
- 对象名调用
工具类:
- javabean类 用来描述一件事物的类。
- 测试类 用来检查其他类是否正确,带有main方法的类,是程序的主入口。
- 工具类 不是用来描述一类事物的,而是用来做一些事情的类。
详解:
1、见名知意:
2、私有构造:
3、方法定义为静态:
public class Arrutil{private Arrutil(){}public static int getMax(...){...}public static int getMin(...){...}
}
扩展1
public 和 private是两种修饰符,用于限定成员的可见性。
public:成员被声明为public,意味着该成员对任何一个类都是可见的,不管是不是一个包中。
private:是私有的,你懂.....
详细:
扩展2
- 静态方法只能访问静态方法和静态变量
- 非静态方法可以访问(非)静态变量和(非)静态方法,四种
- 静态方法中没有this关键字;
到此我知道,以后忘得话,我会看不懂----->补充代码块
public class student{String name;int age;static String teacherName;//定义非静态(动态)方法public void show(---其实这里为String this--只是省略了----){sout(name,age,teacherName);//其实,sout中也有省略,如this.name,this.age。
public staic void show(){//这样写其实就会报错,sout(name,age,teacherName)因为静态,不能访问name,age这些静态。sout(this.name,this.age,teacherName);
}}
}
2、继承
1、什么是继承,继承的好处
是什么:是面向对象中的三大特征之一(封装,继承,多态),使类之间产生子父关系;
好处:提高复用性
2、继承的特点
特点--格式->public class 子类 extends 父类{ }
子类可以得到父类的属性和行为,子类可使用;
子类可以在父类的基础上添加新的东西;
3、子类到底能继承父类中的哪些内容?(内存图/内存分析工具)
内容:
- 继承只能单继承,不能多继承,但是可以多层继承;
- 继承中所有类都直接或间接继承Object类。
- 子类只能访问父类中的非私有的成员变量。
4、继承中:成员变量的访问特点
先在局部位置找,本类成员中找,最后往父类位置找,逐级往上。
5、继承中:成员方法的访问特点
与4相似。
6、继承中:构造方法的特点
- 父类中的构造方法不会被子类继承。
- 子类中的所有构造方法默认先访问父类的构造方法,在执行自己
为什么:
- 子类在初始化时可能会先使用父类的数据,如果父类未初始化,子类无法使用父类的数据。
- 子类在调用之前一定会先调用父类的构造方法,完成父类空间的初始化。
怎么调用:
- 在空参构造中,一般默认都先是:super(),不写也存在。且必许在第一行
- 在有参构造中,要调用父类,必许要手动写super进行调用。
图解:
@Override
注意:这次说一下构造方法重写加上“ @Override注释可以校验重写是否正确,同时可读性好。 ”。
重写的方法尽量要跟父类保持一致。
public class fu{System.out.println("father");
}
public class son extends fu{@Override//@Override注释更多是校验是否正确。System.out.println("son");//覆盖的大都是虚方法中的,//方法重写的本质就是覆盖。
}
虚方法:
虚方法存在虚方法表中,虚方法每被继承一次,就会在继承链中添加一次。被static、final、private三者修饰符修饰,不能进入虚方法表中
详解:
7、this、super使用总结
当成员变量被私有化后:
用super才是最好的选择。
最最最重要的一点是super是用在继承中的,他找的是他的爹。而不会是外面的类。
3、包、final、权限修饰
包
作用:
包就是文件夹,用来管理不同的java类
命名规则:
公司域名的反写+包的作用,需要全部英文小写,见名知意
什么是全类名:
包名+类名
什么时候需要导包:
使用同一个包的类时,不需要导包。
使用java.lang包中的类时,不需要导包。
如果同时使用两个包中的同类名,需要用全类名。
final
final修饰方法
最终方法不能被重写。
final修饰类:
最终类,不能被继承。
final修饰变量:
是变量,不能被修改。
- 基本数据类型:变量的值不能被修改。
- 引用数据类型:地址值不能修改,内部的属性可以被修改。
权限修饰符
用来控制一个成员能够被访问的范围。
private(仅一个类中)< (默认不填)(同一个包中)< protected (不同包中子父类能用)< public(不同包间)
代码块的分类
4、抽象类
//抽象类的定义方法
public abstract 返回值类型 方法名(参数列表);
//切记切结,不是:public abstract 返回值类型 方法名(参数列表){}
//抽象类的定义格式
public abstract class 类名{}
方法和意义:
在父类和子类关系中,定义的方法功能不一样,可能是要重写的。这样不同的人分工时,能更好的编写代码。
5、接口
定义和使用:
- 接口用关键字interface来定义;
- 接口不能实例化
- 接口的子类(实现类)
要么重写接口中的所用类的抽象方法,要么是抽象类
- 接口和类之间是实例关系,implement关键字来表示。
public class 类名 implements 接口名{}
注意:
//接口和类之间的实现关系
public class 类名 implements 接口名1,接口名2{}
//实现类还可以在继承一个类的同时实现多个接口。
public class 类名 extends 父类 implements 接口名1,接口名2{}
接口中成员的特点
- 成员变量
只能是常量
常量的默认修饰符为: public static final
- 构造方法
没有
- 成员方法
只能是抽象方法
默认修饰符:public abstract
JDK8以后接口中新增的方法
- 允许在接口中定义默认方法,需要用关键字default修饰。
接口中默认方法的格式:default-->
格式:public default 返回值类型 方法名(参数列表){}
范例:public default void show(){};
接口中默认方法的注意事项:
不被强调重写,但如果将会去掉default关键字,public 可以省略,但是default不能省略。如果实现多个接口,多个接口中存在默认方法名字相同,则子类必须进行重写。
接口中静态的定义方法格式:
格式:public static 返回值类型 方法名(参数列表){}
范例: public static void main(){}
注意事项:
静态方法只能通过接口来定义,不能通过实现名或者对象名调用
public可以省略,static不能省略。
适配器设计模式:
其实就是设计类一个中间类,将接口中的所用类的抽象方法进行了空实现。
适配器:XXXAdapter----->格式。
过程:对接口中的抽象方法进行空实现
让真正的实现类继承中间类,并重写需要的方法。
实现类:
在面向对象的编程中,实现类是指一个类(或对象)实现了一个接口或则继承了一个抽象类,并提供类该接口或抽象类中的所有方法具体实现,实现类负责实现接口或者抽象类中声明的方法。
接口的多态:
接口 j = new 实现类对象。
6、多态
优势?
方法中,父类作为参数,可接受所有所有子类对象。
弊端?
不能使用子类的特殊情况。
引用数据
//引用数据转换
Person p = new Student();
//强制类型转换
Student s = (Student)p;
强制类型转化
- 可以真正的转换为子类类型,从而调用子类独特的功能。
- 转换类型与真实对象类型不会一致。
- 转化类型时可以应用instanceof关键字进行判断。
其中 a instanceof Cat c;中先看a是否为Cat类型,如果是强制转换,然后命名为a;
7、内部类
总:成员内部类,静态内部类,局部内部类这三个了解,匿名内部类要掌握。
成员内部类
静态内部类
静态内部类:
静态内部类是一类特殊的成员内部类。
直接创建静态内部类对象的方式?
Outer.Inner oi = new Outer.Inner();
如何调用静态内部类:
局部内部类
匿名内部类
new 类名或者接口名(){ //继承\实现重写方法 //方法重写
}; //创建对象
如要更加详细解释,请点击------->这个是快速简介匿名内部类的,非常好
匿名内部类的具体应用:
1、什么是匿名内部类
隐藏类名字的内部类,可以写在成员位置,也可以写在局部位置。
2、匿名内部类的格式
new 类名或方法名(){ 重写方法; };
3、格式的细节
包含了继承或现实,方法重写,创建对象。
整体就是一个类的子类对象或者接口的实现类。
4、使用场景
当方法的参数时接口或者类时
以接口为例,可以传递这个接口的实例对象。
如果实现类只要使用一次,就可以用内匿名部类简化代码。
若有不足,指出必改
相关文章:
Java复习
在开篇前首先申明一下,本文虽不够系统,但复习够用,尤其是快速回忆( •̀ ω •́ )✧与提问。 主打一个速度。 本文将会从Java的基础语法、面向对象、API、字符串、集合、进阶...等六方面讲起。 一、Java的基础语法: 1、Java入门…...
keepalived+nginx+tomcat高可用
1.要求 角色主机名软件IP地址用户client192.168.72.90keepalivedvip192.168.72.100mastermasterkeepalived, nginx192.168.72.30backupbackupkeepalived, nginx192.168.72.32webtomcat1tomcat192.168.72.41webtomcat2tomcat192.168.72.42 1.搭建Tomcat 1.1下载jdk wget http…...
RK3568 Android11 sh366006驱动
sh366006.c /* 谁愿压抑心中怒愤冲动咒骂这虚与伪与假从没信要屈膝面对生命纵没有别人帮一生只靠我双手让我放声疯狂叫囔今天的他 呼风可改雨不可一世太嚣张 --《不可一世》Beyond */ #include <linux/module.h> #include <linux/init.h> #include <linux/fs.h…...
实现分布式锁需要考虑哪些问题?
🔒 什么是分布式锁? 分布式锁是在分布式系统中控制共享资源访问的机制,用于解决高并发场景下数据不一致、操作冲突等问题。核心目标是保证跨进程 / 跨节点的互斥性,常见实现方案包括:数据库锁、Redis 锁、ZooKeeper 锁…...
【UI设计】一些好用的免费图标素材网站
阿里巴巴矢量图标库https://www.iconfont.cn/国内最大的矢量图标库之一,拥有 800 万 图标资源。特色功能包括团队协作、多端适配、定制化编辑等,适合企业级项目、电商设计、中文产品开发等场景。IconParkhttps://iconpark.oceanengine.com/home字节跳动…...
mysql-大批量插入数据的三种方式和使用场景
1.批量插入三种方式 INSERT INTO … SELECTINSERT INTO … VALUES (…)LOAD DATA INFILE ‘/path/to/datafile.csv’ INTO TABLE table_name 2.批量插入 2.1 INSERT INTO … SELECT 用途:从另一个表中选择数据并插入到目标表中。 语法示例: INSERT …...
创建自己的github.io
1、创建GitHub账号 GitHub地址:https://github.com/ 点击Sign up创建账号 如果已创建,点击Sign in登录 2、创建仓库 假设Owner为username,则Repository name为username.github.io说明: 1、Owner为用户名 2、Repository name为仓…...
Oracle 常用语法汇总
系列文章目录 本文对Oracle 常用的语法进行汇总 文章目录 系列文章目录一、Oracle 表&表字段操作:1.1 DDL语句(数据定义语言)Create、Alter、Drop、Truncate:1.1.1 建表:建表:注释COMMENT :表中字段的约束:表中字…...
java小白日记38(集合-List)
List接口基本介绍 List接口是collection接口的子接口 (1)List集合类中元素有序(即添加顺序和取出顺序一致)、且可以重复 (2)List集合中的每个元素都有其对应的顺序索引,即支持索引 …...
高能ISP模块功能说明
先看一些常见缩写: BPS:Bayer processing segment CPP:Camera post processor DE:Detailed enhancement EIS:Electronic image stabilization IFE:Image front-end engine IPE:Image-proc…...
单臂路由实验
单臂路由实验 文章目录 单臂路由实验单臂路由简介工作原理优点与缺点应用场景 实验拓扑实验需求:实验步骤:1.PC 配置 IP 地址2.PC3 属于 Vlan10,PC4 属于 Vlan20,配置单臂路由实现 Vlan10 和 Vlan20 三层互通2.1.在 SW2 上创建 Vl…...
SpringMVC全局异常处理机制
异常处理机制 异常处理的两种方式: 编程式异常处理:是指在代码中显式地编写处理异常的逻辑。它通常涉及到对异常类型的检测及其处理,例如使用 try-catch 块来捕获异常,然后在 catch 块中编写特定的处理代码,或者在 f…...
UDS诊断、ECU刷写、自动化测试、车联网测试、DTC故障注入测试、坏境测试、可靠性测试、压力测试、性能测试等
每日直播时间:(直播方式:腾讯会议) 周一到周五:20:00-23:00 周六与周日:9:00-17:00 向进腾讯会议学习的,可以关注我并后台留言 直播内容ÿ…...
C++的常用容器嵌套
在 C 中,数据结构之间的嵌套是非常常见的,尤其是在处理复杂数据时。以下是几种最常用的数据结构嵌套方式及其典型应用场景的总结: 1. std::vector 嵌套 std::vector 定义:std::vector<std::vector<T>>。用途…...
Mac - Cursor 配置 + GPT 4.0/4.5/o1/o3/Deepseek Api 使用
前言 新换了电脑,所以需要新配置一些环境。已经安装好了Goland,但近期可能有GoJava前端的需求,所以使用Cursor。 除去学校各种奇奇怪怪,这已经是一年多来配置的第4台Windows和第四台Mac的Golang环境了。。。且是自己工作外买的第…...
【数据挖掘】Python基础环境安装配置
【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2,然后基于该Python版本安装Jupyter not…...
详解string类+迭代器
迭代器 概念:在 C 中,迭代器是访问容器(如数组、列表、向量、字符串等)元素的一种方式。迭代器提供了一种统一的接口,使得你可以使用相同的代码来遍历不同类型的容器。迭代器本质上是一个指针或者指针的封装࿰…...
OpenCV DNN 模块使用指南
OpenCV DNN 模块使用指南 一、模块概述 OpenCV 的 DNN(深度神经网络)模块为开发者提供了强大的深度学习功能,能够加载并运行多种格式的预训练深度学习模型。此模块广泛应用于图像分类、目标检测、语义分割等众多计算机视觉任务。接下来&…...
温度(Temperature)在大模型输出中的作用与底层原理
温度(Temperature)在大模型输出中的作用与底层原理 在深度学习领域,尤其是自然语言处理(NLP)中,大型语言模型(LLM)的输出生成通常依赖于概率分布的采样。温度(temperatu…...
智能汽车图像及视频处理方案,支持视频智能拍摄能力
美摄科技,作为智能汽车图像及视频处理领域的先行者,凭借其卓越的技术实力和前瞻性的设计理念,为全球智能汽车制造商带来了一场视觉盛宴的革新。我们自豪地推出——美摄科技智能汽车图像及视频处理方案,一个集高效性、智能化、画质…...
一文讲清 C++ CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)
CRTP是 C 中的一种模板元编程技术,其核心原理是通过模板继承和静态多态,在编译期实现基类对派生类成员的访问,从而避免运行时虚函数调用的开销。 1. CRTP 的基本结构 CRTP 的核心思想是:基类是一个模板类,其模板参数…...
如何用Function Calling解锁OpenAI的「真实世界」交互能力?(附Node.js 实战)
一、Function Calling:大模型的「手脚延伸器」 1.1 核心定义 Function Calling是OpenAI在2023年6月13日推出的革命性功能(对应模型版本gpt-3.5-turbo-0613和gpt-4-0613),允许开发者通过自然语言指令触发预定义函数,实…...
MySQL:float,decimal(1)
会四舍五入 无符号浮点数 更改321zyy1下的salary 为float类型 decimal:...
基于DrissionPage的DY无水印视频采集
基于DrissionPage的Dy无水印视频采集技术解析 目录 一、项目背景与痛点分析 1.1 典型应用场景1.2 传统方案痛点对比1.3 需求分析流程图二、系统架构设计 2.1 核心架构图2.2 执行流程图解三、开发环境配置 3.1 版本要求3.2 环境搭建指南四、实现流程详解 4.1 主要处理阶段4.2 关…...
yt-dlp工具下载视频使用方法
使用 yt-dlp 下载有土播视频时,可以很容易地同时下载字幕文件。 下面是详细操作说明: 一、下载视频并同时下载字幕: 基础命令: yt-dlp --write-subs 视频链接示例: yt-dlp --write-subs https://www.youdubo.com/wa…...
canvas数据标注功能简单实现:矩形、圆形
背景说明 基于UI同学的设计,在市面上找不到刚刚好的数据标注工具,遂决定自行开发。目前需求是实现图片的矩形、圆形标注,并获取标注的坐标信息,使用canvas可以比较方便的实现该功能。 主要功能 选中图形,进行拖动 使…...
Linux与HTTP报头属性和请求方式
HTTP报头属性、请求方式 本篇介绍 在上一节深入HTTP序列化和反序列化已经详细讲解了HTTP是如何进行序列化和反序列化的,但是上一节对请求报头和响应报头的具体内容并没有做出具体的说明,本节就会基于这个问题继续探讨HttpServer;另外在介绍…...
WordPress漏洞
一,后台修改模板拿WebShell 1,安装好靶场后访问 2,在如图所示的位置选择一个php文件写入一句话木马,我们这里选择在404.php中写入 3,访问404.php 二,上传主题拿WebShell 1,找到如图所示的页面…...
go命令使用
查看配置信息 go env配置go国内源 export GO111MODULEon export GOPROXYhttps://goproxy.cn测试 go install github.com/jesseduffield/lazydockerlatesthttps://github.com/jesseduffield/lazydocker...
uniapp vue3使用uniapp的生命周期
使用uniapp的onLoad等生命周期 // 需要引入 import { onLoad , onShow } from dcloudio/uni-app; // 箭头函数 onLoad(()>{//内容 })使用vue生命周期 vue官方文档:https://cn.vuejs.org/api/options-lifecycle.html import { ref,onMounted } from vue; onMou…...
nginx vue history模式 try_files
server {listen 80;server_name localhost chat.test.com;#配置根目录location / {root /temp/test;#index index.html index.htm;try_files $uri $uri/ /index.html;add_header Content-Security-Policy upgrade-insecure-requests;}} https://blog.csdn.net/xutongbao/…...
【css酷炫效果】纯CSS实现悬浮弹性按钮
【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492020 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&…...
MySQL自动化配置工具开发:探索如何用脚本实现MySQL一键安装与配置,提升运维效率
引言 MySQL作为最流行的开源关系型数据库之一,广泛应用于各类业务场景。然而,手动安装和配置MySQL不仅耗时,还容易出错。为了提高运维效率,开发一款MySQL自动化配置工具显得尤为重要。本文将探索如何通过脚本实现MySQL的一键安装与配置,并提供具体的配置脚本文档和关键参…...
如何查看安卓版本号的方法(例如查看是13、12、11、10...)
开发过程中需要了解到安卓版本号是多少,那么以下有三种方法可以知晓安卓手机的Android版本号。 方法1:手机设置直接查看 1.打开【设置】 --> 滑动到手机最底部 --> 点击【关于手机】或 【系统】--> 选择【Android版本】 2.直接查看版本号&am…...
ubuntu 解挂载时提示 “umount: /home/xx/Applications/yy: target is busy.”
问题如题所示,我挂载一个squanfs文件系统到指定目录,当我使用完后,准备解挂载时,提示umount: /home/xx/Applications/yy: target is busy.,具体的如图所示, 这种提示通常是表明这个路径的内容正在被某些进…...
Java XML与JSON相互转换详解
目录 一、为什么需要XML与JSON转换二、使用Jackson库进行转换1. 添加依赖2. XML转JSON3. JSON转XML三、注意事项在现代软件开发中,数据格式的转换是一项常见的任务,特别是在处理不同系统或服务之间的数据交换时。XML(可扩展标记语言)和JSON(JavaScript对象表示法)是两种广…...
[AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南
在芯片验证中,回归测试(Regression Test)是确保设计稳定性的关键步骤。但随着设计复杂度增加,手动管理海量测试用例、分析日志和覆盖率数据变得异常耗时。本文将介绍如何利用持续集成(CI)工具Jenkins,结合EDA验证环境(如Cadence vManager),实现自动化测试与结果分析,…...
Java-SpringBootWeb入门、Spring官方脚手架连接不上解决方法
一. Spring 官网:Spring | Home Spring发展到今天已经形成了一种开发生态圈,Spring提供了若干个子项目,每个项目用于完成特定的功能(Spring全家桶) Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率 。 二. Spring Boot入…...
WEB攻防-PHP反序列化-字符串逃逸
目录 前置知识 字符串逃逸-减少 字符串逃逸-增多 前置知识 1.PHP 在反序列化时,语法是以 ; 作为字段的分隔,以 } 作为结尾,在结束符}之后的任何内容不会影响反序列化的后的结果 class people{ public $namelili; public $age20; } var_du…...
Android第五次面试总结(网络篇)
一、引言:为什么需要 DNS? 在浏览器输入www.example.com的瞬间,一场跨越全球的数字接力赛悄然启动。DNS(域名系统)如同互联网的 “电话号码簿”,将人类可读的域名转化为机器可识别的 IP 地址。本文将以工程…...
全网首创/纯Qt/C++实现国标GB28181服务/实时视频/云台控制/预置位/录像回放和下载/事件订阅/语音对讲
一、前言说明 用纯Qt来实现这个GB28181的想法很久了,具体可以追溯到2014年,一晃十年都过去了,总算是整体的框架和逻辑都打通了,总归还是杂七杂八的事情多,无法静下心来研究具体的协议,最开始初步了解协议后…...
详解MySQL的事务实现机制
MySQL事务实现机制 1. 锁机制2. Redo Log(重做日志)3. Undo Log(撤销日志)4. MVCC(多版本并发控制)综合事务处理流程 在MySQL中(主要以InnoDB为例),事务的实现依赖于多个…...
什么是 BA ?BA怎么样?BA和BI是什么关系?
前几天有朋友在评论区提到了BA这个角色,具体是干什么的,我大概来说一下。 什么是BA BA 英文的全称是Business Analyst,从字面上意思就是商业分析师,做过商业智能BI项目的应该比较了解。实际上以我个人的经验,BA 的角…...
Junit在测试过程中的使用方式,具体使用在项目测试中的重点说明
JUnit 是一个广泛使用的 Java 单元测试框架,主要用于编写和运行可重复的测试。以下是 JUnit 在项目测试中的使用方式和重点说明: 1. 基本使用 场景:测试一个简单的 Java 类。 示例: import org.junit.Test; import static org.junit.Assert.*;public class CalculatorTe…...
网络安全之前端学习(HTML篇)
前言:网络安全中有一个漏洞叫xss漏洞,就是利用网页引发弹窗,这就要求我们看得懂源码,所以我会持续更新前端学习,可以不精通,但是一定要会,主要掌握HTML,css,js这三项技术…...
Lineageos 22.1(Android 15)实现负一屏
一、前言 方案是参考的这位大佬的,大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整,加入aidl引入,这样make之后就可以索引代码了 filegroup {name: "launcher-src"…...
Redisson分布式锁(超时释放及锁续期)
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
SQL授予用户查询某个模式或者具体某个表
例如:需要给sjzt授权查询这个模式下的这个表的操作 数据库:DB_HZ_HYZHFZ 模式:hn_proxy 服务注册表:hn_proxy."serverrg" 账号:sjzt -- 登录到目标数据库 DB_HZ_HYZHFZ -- 授予权限给账号 sjzt 在模式 hn_proxy 中访问…...
Burp Suite 代理配置与网络通信
目录 1. 引言 2. Burp 代理基础配置 2.1 浏览器代理设置 2.2 Burp 监听端口配置 2.3 常见错误排查 3. 网络问题解决 3.1 端口占用检查 3.2 防火墙配置 3.3 证书信任问题 4. 虚拟机环境配置 4.1 NAT 模式与端口转发 4.2 桥接模式配置 4.3 跨设备访问测试 5. 技术概…...
PyCharm安装redis,python安装redis,PyCharm使用失败问题
报错信息 Usage: D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip install [options] -r [package-index-options] … D:\wb2\wbrj_pys\venv\Scripts\python.exe -m pip instal…...