Day17 string类

本文详细介绍了Java中的String类,包括其不可变性、字符串常量池、equals()和length()方法的使用,以及substring()、split()等实用方法。通过示例代码展示了如何创建和操作字符串,并探讨了静态方法和字段的概念。
摘要由CSDN通过智能技术生成

学习内容

1:String类
2:字符串常量池
3:public boolean equal和public int length()方法
4:分割字符串
5:SubString方法
6:Arrays类
7:StaticFiled方法和StaticMethod方法

一:String类

String代表的是字符串常量,他们的值在创建后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享。String类继承了序列化,所以String类是可以被序列化的,另外,他的底层组成其实是个char 类型的数组,并且是final 类型的,这也进一步解释了为什么String的值一旦创建了之后是不能被修改的,String类中所有方法返回的都是一个新的String对象。
String 类代表字符串。

Java程序中所有字符串字面值(如:“ABC”)都作为此类的实现。也就是说,"ABC"都是String 类的对象。

字符串的特点:

1.字符串内容永远不可变(重点)

2.字符串可以共享使用。

3.字符串效果上是相当于一个char[],但是实际底层存储的是byte[]。

常用的三种构造方法:

1.public String() 创建一个空白的字符串,不包含任何内容。

2.public String(char[] array) 根据字符数组来创建字符串。

3.public String(byte[] array) 根据字节数组来创建字符串。

最直接的方式:String str = “class5”;

package com.hg.Demo01;
/**
 * String类代表字符串
 * 
 * 
 * 字符串的特点
 * 1:字符串的内容永不可变
 * 2:存在字符串可以共享使用
 * 3:字符串效果上是相当于一个char[],,但是实际上存储的是byte[]
 *    
 *    
 *    
 *    常用的三种方法
 *    1:public string()  创建一个空白的字符串不包含任何内容
 *    2:public string(char[] array)根据字符数组来创建字符串
 *    3:public string(byte[] array)根据字符数组来创建字符串
 *    
 *    
 *    
 * **/
public class Demo01String {

	public static void main(String[] args) {
		String str1= new String();//小括号留空,没有内容
		 System.out.println("第一个字符串"+str1);
		 System.out.println("===============");
		 char[] chararray= {'a','b','c','d'};
		 
		 String str2= new String(chararray);
		 System.out.println(chararray);
		 System.out.println(str2);
		 
		 byte[] bytearray= {65,68,66};
		 System.out.println(bytearray);
		 String str3= new String(bytearray);
		 System.out.println(str3);
		 System.out.println("===================");
		 //string str4=new....没有写
		 String str4="class5";
		 System.out.println("class5");
		 System.out.println(str4);
		 
		 
		 
		 
		 
	}
	

}

结果:
在这里插入图片描述

二: 字符串常量池

在Java的内存分配中,总共3种常量池,分别是Class常量池、运行时常量池、字符串常量池。
字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串使用的非常多。JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。每当创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性,常量池中一定不存在两个相同的字符串。

package com.hg.Demo01;
/**
 * 字符串常量值
 * int a=5
 * int b=5
 * 
 * 
 * 
 * 对于基本类型==比较的是指
 * 对于引用类型==比较的地址值
 * **/
public class Demo02StringPool {
	public static void main(String[] args) {
		
		String str1="abc";
		String str2="abc";
		
		char[] chararray= {'a','b','c','d'};
		 String str3= new String(chararray);
		 
		 System.out.println(str1==str2);//第一个和第二个的地址是一样的
		 System.out.println(str1==str3);
		 System.out.println(str2==str3);
		 
		 str2="cde";
		 System.out.println(str2);
		 
}
}

结果是:
在这里插入图片描述

三:public boolean equal和public int length()方法

1:public boolean equals(Object obj)指示一些其他对象是否等于此。 该equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值x和y ,当且仅当x和y引用相同的对象( x == y具有值true )时,该方法返回true 。 但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,他们中的equals方法用于比对相同包装类中的值是否相等。
特别注意:无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。

package com.hg.Demo02;
/**
 * 
 * public boolean equals(Object obj)
 * 说明一下
 * 
 *  **/
public class Demo02StringEquals {
	public static void main(String[] args) {
		String str1="Hello";
		String str2="Hello";
		
		char[] chararray= {'H','e','l','l','o'};
		 String str3= new String(chararray);	
		
		 System.out.println(str1.equals(str2));
		 System.out.println(str1.equals(str3));
		 System.out.println(str2.equals(str3));
		
		 System.out.println(str1.equals("Hello"));
		 System.out.println("Hello".equals(str1));
		
		 System.out.println("===================");

		 String str4= null;
		 //System.out.println("str4.equals("Hello"));
		 System.out.println("Hello".equals(str4));
		 System.out.println("==========================");

		 
}
}

结果是:
在这里插入图片描述
特别注意:Java中equals和==的区别

基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
他们之间的比较,应用双等号(==),比较的是他们的值。

复合数据类型(类)
当他们用 == 进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。

2:Java中public int length()方法可以获取一个字符串的长度,且null字符串不能使用 length()方法

package com.hg.Demo02;

public class Demo02StringGet {

	public static void main(String[] args) {
		//字符串长度
		int length="hdsfafvbsdvfdsjv".length();
		 System.out.println("字符串长度"+length);
		 
		 
		 //字符串拼接
		 String str1="Hello";
			String str2="class5";
			 String str3= str1.concat(str2);
			 System.out.println(str1);//Hello
			 System.out.println(str2);//class5
			 System.out.println(str3);//Helloclass5
			 
			 
			 //获取指定索引位置的单个字符
	         char  ch="Hello".charAt(0);
			 System.out.println("0号索引位置的字符"+ch);
			 
			 //查找某个字符串第一次出现的位置
			 String origanl="Helloworld";
			 int index=origanl.indexOf("llo");
			 System.out.println(index);
			 
			 System.out.println(origanl.indexOf("class"));
			 
	}

}

结果是:
在这里插入图片描述

四:分割字符串

Java中,按某个字符分割字符串使用的是String对象的split()方法,返回的是分割之后的String数组,值得注意的是分割符。当分割符是 . 或者是 | 时,必须使用 \ 进行转义。

package com.hg.Demo03;
/**
 * 分割字符串
 * public string[]* split(string)*/
public class Demo03StringSplit {
	public static void main(String[] args) {
		String str1="aaa,bbb,ccc";
		String [] array1= str1.split(",");
		for(int i=0;i<array1.length;i++) {
			System.out.println(array1[i]);
		}
}
}

结果是:
在这里插入图片描述

五:SubString方法

substring()方法是String类的一个方法,故该方法的调用者为String类的对象,即字符串。
str.substring(indexStart,indexEnd)功能为:截取方法调用者(即str)的从indexStart到indexEnd(包括indexStart,不包括indexEnd;即含头不含尾、或左闭右开区间内的子字符串)。

package com.hg.Demo03;

public class Demo03SubString {
	public static void main(String[] args) {
		 String str1="HelloCllas5";
			String str2=str1.substring(5);
			 System.out.println(str1);
			 System.out.println(str2);
		
			 String str3=str1.substring(2,5);
			 System.out.println(str3);
}
}

结果是:
在这里插入图片描述

六:Arrays类

java.util.Arrays 是一个与数组相关的工具类,里面提供了大量的静态方法。
如果是数值,默认按升序 从小到大
如果是字符串,sort 默认按字母升序

package com.hg.Demo03;

import java.util.Arrays;

/**
 * 
 * 是一个与数字相关的工具类,里面提供了大量的静态方法
 * 
 * 备注:
 * 如果实数值,默认按升序从小到大
 * 如果是字符串,默认按字母进行升序**/
public class Demo03Arrays {
	public static void main(String[] args) {
	int []	intArray= {10,20,30};
			
		String intString=Arrays.toString(intArray);
		System.out.println(intArray);
		
		String intStr=Arrays.toString(intArray);
		System.out.println(intStr);
		int[]array1= {1,2,3,4,5,6,7};
		System.out.println(Arrays.toString(array1));
		Arrays.sort(array1);
		System.out.println(Arrays.toString(array1));
		
		String str2="aaa,2bb,ccc";
		Arrays.sort(array1);
		System.out.println(Arrays.toString(array1));
		
		
		
	}
}

package com.hg.Demo03;

import java.util.Arrays;

public class Demo03Math {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		System.out.println(Math.abs(3.14));
		System.out.println(Math.abs(0));
		System.out.println(Math.abs(-3.14));
		System.out.println("========================");
		//向上取证
		System.out.println(Math.ceil(3.91));
		System.out.println(Math.ceil(3.5));
		System.out.println(Math.ceil(3.0001));
		System.out.println("========================");
		
		//向下取整
		System.out.println(Math.floor(3.91));
		System.out.println(Math.floor(3.5));
		System.out.println(Math.floor(3.0001));
		System.out.println("========================");
		
		//四舍五入
		System.out.println(Math.floor(3.0001));
		System.out.println(Math.floor(3.0001));
		System.out.println(Math.floor(3.0001));

	}

}

结果是:
在这里插入图片描述
在这里插入图片描述

七:StaticFiled方法和StaticMethod方法
package com.hg.Demo04;
//如果用static修饰成员方法,变成了静态方法,静态方法不属于对象
public class demo04StaticMethod {
	public static void main(String[] args) {
    MyClass  obj=new MyClass();
    obj.method();
    
    obj.methodStatic();
    MyClass.methodStatic();
    
    
}
}
package com.hg.Demo04;

public class MyClass {
    int num;
    static int numstatic;
    
    public void method() {
    	System.out.print("这就是成员方法");
    }
    public   static void methodStatic() {
    	System.out.print("这就是静态方法");
}
}

结果是:
在这里插入图片描述

package com.hg.Demo04;
/**
 * **/
public class demoStaticFiled {
	public static void main(String[] args) {
      Student one= new Student("易烊千玺",20);
      one.setRoom("3306教室");
      
      System.out.print(one.getName()+"   "+one.getAge()+"   "+one.getRoom()+"   ");
      
      Student two= new Student("颜敏",20);
      System.out.print(two.getName()+"   "+two.getAge()+"   "+two.getRoom()+"   ");
}
}
package com.hg.Demo04;

public class Student {
  
		
	
	private int id;
    private  String name;
    private  int age;
	
	private  static String room;
	public Student() {
		
	}
	public Student(String name,int age) {
		super();
		this.name=name;
		
	}
	public Student(int id, String name, int age, String room) {
		super();
		this.id=id;
		this.name=name;
		this.age= age;
		this.room=room;
		
    }
    public int getId() {
    	return id;
    }
    public void setId() {
    	this.id=id;
    }
    public String getName() {
    	return name;
    }
    public void setname() {
    	this.name=name;
    }
    public int getAge() {
    	return age;
    }
    public void setAge() {
    	this.age=age;
    }
    public String getRoom() {
    	return room;
    }
    public void setRoom() {
    	this.room=room;
    }



void setRoom(String string) {
		// TODO 自动生成的方法存根
		
	}
	}
    


结果是:
在这里插入图片描述
2020080605041

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值