Java的字符串String
文章目录
- 什么是字符串
- String类的声明
- 为什么我们的String是不可变的
- 为什么String类用final修饰
- String的创建
- 字符串比较相等
- 关于Java中的==比较
- 关于字符串不同赋值操作对应的内存分配
- 那对象如何进行比较内容
- 字符串常量池
- StringTalbe的位置
- 字符串常见的操作
- 拼接操作
- 获得字符串的子串
- 字符串的比较
- 字符串的查找操作
- 字符串拆分操作
- 字符串的替换操作
- 其他操作
- 字符串与字符和字节的关系
- 字符与字符串
- 字节与字符串
- 那么何时使用 byte[], 何时使用 char[] 呢?
- StringBuilder和StringBuffer
- 如何让同一个字符串进行字符串拼接
- String和StringBuffer的相互转换
- StringBuffer额外的方法
- 请解释String、StringBuffer、StringBuilder的区别
什么是字符串
从概念上将,Java字符串就是Unicode字符序列,例如字符串 "Java\u2122"由五个Unicode字符 J,a,v,a和™组成
- 我们的Java没有内置的字符串类型,而是再标准Java类库中提供一个预定义类,很自然的叫做了String
- 所以我们的String不是一个基本类型,而是一个类
- 每个用双引号括起来的字符串都是String类的实例
String s="";
String str="Hello";
String类的声明
String类在我们的java.lang包下
//我们JDK1.8下String的部分源码
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];
}
为什么我们的String是不可变的
- 我们可以看到源码中我们的字符串底层是使用一个char数组进行存储,这个char数组是私有且用了final进行修饰
- 成员属性是私有的,且String类并没有提供其任何对应的方法进行修改,所以在外部是不能修改我们的String的内容
- 这个数组用final修饰,final修饰一个对象,表示的是这个对象的引用是不能改变的,所以我们一个String实例的对象中的这个存储数据的value数组的指向也是不能改变的
- 以上两个修饰导致了我们字符串的不可变性
字符串的不可变不代表引用不可变
String str="hello";
str="hello world";
- 我们后面字符串的常见API看上去改变字符串,其实都是这种原理
- 我们的字符串拼接也是这种原理
为什么String类用final修饰
- 我们的String经常使用且处于核心类库中,我们必须要保证我们每个程序员用的String是同一个类,所以让其被继承
String的创建
- 1直接赋值(语法糖)String s=“hello String”;
- 2通过构造方法产生对象 String s=new String(“hello String”);
- 3通过字符数组产生 char []date=new char[]{1,2,3,4}; String s=new String(date);
- 4通过String的静态方法valueOf(任意数据类型)——>转换为字符串
// 方式一
String str = "Hello Bit";
// 方式二
String str2 = new String("Hello Bit");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
//方式四
String str4= String.valueOf(10);
- “hello” 这样的字符串字面值常量, 类型也是 String.
- String 也是引用类型. String str = “Hello”; str只是一个reference类型 "Hello"本身才是真正的字符串对象
字符串比较相等
int x = 10 ;
int y = 10 ;
System.out.println(x == y);
// 执行结果
true
- 在Java中对于基本类型的数值判断是否相等,我们用==来进行比较
代码1
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
// 执行结果
true
- 感觉好像没什么问题,好像是两个字符串的值相等用==来比较,看下一个代码
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
- 怎么这个比较就变成了false,str1和str2的数值是相同的啊,这是因为两种赋值方式的不同内存分配和==在Java中的语义导致
关于Java中的==比较
- Java引用使用 == 比较并不是在比较所指向对象的内容, 而是比较两个引用是否是指向同一个对象.
- Java中基本类型使用==是用来比较对应的数值是否相同关于对象的比较
关于字符串不同赋值操作对应的内存分配
- 对于这种字符串的直接赋值的方式,我们会将出现的字符串常量在编译期间(生成class文件)放在我们的内存中的一个常量池中,如果采用直接赋值的方式,我们就会直接去引用常量池中的字符串常量,所以str1和str2用==比较的结果是true,因为两个引用对象指向同一个对象
- 其实对于str1和str2存储在栈帧的局部变量表中
- 方法区在JDK1.8之后也只是一个概念上的思想,其实常量池真正的存放的地方变成了我们的堆
- 这些知识想真正的弄清楚,需要我们去学习JVM的知识,但是这里我们就大概知道是怎么回事就行
- 首先我们的new 这种方式,也出现了字面量,所以也会在编译期间在常量池存储这个字符串常量
- 因为我们使用了new这个关键字,所以会在堆中创建对应的一个字符串对象,所以str1和str2指向我们对应的字符串对象
池的思想
也就是共享设计模式,为了节省空间(因为内存十分宝贵),字符串产生之后大部分情况都是用来进行输出处理,只打印,一个对象就够了,数据库的连接池和线程池都是这样的思想
如 “Hello” 这样的字符串字面值常量, 也是需要一定的内存空间来存储的. 这样的常量具有一个特点, 就是不需要
修改(常量嘛). 所以如果代码中有多个地方引用都需要使用 “Hello” 的话, 就直接引用到常量池的这个位置就行
了, 而没必要把 “Hello” 在内存中存储两次.
那对象如何进行比较内容
Java 中要想比较字符串的内容, 必须采用String类提供的equals方法.
equals 使用注意事项
- 我们使用的这个equals,这个方法其实在Object中,我们的String类重写了这个方法,所以可以起到比较字符串内容的功能
现在需要比较 str 和 “Hello” 两个字符串是否相等, 我们该如何来写呢?
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true
String str = new String("Hello");
// 方式一
System.out.println(str.equals("Hello"));
// 方式二
System.out.println("Hello".equals(str));
String str = null;
// 方式一
System.out.println(str.equals("Hello")); // 执行结果 抛出 java.lang.NullPointerException 异
常
// 方式二
System.out.println("Hello".equals(str)); // 执行结果 false
- 所以我们第二种方法是更好的一种写法
字符串常量池
根据上面的比较操作,我们对常量池有个认识,现在就介绍一个入池intern()操作
String s1 = "a";
String s2 = "b";
String s3 = "a" + "b";// javac 在编译期间的优化,结果已经在编译期确定为ab
String s4 = s1 + s2;// new StringBuilder().append("a").append("b").toString() new String("ab")
String s5 = "ab";
String s6 = s4.intern();
// 问
System.out.println(s3 == s4); //false
System.out.println(s3 == s5);//true
System.out.println(s3 == s6);//true
String x2 = new String("c") + new String("d");
String x1 = "cd";
x2.intern();
System.out.println(x1 == x2); //1.6false 1.8falseString x2 = new String("c") + new String("d");
x2.intern();
String x1 = "cd";
System.out.println(x1 == x2); //1.6false 1.8true
- 常量池中的字符串仅是符号,第一次用到时才变为对象利用串池的机制,来避免重复创建字符串对象
- 字符串
变量
拼接的原理是 StringBuilder (1.8) - 字符串
常量
拼接的原理是编译期优化 - 可以使用 intern 方法,主动将串池中还没有的字符串对象放入串池
- 1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,方法的返回值是在池中字符串对象的位置.如果没有则放入串池, 会把串池中的对象返回
- 1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,方法的返回值是在池中字符串对象的位置.如果没有会把此对象复制一份,放入串池, 会把串池中的对象返回
当字符串常量池有对应的字符串常量
当字符串常量池没有对应的字符串
StringTalbe的位置
jdk1.6 StringTable 位置是在永久代中,1.8 StringTable 位置是在堆中。
为什么要这样
因为我们永久代的回收效率很低,只有FULL GC才会触发永久代的回收(FULL GC在老年代空间不足才会触发)
StringTable存储着我们的字符串常量,我们的字符串常量在程序中应用的次数很多,所以要及时对StringTable进行回收
字符串常见的操作
String提供的API都不是在原本的字符串进行操作,而是返回一个新的字符串对象
拼接操作
Java跟许多程序设计语言一样,也是支持+来拼接两个字符串
String s1 = "a";
String s2 = "b";
String s3 = "a" + "b";// javac 在编译期间的优化,结果已经在编译期确定为ab
String s4 = s1 + s2;// new StringBuilder().append("a").append("b").toString() new String("ab")
- 我们的字符串+,其实在底层调用的我们的StringBuilder的append方法(JDK1.8),常量拼接在编译器间优化成确定的字符串常量
- 而且任何数据跟一个字符串进行+拼接就变成了一个字符串
int age=13;
String rating="PG"+13;
如果需要将多个字符串放在一起,用一个界定符分隔,可以使用静态方法join
String all=String.join(" / ","s","m","l");
//all is the String "s / m / l"
Java11还提供了一个repeat方法
String repeated="Java".repeat(3);// repeated is "JavaJavaJava"
获得字符串的子串
从一个完整的字符串之中截取出部分内容
- 索引从0开始
- 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标
- 很多方法都是前闭后开的规则
String str = "helloworld" ;
System.out.println(str.substring(5));//hello
System.out.println(str.substring(0, 5));//hello
字符串的比较
我们上面知道有equals是用来比较两个字符串的内容是否相同
不区分大小写比较 equalsIgnoreCase()
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
在String类中compareTo()
方法是一个非常重要的方法,该方法返回一个整型,该数据会根据大小关系返回三类内容:
- 相等:返回0.
- 小于:返回内容小于0.
- 大于:返回内容大于0。
System.out.println("A".compareTo("a")); // -32
System.out.println("a".compareTo("A")); // 32
System.out.println("A".compareTo("A")); // 0
System.out.println("AB".compareTo("AC")); // -1
System.out.println("刘".compareTo("杨"));//比较刘和杨这两个字符对应的unicode值,返回刘-杨的unicode的差值
compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一
个字符的大小(根据 unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容
字符串的查找操作
最好用的就是contains()
String str = "helloworld" ;
System.out.println(str.contains("world")); // true
该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完
成。
使用indexOf()
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引
System.out.println(str.indexOf("bit")); // -1,没有查到
if (str.indexOf("hello") != -1) {System.out.println("可以查到指定字符串!");
}
- 使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
在进行查找的时候往往会判断开头或结尾endWith和startWith
。
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true
System.out.println(str.startsWith("@@",2)); // ture 后面一个参数决定从那个位置开始计算
System.out.println(str.endsWith("!!")); // true
字符串拆分操作
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { //返回的是一个字符串数组System.out.println(s);
}
String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;//说明最多只能分为两个子字符串
for(String s: result) {System.out.println(s);
}
//hello
//world hello bit
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.
拆分IP地址
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {System.out.println(s);
}
- 字符"|“, “*” , “+” 都得加上转义字符,前面加上”\".
- 而如果是"“,那么就得写成”\".
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符
字符串的替换操作
字符串的替换处理
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));//替换全部的_
System.out.println(str.replaceFirst("l", "_"));//替换第一个_
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串
其他操作
trim()
方法的使用,trim 会去掉字符串开头和结尾的空白字符(空格, 换行, 制表符等 )
String str = " hello world " ;
System.out.println("["+str+"]");
System.out.println("["+str.trim()+"]");
//[ hello world ]
//[hello world]
大小写转换
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
这两个函数只转换字母。
字符串length()
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.length());
注意:数组长度使用数组名称.length属性,而String中使用的是length()方法,而且我们的length()返回的是字符串代码单元的个数
- 想知道代码单元和码点的概念请看字符集和char的关系
isEmpty()
方法 判断一个字符串对象是不是空串
System.out.println("hello".isEmpty());
System.out.println("".isEmpty());
System.out.println(new String().isEmpty());
- 空串与Null串
- 空串是一个长度为0的字符串
- Null串表示目前没有任何对象和该变量进行关联
//判断是不是空串
if(str.length()==0)
if(str.equals(""))
//判断是不是null串
if(str==null)
字符串与字符和字节的关系
字符与字符串
我们String提供了将字符转换成字符串的构造方法
,和将字符串转换为字符数组的toCharArray()
String str = "helloworld" ;
// 将字符串变为字符数组
char[] data = str.toCharArray() ;
for (int i = 0; i < data.length; i++) {System.out.print(data[i]+" ");
}
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换
查找指定字符串指定位置的字符 charAt()
String str = "hello" ;
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
System.out.println(str.charAt(10));
// 执行结果
产生 StringIndexOutOfBoundsException 异常
- 返回的还是指定位置的代码单元,这个还是不要轻易使用,因为比较偏底层
字节与字符串
我们String提供了将字节转换成字符串的构造方法
,和将字符串转换为字节数组的getBytes()
String str = "helloworld" ;
// String 转 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) {System.out.print(data[i]+" ");
}
// byte[] 转 String
System.out.println(new String(data));
那么何时使用 byte[], 何时使用 char[] 呢?
- byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
- char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候
StringBuilder和StringBuffer
任何的字符串常量都是String对象,而且String的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲String的操作比较简单,但是由于String的不可更改特性,为了方便字符串的修改,而且因为如果频繁的对字符串进行拼接,会不断产生新的对象,比较消耗内存,所以提供StringBuffer和StringBuilder类。
如何让同一个字符串进行字符串拼接
StringBuffer 和 StringBuilder 大部分功能是相同的,主要介绍 StringBuffer
在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法:
public synchronized StringBuffer append(各种数据类型 )
使用提供的append方法来增加字符串的内容,这里不会产生新的对象,一种指向着一个对象
注意:String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer:利用StringBuffer的构造方法或append()方法
StringBuffer变为String:调用toString()方法
String和StringBuffer的相互转换
- String变为StringBuffer:利用StringBuffer的构造方法或append()方法
- StringBuffer变为String:调用toString()方法
String str1 = " hello world " ;
StringBuffer sb=new StringBuffer(str);
sb=sb.append(123);
String str2=sb.toString();
StringBuffer额外的方法
字符串反转 reverse
字符串反转
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.reverse());
删除操作 delete
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10)); //hello
插入操作insert
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好")); // 你好hello
请解释String、StringBuffer、StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的
- StringBuffer采用同步处理(在每个方法用synchronized修饰),属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
相关文章:
三周年活动解密游戏
首先先感谢来访和参与的小伙伴们,让 三周年活动完美结束,寄出N+1份福袋。三周年活动总共提供了两种福袋获取方式,第一种则就留了个诡异的链接...... 当你点进去的那一刻起游戏就开始了 Link start!Tips:当你看到这个提示的时候,说明当前的文章是由原emlog博客系统搬迁至此…...
OceanBase企业版4.x支持指定租户合并
下午同事询问3.x版本是否支持指定租户的合并操作,印象中没有,在官网上查询了下,也没有相关的操作手册,官方手册3.x地址如下: https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-0000000001417800 正好手头上还有4.x的环境,在查询4.x官网后发现,4.x版本已…...
「杂题乱刷」AT_abc354_f
大家一起来做下这个典题。 链接(at) 链接(luogu) 我们很容易可以想到处理前后缀的最长上升子序列的长度,然后容易 \(O(n \log_2 n)\) 预处理。 做完了。点击查看代码 /* Tips: 你数组开小了吗? 你MLE了吗? 你觉得是贪心,是不是该想想dp? 一个小时没调出来,是不是该考虑换…...
VS进行垂直视图剖分
窗口 -> 新建垂直文档组...
问题图片
...
SQL教程
SELECT语句 -- Websites: +----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https:…...
Java的字符串String
文章目录什么是字符串String类的声明为什么我们的String是不可变的为什么String类用final修饰String的创建字符串比较相等关于Java中的比较关于字符串不同赋值操作对应的内存分配那对象如何进行比较内容字符串常量池StringTalbe的位置字符串常见的操作拼接操作获得字符串的子串…...
net-java-php-python-网络安全教育学习网站计算机毕业设计程序
net-java-php-python-网络安全教育学习网站计算机毕业设计程序 net-java-php-python-网络安全教育学习网站计算机毕业设计程序本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开发软件:idea eclipse 前端技术:…...
git分支详解——记住这些指令能帮助你解决大部分git的分支问题
Github 之 分支 branch 操作之 查看分支/创建分支/切换分支/提交分支/删除分支/合并分支 等操作 一、简单介绍 二、查看分支 1、查看本地所有分支:git branch 2、查看远程有哪些分支:git branch -r 3、查看所有分支(本地和远程的)…...
jdk11新特性——JShell交互性工具
目录一、jshell概述二、jshell位置三、jshell示例3.1、示例一(声明变量并赋值)3.2、示例二(输出打印内容)3.3、示例三(帮助命令)一、jshell概述 java9引入了jshell这个交互性工具,让Java也可以…...
Git全套,从简到细
Git DravenGit一、git工具引入二、git本地工具2.1、下载2.2、使用2.3、修改2.4、查看历史版本2.5、回退历史版本2.6、起死回生三、git远程仓库3.1、使用gitee3.2、配置本地仓库参数3.3、查看gitee仓库3.4、修改后推送四、git两人协作-非冲突小智小杨五、git两人协作-冲突六、gi…...
【分布式能源的选址与定容】基于非支配排序多目标遗传优化算法求解分布式能源的选址与定容(Matlab代码实现)
👨🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…...
基于PHP+MySQL托管中心管理系统的设计与实现
随着在校学生人数的不断增加,学生的数量也在不断的增加,但是很多时候因为父母工作忙没时间,以及一些其他的原因没办法对学生间辅导,这就诞生了托管中心这一行业,但是传统的托管中心多是人工手动的模式进行管理的,这很不科学也不合理,为了改变这一现状,我们开发了托管中心管理系…...
【算法】排序——直接排序
内部排序的全部过程都是在内存中进行的。按排序策略的不同可以将内部排序划分为直接插入排序、冒泡排序、简单选择排序、希尔排序、快速排序、堆排序、归并排序、基数排序等。其中前三种排序方法属于简单的排序方法,其特点是排序过程直观、易于理解和实现࿰…...
华为高级技术专家多年经验分享微服务治理体系、架构及实践文档
前言 都说程序员工资高、待遇好, 2022 金九银十到了,你的小目标是 30K、40K,还是 16薪的 20K?作为一名 Java 开发工程师,当能力可以满足公司业务需求时,拿到超预期的 Offer 并不算难。然而,提升…...
HTML+CSS网页设计期末课程大作业 【茶叶文化网站设计题材】web前端开发技术 web课程设计 网页规划与设计
🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…...
数据结构与算法(六) 贪心算法
这篇文章来讲贪心算法(Greedy Algorithm),这是一种特殊的动态规划算法 1、本质 我们在之前的文章中讲过,动态规划可以解决一类具有最优子结构和重叠子问题特征的问题 贪心算法本质上是一种特殊的动态规划算法,因此在…...
LeetCode-1774. 最接近目标价格的甜点成本【数组,背包问题,优化暴力,回溯】
LeetCode-1774. 最接近目标价格的甜点成本【数组,背包问题,优化暴力,回溯】题目描述:解题思路一:转化为0-1背包求解。一:因为每种配料最多可以用两次,所以直接把每种辅料变成两个。二࿱…...
Python封装机制及实现方法
大部分语言都具备 3 个典型特征,即封装、继承和多态。 简单的理解封装(Encapsulation),即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”&…...
Flet 教程大全合集
Flet是什么 Flet 是一个框架,使您能够轻松地以您喜欢的语言构建实时 Web、移动和桌面应用程序,并与您的团队安全地共享它们。无需前端经验。 Flet有什么优势 Flet有什么特点 在几分钟内从想法到应用程序 用于您的团队、周末项目、数据输入表单、信息亭应用程序或高保真原型…...
mongodb整合springbootQ
SpringBoot整合MongoDB_一个冬天的童话的博客-CSDN博客_mongodb的依赖SpringBoot整合MongoDB的过程https://blog.csdn.net/m0_53563908/article/details/1268980981,环境配置 1.引入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...
【吴恩达机器学习笔记】十一、聚类
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为学习吴恩达机器学习视频的同学提供的随堂笔记。 📚专栏简介:在这个专栏,我将整理吴恩达机器学习视频的所有内容的笔记&…...
BUUCTF Misc 黑客帝国 [MRCTF2020]你能看懂音符吗 [HBNIS2018]caesar [HBNIS2018]低个头
黑客帝国 下载文件 一长串16进制,复制到在线16进制转文本 很明显是一个RAR文件,使用脚本将16进制转换成文件 import binasciihex_data这里填十六进制数据 outopen(res.rar,wb) out.write(binascii.unhexlify(hex_data)) out.close() 需要密码ÿ…...
基于多目标灰狼算法的冷热电联供型微网低碳经济调度(Matlab代码实现)
👨🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…...
Linux系统启动过程总结
Linux系统启动过程总结 1、Linux 中 rc.local、init.d、rc.x、init 这几个文件(夹)各有什么作用?启动执行的脚本应该均放在 rc.local 中吗? - 知乎 2、/etc/inittab文件详解_muxi01lingyi的博客-CSDN博客_/etc/inittab /etc/inittab文件详解 - 莘莘学子 - 博客园 3、Li…...
防火墙ssh详解讲解
♥️作者:小刘在C站\ ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一.防火墙配置对外的默认 二.防火墙配置内部ospf 三.防火墙远程管理 四.远程管理…...
Java【String】【StringBuilder】【StringBuffer】你都会用吗
文章目录前言一、常用的方法1、字符串构造2、字符串比较3、字符串查找4、字符串转化5、字符串替换6、字符串分割7、字符串截取二、字符串的不可变性三、StringBuilder、StringBuffer总结前言 在校招和笔试过程中,字符串是相当频繁被问到的话题,在之前的…...
Himall商城Xml帮助类 XML序列化 OSS策略
#region XML序列化 OSS策略 /// <summary> /// XML序列化 /// </summary> /// <param name="obj">序列对象</param> /// <param name="filePath">XML文件路径</param> /// …...
【人民币识别】人民币序列号识别【含GUI Matlab源码 908期】
⛄一、简介 本文描述的人民币序列号识别系统实现了从图像预处理到识别结果的过程, 而序列号识别是本文的重要内容.以序列号区域为研究对象, 主要包括图像预处理、图像分割以及序列号识别等过程。 1 图像预处理 人民币图像总体上来说灰度偏高, 灰度值基本上都大于150 (对8位25…...
html静态网站基于动漫网站网页设计与实现共计4个页面
HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐…...
Himall商城Zip帮助类压缩文件(Zip)
public class ZipInfo { /// <summary> /// 解/压缩成功状态 /// </summary> public bool Success { get; set; } /// <summary> /// 解/压缩结果信息 /// <…...
MyBatis-Plus条件构造器[常用的模糊查询、排序查询、逻辑查询和指定字段查询案例]
系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus中的更新操作&#x…...
cubeIDE开发, 如何结合FreeRTOS开发STM32程序
一、STM32CubeIDE使用内置的FreeRTOS 不同于STM32CubeIDE使用像RTThread这些第三方物联网系统,STM32CubeIDE在安装时就已经在MiddleWare中间件一栏直接支持了FreeRTOS操作系统。 既然STM32CubeIDE已经把FreeRTOS深度整合到了自家的系统中,所以移植及使用…...
写给儿子的一封信
最近听闻你成绩有点不理想,爸爸想跟你讲几个想法。 之前学羽毛球的时候,我往往带有期望,希望你能学成像林丹一样。每次你去上课,我也在旁边盯着,后来我发现效果不好,你好像很害怕我说你,学的也不…...
eclipse导入svn项目,项目有红色的感叹号/叉号
eclipse导入svn项目,项目左下角有红色的感叹号/叉号 1.首先调出Problems ( window -> show view-> Problems ) 查看报错信息 其次,看看Project是否开启了项目自动构建(Build Automatically) 2.根据报错信息逐一解决 3.…...
基于 Serverless 架构的 CI/CD 框架:Serverless-cd
近日,Serverless 开发者平台 Serverless Devs 重磅发布基于 Serverless 架构的轻量级 CI/CD 框架 ——Serverless-cd。Serverless-cd 是一款运行在 Serverless 架构上的功能强大而灵活,安全,低成本的 CI/CD 开源框架。该框架基于 Serverless …...
Vue Class与Style绑定
Vue Class与Style绑定1 Class绑定1.1 字符串写法1.2 数组写法1.3 对象写法2 Style绑定2.1 对象写法2.2 数组写法1 Class绑定 在Vue中,如果要为某个元素动态添加某个类,并不会使用document.getElementById等选择器将该元素获得,而是使用v-bin…...
制作一个谷歌浏览器插件,实现网页数据爬虫
一、什么是浏览器插件 浏览器插件,基于浏览器的原有功能,另外增加新功能的工具,是可定制浏览体验的小型软件程序,让用户可以根据个人需要或偏好来定制浏览器。 如拦截网页中的广告、划词翻译、倍速视频等等。 Chrome、edge等浏…...
Java实验七
文章目录前言一、判断E盘指定目录下是否有后缀名为.jpg的文件,如果有就输出此文件名称。二、分别使用字节流和字节缓冲流的两种读取方式实现对图片文件的复制操作并比较两种方式在复制时间上的效率。三、编写一个程序,分别使用转换流、字符流和缓冲字符流…...
Linux文件系统——文件系统、挂载点、目录结构
目录 一、目录结构 1.1 基本介绍 1.2 详细说明目录作用 二、挂载点 一、目录结构 1.1 基本介绍 Linux是一切皆文件,将所用的东西当做文件处理 目录结构就是一个单一的树状结构 整个的目录树只有一个树根:/ 根目录 文件夹分门别类的放到根目录…...
Linux——匿名管道、命名管道及进程池概念和实现原理
目录 一.什么是匿名管道 二.如何使用匿名管道 (一).pipe原理 (二).pipe使用 三.命名管道概念及区别 (一).什么是命名管道 (二).与匿名管道的联系和区别 四.命名管道的使用 &…...
[附源码]计算机毕业设计基于SpringBoot的高校课程知识库
项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…...
[网络工程师]-应用层协议-SNMP
简单网络管理协议(Simple Network Management Protocol,SNMP)是在应用层上进行网络设备间通信的管理协议,可以用于网络状态监视、网络参数设定、网络流量统计与分析、发现网络故障等。SNMP基于UDP协议,由SNMP协议、管理…...
BERT 相关资源整理
文章 NLP文档挖宝(3)——能够快速设计参数的TrainingArguments类 使用 PyTorch 进行知识蒸馏 调节学习率 Huggingface简介及BERT代码浅析 使用huggingface的Transformers预训练自己的bert模型FineTuning BERT 预训练 预训练模型:从BERT到XLNet、RoBERTa、ALBERT B…...
tinymce富文本编辑器的使用
tinymce富文本编辑器的使用 1、基本介绍 tinymce富文本官网:https://www.tiny.cloud/ 中文文档:http://tinymce.ax-z.cn/ tinymce-npm地址:https://www.npmjs.com/package/tinymce tinymce英文文档-示例地址:https://www.tin…...
【大数据趋势】12月3日纳指大概率反弹到黄金分割附近,然后下跌,之后进入趋势选择期,恒指会跟随。感觉或许有什么大事情要发生,瞎猜中。
行情核心源头分析: 纳斯达克指数 是否会符合大数据规则,走黄金分割线规则 回顾一下上周大数据预测的趋势,虽有波折但最终趋势预测准确 上周11.20日大数据模拟出一个趋势图,大趋势上需要继续上涨尾期,制造一个背离出现,…...
vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 下载print.js之ref设置锚点
vue中打印插件vue-print-nb(二)-实例之两种方法——安包之设置一个id和绑定一个对象 & 下载print.js之ref设置锚点 第一种方法 方式1、设置一个id ① 给要打印的部分设置一个 id ② 在打印按钮中添加 v-print"#id名" 1、安装vue-print-nb插件 npm install v…...
[ 渗透测试面试篇 ] 渗透测试面试题大集合(详解)(八)暴力破解相关面试题
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
ssm项目整合,简单的用户管理系统
ssm项目整合,简单的用户管理系统项目概述项目搭建创建项目1.创建maven项目2.导入项目依赖及maven资源过滤设置3.添加web支持4.配置tomcat5.配置web发布依赖jar包6.数据库的表创建7.实体类创建7.1 lombok常用注解:dao层1.daoMapper接口创建2.Mapper.xml配置文件3.myb…...
2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校饭堂管理系统8gmjo
这个选题的话其实有很多的,就看你自己能接受怎么样的,比如可以做网站类、系统类、小程序类、安卓app、大数据类等等,这个也要看你个人能力和技术问题,如果技术小白或者有一点点基础的话建议选择网站类和系统类的,如果有…...
Kettle BIGNUMBER TIMESTAMP 类型格式处理
一、问题描述 Kettle默认的格式化处理对BIGNUMBER列 ,把0 会强行写成0.0;对TIMESTAMP列强行写成如2021/12/31 16:51:55.000000000格式。从而引起不必要错误。 二、解决方案 最新的Kettle下载地址:https://udomain.dl.sourceforge.net/project/pentaho/Pentaho-9.3/client…...
Qt实现编辑框失去焦点隐藏功能
今天来为大家分享一个小功能,首先看实现的效果吧~ 功能讲解: QLineEdit控件进行文本编辑,点击保存按钮后,隐藏编辑框和保存按钮,仅展示编辑内容,当鼠标点击空白处时,同样隐藏编辑框、隐藏保存按…...
人工智能内容生成元年—AI绘画原理解析
AIGC体验生成一、背景 2022年AIGC(AI生成内容)焕发出了勃勃生机,大有元年之势,技术与应用迭代都扎堆呈现。在各种新闻媒体处可以看到诸多关于学术前沿研究,以及相应落地的商用案例。可谓出现了现象级的学术-商业共振。…...
基于STM32单片机的温度报警器(数码管)(Proteus仿真+程序)
编号:26 基于STM32单片机的温度报警器(数码管) 功能描述: 本设计由STM32F103单片机最小系统DS18B20温度传感器数码管显示模块声光报警模块独立按键组成。 1、主控制器是STM32F103单片机 2、DS18B20温度传感器测量温度 3、数码管显示温度值&…...
Ubuntu18.04安装ROS、Gazebo、Mavros、PX4、QGC教程
修改国内源 修改apt sudo cp /etc/apt/source.list /etc/apt/source.list.old sudo gedit /etc/apt/source.list输入如下进行保存 deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic m…...
Java项目:SSM学生会管理系统
作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员、学生两种角色, 管理员角色包含以下功能: 管理员登陆,管理学生,管理机构,活动信息发布,部门管理,职位…...
ModuleNotFoundError: No module named ‘sklearn‘
ModuleNotFoundError: No module named sklearn 解决办法: pip install scikit-learn...
DS高阶:跳表
一、skiplist 1.1 skiplist的概念 skiplist本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型。skiplist是由William Pugh发明的,最早出现于他在1990年发…...
Qt多文档程序的一种实现
注:文中所列代码质量不高,但不影响演示我的思路 实现思路说明 实现DemoApplication 相当于MFC中CWinAppEx的派生类,暂时没加什么功能。 DemoApplication.h #pragma once#include <QtWidgets/QApplication>//相当于MFC中CWinAppEx的派生…...
供应索尼ISX017-0AWR-C芯片
长期供应各品牌芯片: ISX017-0AWR-C IMX225LQR-C IMX415-AAQR-C IMX290LQR-C imx273llr-C IMX397CLN-C IMX637-AAMJ-C IMX647-AAMJ-C IMX991-A***-C IMX991-AABJ-C IMX250LLR-C IMX250LQR-C IMX253LLR-C IMX253LQR-C IMX264LLR-C IMX264MZR-C IMX2…...
笑铺日记:服装店看这3个数字,就知道赚不赚钱
明明店里每天人来人往,月底一算账,却发现没赚多少钱? 都说要数据分析,但是到底怎么做?这是每个老板都头疼不已的事情。 其实,服装店管好这3个数字,赚钱就不是事儿。 笑铺日记系统,…...
Minecraft 我的世界服务器Java版开服联机教程
本教程使用Paper核心开服 1、进入控制面板 1.2、第一次购买服务器会安装游戏端,大约5分钟左右,如果长时间处于安装状态请联系客服 2、开启服务器 2.1、等待出现同意Minecraft EULA 协议时,点击“我接受” 2.2、等待running出现服务器就打开了…...
原创|手把手教你构建评分卡模型
作者:胡赟豪 本文约2800字,建议阅读5分钟 本文介绍了构建评分卡模型。 一、背景 在各种机器学习、深度学习模型快速发展的当下,评分卡模型作为一种可解释机器学习模型,仍然在金融、营销等领域被广泛使用。这一模型通…...
go语言数组与切片
1.数组 数组 类型名是[n]elemetType,其中n是数组长度,elementType是数组元素类型。比如一个包 含2个int类型元素的数组类型可表示为[2]int。 数组一般在创建时通过字面量初始化,单独声明一个数组类型变量而不进行初始化是没有意义的。 packa…...
AI视频教程下载:用ChatGPT快速精通Python编程
这个课程是为想要通过ChatGPT提升Python编程技能的个人设计的。 **你将会学到的:** - Python编程语言的基础知识。 - ChatGPT的介绍和多种用例。 - 如何使用ChatGPT加快你的编码项目的开发。 - 了解新技术,如数据科学和机器学习,并进行实…...
OpenAI 发布 GPT-4o,再次巩固行业地位!
5 月 14 日凌晨 1 点(太平洋时间上午 10 点),OpenAI 发布了其最新的 GPT-4o,再次巩固了其在人工智能领域的领导地位。这次发布不仅仅是一个产品的推出,更是向世界宣告 AI 技术已迈入一个全新的纪元。OpenAI 的 CEO 萨姆…...
skimage图像处理(五)
多数量图像处理(批量化处理) 多数量图片内读取指定图片 首先导入skimage.io模块并将其简称为io,导入skimage库中的data_dir模块,用于获取示例图像的目录路径 import skimage.io as io from skimage import data_dir 构建…...