先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:xhs1999xhs (备注Java)
正文
认识String类
字符, 字节与字符串
字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String(char value[]) | 构造 | 将字符数组中的所有内容变为字符串 |
2 | public String(char value[], int offset, int count) | 构造 | 将部分字符数组中的内容变为字符串 |
3 | public char charAt(int index) | 普通 | 取得指定索引位置的字符索引从0开始 |
4 | public char[] toCharArray() | 普通 | 将字符串变为数组返回 |
代码示例 No1
public static void main(String[] args) {
char[] val = {'a','b','c'};
String str = new String(val);
//这玩意儿不会放到常量池的,因为没用""引起来哦~
System.out.println(str);
}
//abc
代码示例 No2
public static void main(String[] args) {
char[] val = {'a','b','c','d','e','f'};
String str = new String(val,1,3);
System.out.println(str);
}
//bca
代码示例 No3
public static void main(String[] args) {
String str="Nick\_Bears";
char c = str.charAt(2);//获取2下标的字符
System.out.println(c);
}
//c
示例代码 No4
public static void main(String[] args) {
String str="Nick\_Bears";
char[] chars = str.toCharArray();//把str指向的字符串对象变成字符数组
System.out.println(Arrays.toString(chars));
}
//[N, i, c, k, \_, B, e, a, r, s]
代码示例: 给定字符串一个字符串, 判断其是否全部由数字所组成
思路: 将字符串变为字符数组而后判断每一位字符是否是" 0 “~”‘9’"之间的内容,如果是则为数字
//实现1
public static void main(String[] args) {
String str ="5201314";
System.out.println(isNumberChar(str));
}
public static boolean isNumberChar(String s){
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c<'0' || c>'9'){
return false;
}
}
return true;
}
//true
//实现2
public static void main(String[] args) {
String str ="5201314";
System.out.println(isNumberChar(str));
}
public static boolean isNumberChar(String s){
for (int i = 0; i < s.length(); i++) {
//判断某个字符是不是数字
char c = s.charAt(i);
boolean flg = Character.isDigit(c);
if(flg==false){
return false;
}
}
return true;
}
//true
字节与字符串
字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换。
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String(byte bytes[]) | 构造 | 将字节数组变为字符串 |
2 | public String(byte bytes[], int offset, int length) | 构造 | 将部分节数组中的内容变为字符串 |
3 | public byte[] getBytes() | 普通 | 将字符串以字节数组的形式返回 |
4 | public byte[] getBytes(String charsetName) throws UnsupportedEncodingException | 普通 | 编码转换处理 |
代码示例 No1
public static void main(String[] args) {
byte[] bytes={97,98,99,100};
String str = new String(bytes);
System.out.println(str);
}
//abcd
示例代码 No2
public static void main(String[] args) {
byte[] bytes={97,98,99,100};
String str = new String(bytes,1,3);
System.out.println(str);
}
//bcd
当你一不小心输入一个值的时候,String上 会出现一条斜线
示例代码 No 3
public static void main(String[] args) {
String str = "abcd";
byte[] bytes1 = str.getBytes();
System.out.println(Arrays.toString(bytes1));
}
//[97, 98, 99, 100]
示例代码 No 4
public static void main(String[] args) throws UnsupportedEncodingException {
String str = "abcd";
String str1 = "abcd好可爱!";
byte[] bytes = str.getBytes("utf-8");
// 英文 1字节 中文 3字节
byte[] bytes1 = str1.getBytes("utf-8");
// 英文 1字节 中文 2字节
byte[] bytes2 = str1.getBytes("GBK");
System.out.println(Arrays.toString(bytes));
System.out.println(Arrays.toString(bytes1));
System.out.println(Arrays.toString(bytes2));
}
//[97, 98, 99, 100]
//[97, 98, 99, 100, -27, -91, -67, -27, -113, -81, -25, -120, -79, 33]
//[97, 98, 99, 100, -70, -61, -65, -55, -80, -82, 33]
小结
那么何时使用 byte[], 何时使用 char[] 呢?
- byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
- char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候
回忆概念: 文本数据 vs 二进制数据
一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容
- 如果看的懂, 就是文本数据(例如 .java 文件)
- 如果看不懂, 就是二进制数据(例如 .class 文件)
字符串常见操作
字符串比较
- 真假比较
- 大小比较
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean equals(Object anObject) | 普通 | 区分大小写比较 |
2 | public boolean equalsIgnoreCase(String anotherString) | 普通 | 不区分大小写比较 |
3 | public int compareTo(String anotherString) | 普通 | 比较两个字符串大小关系 |
equals
源码分析:
- this == anObject 判断地址是否相同,不同false
- anObject instanceof String 判断是否为String类型,不同false
- n == anotherString.value.length 判断长度,不同false
- v1[i] !=v2[i] 最后一个个比较,若不同为false
代码示例:不区分大小写比较
public static void main(String[] args) {
String str1 = "Nick";
String str2 = str1;
String str3 = "luck";
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str3));
}
//ture
//false
equalsIgnoreCase
代码示例:区分大小写比较
public static void main(String[] args) {
String str1 = "Nick";
String str2 = "nick";
System.out.println(str1.equalsIgnoreCase(str2));
}
//true
compareTo
范例:观察compareTo()比较
public static void main(String[] args) {
String str1 = "Nick";
String str2 = "nick";
String str3 = "Nick";
System.out.println(str2.compareTo(str1));//32
System.out.println(str1.compareTo(str3));//0
System.out.println(str1.compareTo(str2));//-32
}
compareTo()是一个可以区分大小关系的方法,是String方法里是一个非常重要的方法。
字符串的比较大小规则, 总结成三个字 “字典序” 相当于判定两个字符串在一本词典的前面还是后面. 先比较第一个字符的大小(根据unicode 的值来判定), 如果不分胜负, 就依次比较后面的内容 。
字符串查找
从一个完整的字符串之中可以判断指定内容是否存在,对于查找方法有如下定义:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public boolean contains(CharSequence s) | 普通 | 判断一个子字符串是否存在 |
2 | public int indexOf(String str) | 普通 | 从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1 |
3 | public int indexOf(String str, int fromIndex) | 普通 | 从指定位置开始查找子字符串位置口 |
4 | public int lastIndexOf(String str) | 普通 | 由后向前查找子字符串位置 |
5 | public int lastIndexOf(String str, int fromIndex) | 普通 | 从指定位置由后向前查找· |
6 | public boolean startsWith(String prefix) | 普通 | 从指定位置开始判断是否以指定字符串开头 |
7 | public boolean startsWith(String prefix, int toffset) | 普通 | 判断是否以指定字符串结尾口 |
8 | public boolean endsWith(String suffix) | 普通 | 判断是否以指定字符串结尾口 |
contains
代码示例: 字符串查找,最好用最方便的就是contains()
public static void main(String[] args) {
String str = "abcdefg";
String tmp = "eg";
String tmps = "ab";
System.out.println(str.contains(tmp));//false
System.out.println(str.contains(tmps));//true
}
该判断形式是从JDK1.5之后开始追加的,在JDK1.5以前要想实现与之类似的功能,就必须借助、indexOf()方法完成
indexOf
代码示例: 使用indexOf()方法进行位置查找
使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置
public static void main(String[] args) {
String str = "abcdefg";
String tmp = "de";
System.out.println(str.indexOf(tmp));//类似于c的strstr-> KMP算法
System.out.println(str.indexOf(tmp,4));//设置开始找的位置 -1
System.out.println(str.indexOf(tmp,3));// 3
}
//3
public static void main(String[] args) {
String str = "dededeabcdefg";
String tmp = "de";
//从后往前找
System.out.println(str.lastIndexOf(tmp));//9
System.out.println(str.lastIndexOf(tmp,6));//4
}
startsWith
endWith
在进行查找的时候往往会判断开头或结尾
代码示例: 判断开头或结尾
public static void main(String[] args) {
String str ="NickNickNickNick";
String tmp = "k";
//起始位置
System.out.println(str.startsWith("N"));//true
System.out.println(str.startsWith("c"));//false
//设置起始偏移量
System.out.println(str.startsWith("N",4));//true
System.out.println(str.startsWith("N",5));//false
//判断结尾
System.out.println(str.endsWith("CK"));//false
System.out.println(str.endsWith("ck"));//true
}
字符串替换
使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String replace(char oldChar, char newChar) | 普通 | 替换指定所有内容 |
2 | public String replaceFirst(String regex, String replacement) | 普通 | 替换首个内容 |
replace
replace 和 replaceAll 效果一样的
代码示例: 字符串的替换处理
public static void main(String[] args) {
String str = "abababacbacbancabcba";
//相同返回this,不同会new
String str2 = str.replace('a', 'b');//这里两个参数是char
System.out.println(str2);//bbbbbbbcbbcbbncbbcbb
}
public static void main(String[] args) {
String str = "abcabcabcabc";
//相同返回this,不同会new
String str2 = str.replace("ab", "er");//这里两个参数是String
System.out.println(str2);//ercercercerc
}
//------------------------------------------------------------------------------
public static void main(String[] args) {
String str = "abababacbacbancabcba";
//相同返回this,不同会new
String str2 = str.replaceAll('a', 'b');//这里两个参数是char
System.out.println(str2);//bbbbbbbcbbcbbncbbcbb
}
public static void main(String[] args) {
String str = "abcabcabcabc";
//相同返回this,不同会new
String str2 = str.replaceAll("ab", "er");//这里两个参数是String
System.out.println(str2);//ercercercerc
}
replaceFirst
代码示例: 替换首个内容
public static void main(String[] args) {
String str = "abcabcabcabc";
String str2 = str.replaceFirst("ab", "er");
System.out.println(str2);//ercabcabcabc
}
字符串拆分
split
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String[] split(String regex) | 普通 | 将字符串全部拆分 |
2 | public String[] split(String regex, int limit) | 普通 | 将字符串部分拆分,该数组长度就是limit极限 |
代码示例: 实现字符串的拆分处理(多次拆分)
public static void main(String[] args) {
String str = "name=Nick&age=20&classes=大数据一班";
String[] str1 = str.split("&");
for (String s:str1){
String[] str2 = s.split("=");
for (String ss:str2){
System.out.print(ss+" ");
//name Nick age 20 classes 大数据一班
}
}
}
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义
代码示例: 拆分IP地址
public static void main(String[] args) {
String str = "192.168.1.1";
String[] arr1 = str.split("\\.");
for (String s:arr1){
System.out.println(s);
}
}
注意事项
- 字符"|“,”*“,”+"都得加上转义字符,前面加上 \
- 而如果是" \ \ ",那么就得写成 \ \ \ \ .
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符
**代码示例: | 作为连接符 **
public static void main(String[] args) {
//我要将str的全部分割!
String str = "name Nick&age=20#classes=大数据一班";
String[] arr = str.split(" |&|=|#");
for(String s:arr){
System.out.print(s+" ");
//name Nick age 20 classes 大数据一班
}
}
字符串的截取
substring
从一个完整的字符串之中截取出部分内容。可用方法如下:
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String substring(int beginIndex) | 普通 | 从指定索引截取到结尾 |
2 | public String substring(int beginIndex, int endIndex) | 普通 | 截取部分内容 |
代码示例: 观察字符串截取 No 2
public static void main(String[] args) {
String str ="Nick1234567890";
String sub = str.substring(2,3);//左闭右开[ )
System.out.println(sub);//提取字串 c
}
其他操作方法
No | 方法名称 | 类型 | 描述 |
---|---|---|---|
1 | public String trim() | 普通 | 去掉字符串中的左右空格,保留中间空格 |
2 | public String toUpperCase() | 普通 | 字符串转大写 |
3 | public String toLowerCase() | 普通 | 字符串转小写 |
4 | public native String intern() | 普通 | 字符串入池操作 |
5 | public String concat(String str) | 普通 | 字符串拼接,等同于“+”,不入池 |
6 | public int length() | 普通 | 取得字符串长度 |
7 | public boolean isEmpty() | 普通 | 判断是否为空字符串,但不是null,而是长度为0 |
代码示例: 观察trim()方法的使用
public static void main(String[] args) {
String str = " 520 1 3 14";
System.out.println(str.trim());//去除左右两边空格,中间的空格不会被删除
//520 1 3 14
}
代码示例: 大小写转换
public static void main(String[] args) {
String str = "nick";
String str1="NICK";
System.out.println(str.toUpperCase()); //NICK
System.out.println(str1.toLowerCase());//nick
}
//这两个函数只转换字母
代码示例:字符串入池
public static void main(String[] args) {
String str2=new String("ni")+new String("ck");
str2.intern();
String str="nick";
System.out.println(str==str2);//true
}
//这里不去过多去讲入池了,详情看第一篇String
代码示例:拼接
public static void main(String[] args) {
String str = "Nick";
String ret = str.concat("很宠粉哦~");
//不入池是指拼接好new 出的这个对象不会自动入池
System.out.println(ret);
}
//Nick很宠粉哦~
代码示例: 字符串length()
public static void main(String[] args) {
String str="12345";
System.out.println(str.length());
int[] array = {1,2,3,4,5};
System.out.println(array.length);
//搞清楚方法和参数,括号带不带看清楚哦
//Java 里面的数组 非常特殊 机制很多
}
代码示例:观察isEmpty()方法
public static void main(String[] args) {
String str="123";
String str1=" ";
String str2="";
String str3=new String();
System.out.println(str.isEmpty());//false
System.out.println(str1.isEmpty());//false
System.out.println(str2.isEmpty());//true
System.out.println(str3.isEmpty());//true
}
String类并没有提供首字母大写操作,需要自己实现
代码示例: 首字母大写
public static void main(String[] args) {
String str="interesting";
System.out.println(FirstUpper(str));//Interesting
}
public static String FirstUpper(String s){
if("".equals(s) || s==null){
return s;
}
if(s.length()>1){
return s.substring(0,1).toUpperCase().concat(s.substring(1));
}
return s.toUpperCase();
}
最后
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
(str1.isEmpty());//false
System.out.println(str2.isEmpty());//true
System.out.println(str3.isEmpty());//true
}
>
> String类并没有提供首字母大写操作,需要自己实现
>
>
>
>
> **代码示例: 首字母大写**
>
>
>
public static void main(String[] args) {
String str="interesting";
System.out.println(FirstUpper(str));//Interesting
}
public static String FirstUpper(String s){
if("".equals(s) || s==null){
return s;
}
if(s.length()>1){
return s.substring(0,1).toUpperCase().concat(s.substring(1));
}
return s.toUpperCase();
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/99023bf492714ce789afb039f4ccc783.gif#pic_center)
# 最后
[外链图片转存中...(img-GNRY60dz-1713695755793)]
[外链图片转存中...(img-9MJL0g0L-1713695755793)]
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**需要这份系统化的资料的朋友,可以添加V获取:xhs1999xhs (备注Java)**
[外链图片转存中...(img-5YCqqMbL-1713695755794)]
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**