54从零开始学Java54之String字符串很常用_string是final类,一旦创建了一个string对象,理论上就不能再被改变,当然我们可

一、网安学习成长路线图

网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、网安视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

三、精品网安学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、网络安全源码合集+工具包

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

在这里插入图片描述

五、网络安全面试题

最后就是大家最关心的网络安全面试题板块
在这里插入图片描述在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

String是Java里的一个类,属于引用类型,遵循引用类型的基本规律和要求。但它也有自己的一些特点,比如可以直接用双引号"…"来表示一个字符串,所以凡是用双引号括起来的一串字符都是String对象,如“Hello”在编译后就会成为一个String对象。

而且String是final类,一旦创建了一个String对象,理论上就不能再被改变,当然我们可以使用其他变量重新赋值的方式进行更改。

另外从名字上我们也可以猜测出,字符串与字符有一定的关系。实际上,String字符串的内部是通过一个private final char[]数组来实现数据存储的,所以我们可以通过如下方式来表示一个字符串:

String str = new String(new char[] {'H', 'e', 'l', 'l', 'o', 'y', 'y', 'g'}); 

当然,以上这种字符串的表达方式太过麻烦,而且由于String太常用了,所以Java就提供了"…"这种极简的表达方式供我们使用。

我们要知道,Java字符串的一个重要特点就是字符串的不可变性。这种不可变主要是通过final修饰String类,private final char[]字段对数据的存储,且没有提供任何可以修改char[]字段的方法来实现的。

2. 与字符的区别

之前给大家讲过java里的8种基本数据类型,我们知道,其中有一种比较特殊的char字符类型,可以在单引号中存储单个的字符元素,比如’A’、‘9’、‘国’ 等。而我们今天要学习的String类,则是用双引号"…"来表达字符串的。作为初学者,我们一定要注意字符与字符串的区别:

● 字符只能表示单个字符元素,必须用单引号’‘把单个的字符元素括起来,如’A’、‘9’、‘国’ 等;

● 字符串可以表示单个或多个字符元素,必须用双引号把单个或多个字符元素括起来,如"A"、“Hi”、"中国"等;

● 字符是基本类型,其本质是一种数值;字符串是引用类型,其本质是一个java类。

3. 定义方式

String字符串的定义方式,常用的有如下两种:

  1. 通过构造方法创建字符串对象;
  2. 直接赋值。

我们在开发时,其实很少使用第一种方式,因为太过啰嗦,一般都是通过直接赋值的方式进行定义。

3.1 构造方法定义

Java为String类提供了11个构造方法创建String对象,这些方法提供了不同的参数来初始化字符串。当字符串变量被创建处理后,必须经过初始化才能使用。下面是通过构造方法定义String对象的几种方式,大家可以参考:

public class Demo01 {
	
	public static void main(String[] args) {
		//通过构造方法创建String对象
		
		//构造一个空字符串,相当于String s1="";
		String s1=new String();
		System.out.println("s1的长度="+s1.length()+",s1="+s1);
		
		//构造一个由内容的字符串,相当于String s1 = "一一哥";
		String s2 = new String("跟一一哥学Java"); 
		System.out.println("s2的长度="+s2.length()+",s2="+s2);

		//通过字节数组构建字符串对象
		byte[] b = {97,98,99,100};
		String s3=new String(b);
		System.out.println("s3的长度="+s3.length()+",s3="+s3);
		
		//通过字节数组构建字符串对象
		//参数1:字节数组;参数2:起始下标;参数3:长度
		String s4 = new String(b, 0, b.length);
		System.out.println("s4的长度="+s4.length()+",s4="+s4);

		//通过字符数组创建字符串对象
		char[] c = {'一','一','哥'};
		String s5 = new String(c, 0, c.length);
		System.out.println("s5的长度="+s5.length()+",s5="+s5);
		
	}
	
}

3.2 直接赋值定义

下面是通过直接赋值的方式来定义String对象的方式,大家可以参考:

public class Demo02 {
	
	public static void main(String[] args) {
		//直接赋值的方式创建String对象
		
		//注意:null表示String对象为空,而""表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!
		//定义一个值为null的空字符串
		String s1=null;
		System.out.println("s1="+s1);
		
		//定义一个内容为空,长度为零的字符串
		String s2 = "";
		System.out.println("s2的长度="+s2.length()+",s22="+s2);
		
		//定义一个带有内容的字符串
		String s3 = "一一哥";
		System.out.println("s3的长度="+s3.length()+",s3="+s3);
		
	}
	
}

我们要注意String s=null与String s=""的区别:

● String s=null表示String对象为空,即字符串对象的引用指向了null,还没有指向任何的内存空间;

● String s=““是声明了一个字符串类型的引用,其值为””,表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!这个s对象的引用指向的是空字符串的内存空间。

以上内容,是对字符串定义和使用的常规操作,但实际上String字符串还有其他很多有用的方法,接下来我们就专门给大家介绍一下这些实用方法。

二. 字符串实用方法

1. 字符串的比较方法

在Java中,如果我们想比较两个字符串,其实主要是比较两个字符串的内容是否相同,所以应该使用equals()方法,而不要使用==进行比较。

public class Demo04 {
	
	public static void main(String[] args) {
		String s1 = "hello";
        String s2 = "hello";
        
        //==用于比较两个对象的地址
        System.out.println("s1==s2的结果:"+(s1 == s2));
        
        //equals()用于比较两个对象的内容
        System.out.println("s1.equals(s2)的结果:"+s1.equals(s2));
		
	}
	
}

大家注意,在上面的案例中,虽然使用和equals()比较的结果都是true,但实际上这只是”凑巧“罢了。在本案例中,之所以使用”“进行比较的结果也是true,这是因为Java编译器在编译期,自动把所有相同内容的字符串当作一个对象放入到了字符串常量池。所以s1和s2都指向了同一个引用地址,结果自然就是相同的。但如果我们把上述案例换一种写法,再利用”==“进行比较就不是这样的结果。

public class Demo04 {
	
	public static void main(String[] args) {
        //新的写法
        String s3 = "yiyige";
        //将字符串转为小写
        String s4 = "YIYIGE".toLowerCase();
        //此时s3和s4是指向两个不同引用地址的对象
        System.out.println("s3==s4的结果:"+(s3 == s4));
        System.out.println("s3.equals(s4)的结果:"+s3.equals(s4));
	}
	
}

从上面的案例中,我们可以得出一个结论,要想比较两个字符串,应该使用equals()方法,而不是"=="方法!

2. 判断字符串是否为空

另外在前面的代码案例中,我们还给大家介绍了两种定义String字符串对象的方式,并在第2种方式中给大家提到了null与"“两种为空的情况。而我们在实际开发中,判断一个字符串对象是null与”",其实是一种非常常见的操作,那么我们该怎么判断String对象是否是null或""呢?

public class Demo03 {
	
	public static void main(String[] args) {
		//判断字符串对象是否为null或""
		
		//注意:null表示String对象为空,而""表示是一个长度为零、内容为空的空字符串对象,但该对象不为空!
		
        //定义一个值为null的空字符串
		String s1=null;
		
		//判断方式1:判断对象是否为null
		if(s1==null) {
			System.out.println("s1字符串对象为null,s1="+s1);
		}
		
		//定义一个内容为空,长度为零的字符串
		String s2 = "";
		
		//判断方式2:这种判断写法存在异常隐患,字符串对象s2有可能为null,如果s2.equals()调用时,s2可能为null,此时就会出现空指针异常
		if(s2.equals("")) {
			System.out.println("s2的长度="+s2.length()+",s2="+s2);
		}
		
		//判断方式3:对上面的判断方式进行改进,用以下方式进行判断,就会消除空指针异常的隐患
		if("".equals(s2)) {
			System.out.println("s2的长度="+s2.length()+",s2="+s2);
		}
		
		//判断方式4:判断一个空串的长度是否为0,这种判断字符串是否为空的方式效率更高
		if(s2.length()==0) {
			//我们也可以直接使用字符串的isEmpty()方法,其内部实现与此方式相同。
			System.out.println("s2的长度="+s2.length()+",s2="+s2);
		}
		
		//判断方式5:更全面严谨的判断。s==null一定要写在前面,因为如果s为null,先调用后面的s.length()就会出现空指针异常
		if(s2 == null || s2.length() == 0) {
			System.out.println("s2的长度="+s2.length()+",s2="+s2);
		}
		
		//判断方式6:或者我们直接使用字符串的isBlank()方法
		if(s2.isBlank()) {
			System.out.println("s2的长度="+s2.length()+",s2="+s2);
		}
		
	}
	
}

在实际开发时,我们一般是采用第5种判断方式,这种判断方式更为严谨,能够把两种”为空“的情况都考虑到。当然,我们也可以直接使用字符串对象提供的isEmpty()或isBlank()方法,进行判空。另外我们要特别注意,防止出现空指针异常,并且也要考虑采用哪种方式判断为空的情况效率更高。

3. 判断相关的方法

String字符串中提供了几个与字符串判断相关的方法,可以对一个字符串进行各种判断,这几个方法如下:

● equals():判断两个字符串的内容是否相同;

● equalsIgnoreCase():判断两个字符串是否相等,忽略大小写;

● isEmpty():判断字符串是否为空串"",主要是判断字符串长度是否为0;

● isBlank():判断字符串是否为空串"",主要是判断字符串中是否包含空白字符;

● startsWith():判断字符串是否以指定的字符串开头;

● endsWith():判断字符串是否以指定的字符串结尾;

● contains():判断字符串中是否包含指定的字符串,参数是CharSequence类型,而不是String。

public class Demo05 {
	
	public static void main(String[] args) {
		String s1 = "yiyige"; 
		
		//判断两个字符串的内容是否相同
		System.out.println("yiYige".equals(s1));
		
		//判断两个字符串是否相等,忽略大小写
		System.out.println("yiyige".equalsIgnoreCase(s1));
		
		//判断字符串是否为空,或是否有空白字符
		
		//长度为0,字符串为空
		String s2="";
		
		//长度不是0,字符串不为空
		String s3=" ";
		
		//长度不是0,字符串不为空
		String s4=" \n";
		
		//判断字符串是否为空串""
		System.out.println("s2为空吗?"+s2.isEmpty());//true
		System.out.println("s3为空吗?"+s3.isEmpty());//false
		System.out.println("s4为空吗?"+s4.isEmpty());//false
		
		//判断字符串是否是空串或有空白字符
		System.out.println("s2为空吗?"+s2.isBlank());//true
		System.out.println("s3为空吗?"+s3.isBlank());//true
		System.out.println("s4为空吗?"+s4.isBlank());//true
		
		String s5 = "1234567890123";
		//判断字符串是否以指定的字符开头
		System.out.println(s5.startsWith("12"));
		
		//判断字符串是否以指定的字符串开头,并指定开始位置
		System.out.println(s5.startsWith("34", 2));
		
		//判断字符串是否以指定的字符串结尾
		System.out.println(s5.endsWith("23"));
		
		//判断字符串中是否包含指定的字符串
		System.out.println(s5.contains("SB"));
	}
	
}

4. 获取相关的方法

String字符串中提供了几个与字符串获取相关的方法,这几个方法如下:

● charAt():获取指定下标位置上对应的字符,并返回char类型;

● indexOf():获取指定字符串在原字符串中的下标索引位置,如果不包含该字符串则返回-1;

● lastIndexOf():该方法与indexOf()类似,但该方法是从后往前找,找到指定字符最后出现的位置;

● length():该方法用于返回字符串对象中包含的字符数量,即可以获取字符串的长度。

public class Demo06 {
	
	public static void main(String[] args) {
		String s1 = "abcn12c3fcds";
		
		//charAt(index),获取指定下标位置上对应的字符,并返回char类型
		System.out.println("下标索引位置3上的字符是:"+s1.charAt(3));
		
		//indexOf("字符串"),获取指定字符串在原字符串中的下标位置,如果不包含该字符串则返回-1
		System.out.println("字符串的索引位置是:"+s1.indexOf("cn2"));
		
		//lastIndexOf("字符串"),与indexOf()方法类似,区别是该方法是从后往前找,找到指定字符最后出现的位置
		System.out.println("指定字符的索引为:"+s1.lastIndexOf("c"));
		
		//length(),获取字符串的长度
		System.out.println("字符串的长度是:"+s1.length());
		
	}
	
}

5. 拼接、替换、截取、分割、去空格等方法

String字符串中提供了拼接、替换、截取、分割等方法,这几个方法如下:

● concat():将某个字符串连接到该字符串的结尾,并返回拼接后的字符串,相当于s1 = s1 + “world”;

● join():用指定的字符串连接字符串数组;

● replace():将字符串中指定的字符串替换成指定的字符串;

● replaceAll():利用正则表达式,将字符串中指定的字符串替换成指定的字符串;

● substring(start,end):字符串截取,从指定的下标索引开始和结束,范围是左闭右开,注意索引是从0开始;

● substring(index):字符串截取,从指定的索引下标开始一直截取到字符串的最后;

● split():字符串切割,按照指定的字符串对原字符串进行切割;

● trim():不改变原有字符串内容,只是去除字符串首尾的空白字符,包括空格、\t、\r、\n。

public class Demo07 {
	
	public static void main(String[] args) {
        //用指定的字符串连接字符串数组
		String[] arr = {"A", "B", "C"};
		String str = String.join("\*\*\*", arr); // "A\*\*\*B\*\*\*C"
		System.out.println("新的字符串str="+str);

        String s1 = "hello,SB";
		
		//将字符串与指定的字符串进行拼接,相当于s1 = s1 + "world";
		s1 = s1.concat("world"); 
		System.out.println("新的字符串="+s1);
		
		//字符串替换:将字符串中指定的字符串替换成指定的字符串
		s1 = s1.replace("SB", "\*\*");
		System.out.println("新的字符串="+s1);

        String s2 = "A,,B;C ,D";
        //利用正则表达式,将字符串中指定的字符串替换成指定的字符串;
		//通过正则表达式,把匹配的子串统一替换为","
		s2 = s2.replaceAll("[\,\;\s]+", ","); // "A,B,C,D"
		System.out.println("新的字符串s2="+s2);

		//字符串截取,从指定的下标开始和结束,范围是左闭右开
		s1 = s1.substring(0, 5);
		System.out.println("新的字符串="+s1);

		//字符串截取,从指定的下标开始一直截取到字符串的最后。
		//注意:StringIndexOutOfBoundsException
		s1 = s1.substring(3);
		System.out.println("新的字符串="+s1);

		//字符串切割,按照指定的字符串对原字符串进行切割
		String s2 = "zhangsan-lisi-wangwu";
		//利用指定的分隔符进行分割
		String[] s = s2.split("-");
		System.out.println(Arrays.toString(s));

        //去除字符串前后的空格
		String s3 = " 你好, 哈哈 ";
		s3 = s3.trim();
		System.out.println("新的字符串s3="+s3);
	}
	
}

6. 大小写转换的方法

String字符串中提供了将字符串转为小写、大写等方法,这几个方法如下:

● toUpperCase():将字符串中的字母都变成大写;

● toLowerCase():将字符串中的字母都变成小写。

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网络安全面试题

绿盟护网行动

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

需要体系化学习资料的朋友,可以加我V获取:vip204888 (备注网络安全)

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值