Java工具类之String类

只谈情不闲聊 提交于 2020-01-30 04:10:32

String类:引用数据类型

字符串—将一堆字符串起来的串
1,在java.lang包下,不用导入
默认继承Object类,没有任何继承关系
实现了三个接口:Serializable , CharSequence , Comparable < String >
2,找寻构造方法创建对象

String s1 = “abc”;直接将字符串常量赋值给String类型 (值存储在字符串常量池中)是以对象存储的
	String s3 = new String();//通过无参数构造方法创建空的String对象,这个用处不大,一般用带参数的构造方法创建对象
	String s2 = new String("abc");//通过String(“”)构造方法创建对象
	String str = new Stringbyte[] byte); //将数组中的每一个元素转化成对应的char值,再组合成String字符串
	----	byte[] value = new byte[]{65,97,48};
       		String str = new String(value);//将三个数字对应的unicode码输出
        		System.out.println(str);

	String str = new String(char[] char);//将数组中的每一个char元素拼接成最终的String
	----	char[] chars = new char[]{'A','a',90};
        		String str1 = new String(chars);
        		System.out.println(str1);
	(构造方法重载)---String str = new String(char[] char,offset,count)//从offset位置开始的三个长度的字符组合成字符串
		char[] chars1 ={'h','e','l','l','o'};
        		String string = new String(chars1,1,3);//从1号索引开始,长度为3的字符串
        		System.out.println(string);

String是一个非常特殊的引用数据类型,可以像基本类型一样创建赋值
常见的笔试题:== equals的区别
等等号可以比较基本类型,也可以比较引用类型,比较基本类型,比较值,比较引用类型,比较地址
equals()只能比较引用类型(方法)默认比较地址, this==obj,如果想要修改其规则,可以重写equals()方法
通常重写equals()方法时会伴随着重写chasCode()方法 比如String Integer
String的不可变特性
Sting与StringBuffer区别
StringBuffer与StringBuilder的区别
String对象的存储
String中常用的方法

//String 是类,”abc“应该是对象 ,存储在字符串常量区里了

 String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abc");
    String s4 = new String("abc");
System.out.println(s1==s2);
    System.out.println(s1==s3);
    System.out.println(s3==s4);
    //String类重写了继承自Object类的equals()方法
    //将原有比较==的方法改为比较字符值
    System.out.println(s1.equals(s2));
    System.out.println(s1.equals(s3));
    System.out.println(s3.equals(s4));

4,String类的特性
不可变特性:在String类底层包含一个字符数组,private final char value[];用来存储String中的每一个字符。

不可变体现在哪里?:final表示最终的不可改变的,基本数据类型值不能改变,引用数据类型,里面的地址不能改变,
		修饰的数组则说明它的地址不能改变,数组的长度本身又是不能改变的。
		数组中的元素是可以更改的,但是这个数组是private的,只能在本类中操作,所以我们没办法对它的值进行操作
String不可变特性体现在两个方面:  
	长度--final修饰的数组,数组长度本身不变,final修饰数组的地址也不变
	内容--private修饰的属性,不能在当前类外部访问,里面的内容没办法更改。

*5,String类中常用的方法 (20+)
1,equals(Object obj)//比较两个字符串中的字面值是否相等 返回值是boolean类型的
string.equals(null);//equals默认比的是地址,重写以后更改为比字符串内容
equalsIgnoreCase();//忽略大小写比较

2,hashCode();以前的hashCode方法是native修饰的,看不到源码了。但是String的hashCode的源码不太一样,将其重写了
string.hashCode();//继承自Object方法,重写了,将当前字符串的每一个char元素拆开乘31+第一个元素的code值
//假如我们设置string的值为:”abc“
        	//int h = hash;
        	//h=0,h = h*31+a;
        	//h=(h*31+a)*31+b;
        	//h = ((h*31=a)*31)+b;
        	//这时候的出来的就是string字符串的hashcode值。
3,compareTo();参数是个String,返回值是int类型的  实现自comparable接口,实现了这个方法,按照字典(unicode编码)索引的顺序比较,	返回值是int
comparableIgnoreCase();//忽略大小写比较
		String str1 = "abc";
        String str2 = "ab";
       	boolean equals = str1.equals(str2);
       	System.out.println(str1.compareTo(str2));
    	//按照两个字符串长度较短的那个作为比较循环的次数
    	//挨个比较元素,直接用str1的某一个字去减str2的某一个字  str1[i] - str2[i]  循环内如果有结果就直接输出这个结果
    	//如果循环过后所有的字符都一样  就用长度减,len1 - len2  如果返回的是负数len1在前,len2在后, 返回时正 则相反
    	//返回0则表示两个字符串是一样的

4,toString();返回值时String类型
	//继承自Object  重写了,不再输出类名@hashCode 输出的时字符串的字面值
5,charAt(int index);//“abc” --0,a
	//返回值是char  返回给定index对一个的char类型元素
6,codePointAt(int index);“abc” --0,97
	//返回值是char  返回给定index对应的char类型元素的code码
7,length(),返回字符串的长度,底层就是返回value数组的长度
String str = "abc";//实际应用:加密,将abc变成123
String result = "";
        	char c = str.charAt(0);//获取0号索引对应的char类型的元素
       	for (int i = 0; i < str.length(); i++) {
            		char c1 = str.charAt(i);
            		System.out.print(c1);
            		int value = str.codePointAt(i);
           		System.out.println(value);
            		result += (char) (value - 48);  //密钥,U盾
        	}
        	System.out.println(result);
8,concat(String)://将给定的参数字符串拼接在原字符串之后
String str = "abc";//相当于abc对象。
    	//String对象一旦创建 长度和内容是无法更改的,
    	//那么它是怎么拼接的呢?
   	str = str.concat("de");//体现了String对象的不可变特性
    	//创建一个新的String对象(在字符串常量池里)  value属性  长度是4,会将刚才那个String对象value值依次取出来
    	//存入新对象属性里  e放在后面
    	System.out.println(str);
		String str1 = "a"+"b"+"c"+"d";
       	System.out.println(str1);
       	//笔试中经常考  String中产生了几个String对象
       	//如果看字符串常量池  是7个对象
       	/*
       	* 1,char【】 value -- a
       	* 2,char【】 value -- b
       	* 3,char【】 value -- ab
       	* 4,char【】 value -- c
       	* 5,char【】 value -- abc
       	* 6,char【】 value -- d
       	* 7,char【】 value -- abcd
       	* 
       	* */
String str = "a";
        	long time1 = System.currentTimeMillis();
        	for (int i = 1; i < 10000; i++) {
            	//str+=”a“;
            	str = str.concat("a");//利用concat拼接字符 一个String对象 自己的value属性频繁的创建新的小数组
            	//拼接的方式concat比+号的性能好很多
        	}
        	long time2 = System.currentTimeMillis();
        	System.out.println(time2 - time1);

	//StringBuffer的性能比它们两个都高	
9,contains(Char c )
10,startsWith()//判断是否以哪个元素开始  
       endsWith()//判断是否以哪个元素结尾
		/*String str = "哈哈哈.java";
   		boolean b = str.endsWith(".java");
  		 System.out.println(b);
   		boolean d = str.startsWith("d");
   		System.out.println(d);*/
11,getBytes()//将一个字符串转换成byte数组  返回值是byte【】   数组中的元素打印出来的是对应的code码
       toCharArray();//将当前的字符串转换成字符数组  返回值是char【】数组  直接将数组中的元素打印出来
       需要注意的是:如果字符串是“我爱你中国”,char数组里面的每一个元素刚好能存储一个字,
       但是byte【】 的元素占用的是8个字节,但是一个汉字占用的是10个字节,所以我们在拆的时候用的是哪个方法,	
       组合的时候一定要用对应的构造器。
		String str = "我爱你中国";
     	byte[] bytes = str.getBytes();
     	for (byte b :
             bytes) {
         		System.out.println(b);
     	}
     	char[] chars = str.toCharArray();
     	for (char c :
             chars) {
         		System.out.println(c);
    	}
12,indexOf(),lastIndexOf()
indexOf();//用来找寻给定的元素,第一次在字符串中出现的索引位置,返回值是int类型
重载--indexOf(String str,int a)从a号索引开始往后查找第一次出现str的索引号,返回的是相对于整个字符串来说的索引号	       
--indexOf(int a,int b) 从b索引开始往后找a对应的code码在整个字符串内第一次出现的索引位置。若不存在返回-1
13,lastIndexOf();
	找寻给定的元素在字符串中最后一次出现的索引位置,若不存在返回-1
14,isEmpty();//判断当前字符串是否为空,(判断的是length是否为0)
		String str = "";
        boolean value= str.isEmpty();
        System.out.println(value);
		//不能按照下面的方式写:
		String str = null;
		str.isEmpty();
		//这么用是异常的,因为本身这个引用是没有指向的,你还用它调用方法,肯定会出异常。
15,replace(),replaceAll() replaceFrist();
				String str = "大鹏很帅气帅气帅气帅气帅气";
        		//参数为char类型的可以单个字直接换,将前面的字符换成后面的字符
        		String replace = str.replace('帅', '骚');
        		System.out.println(replace);
        		//参数为String类型的,将前面的字符串,换成后面的字符串
        		String s = str.replaceAll("帅气", "美丽");
        		System.out.println(s);

        		//将原来字符串内,所有跟前面元素相同的全部换成后面的元素
        		String s1 = str.replaceAll("帅气", "美丽");
        		System.out.println(s1);

        		//将原来字符串的第一次出现的前面的元素更换成后面的元素
        		String s2 = str.replaceFirst("帅气", "meili");
        		System.out.println(s2);
		//如网络上出现骂人的现象,如果出现一个敏感字眼就可以自动转换为**。
16,split(String regex);只要出现regex的参数,说明里面可以传递正则表达式。
方法重载--split(String regex,【int limit 限度,界限】)//按照给定的表达式,将原来的字符串拆分开
比如“a-b-c-d”,按照-拆分,返回的时一个String类型的数组。
String str = "a-b-c-d";
       	//将原字符串按照某个规则拆分
       	String[] split = str.split("-");
        	for (String str1 :
                	split) {
            	System.out.println(str1);
        	}
        	//将原字符串按照“-”拆分成3段
        	String[] split1 = str.split("-", 3);
        	for (String split0 :
                	split1) {
            	System.out.println(split0);
        	}
比如想做一个登录
 String[] userBox = {"java-123","大鹏-345","小明-789"};
        	Scanner input = new Scanner(System.in);
        	System.out.println("请输入账号:");
        	String name = input.nextLine();
        	System.out.println("请输入密码:");
        	String password = input.nextLine();
        	boolean flag = false;
        	for (int i = 0; i < userBox.length; i++) {
            	String[] split = userBox[i].split("-");
            	if (split[0].equals(name)){
                	if (split[1].equals(password)){
                    	System.out.println("登录成功");
                    	flag = true;
                	}
                	break;
            	}
        	}
        	if(!flag){
            	System.out.println("账号或密码错误");
        	}
17,Stirng = substring(int beginIndex,【int endIndex】);
截取当前字符串一部分从开始索引到结束索引 包头不包尾。
从beginIndex索引开始至endIndex结束截取
如果不写结束索引,则直接截取到字符串的最后索引位置
/*String str = "abcdefg";
        	str = str.substring(3,5);//从3号索引开始截取至5号索引结束,不包含5号索引的值【3,5)左闭右开。
        	System.out.println(str);*/
18,toLowerCase() toUpperCase()//将全部字符串转换大小写。全都转,返回值时String类型
            String str = "abcdefg";
        	String s = str.toUpperCase();
        	System.out.println(s);
        	String s1 = str.toLowerCase();
        	System.out.println(s1);
19,trim();去掉字符串前后多余的空格 返回值时String类型的,只能去前面和后面的,中间的去不掉。比较密码的时候去掉前后空格再去比较
20,valueOf();将其它的基本类型元素转换成字符串。
21,boolean = matches(String regex)
regular有规律的  expression表达式
正则表达式
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!