学习内容
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