String类:【重点】
String类的概述
概述:
java.lang.String类代表字符串,java程序中所有的字符串文字,如“abc”都可以看作是String类的实例.
程序当中的所有双引号字符串,都是String类的对象.(没有new,也是对象).
字符串的特点:
字符串的内容永远不可改变【重点】
正是因为字符串的内容永远不可改变,所以字符串是可以共享使用的.
字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组.
//第二点
String str1 = "abc";
String str2 = "abc";
内存当中“abc”,"abc"对象会被创建出来,而且“abc”对象只会被创建一次,内存当中只有一个“abc”对象被创建
此时str1和str2可以共享同一个“abc”对象
String str3 = new String("abc");
String str4 = new String("abc");
备注:JDK1.7之后的JVM 将【运行】时常量池从方法区区移除了,在 java堆(heap)中开辟空间用来存储运行时常量池
JDK1.8开始,取消了Java方法区(method area),取而代之的是一种元空间(metaspace)
JDK1.8中字符串常量池和运行时常量池逻辑上属于方法区,实际上存储在堆内存中.
创建String字符串的常见3+1种方式
三种构造方法
public String();创建一个空白的字符串,不包含任何内容.
public Stirng(Char[] array);根据字符数组的内容,来创建对应的字符串.
public Stirng(byte[] array);根据字节数组内容,来创建对应的字符串.
一种直接创建
String str = "abc";//右边直接用双引号
备注:直接写上双引号,系统也会认定为字符串对象.
【1.对于引用数据类型来说 == 进行的是地址值】
【2.对于基本数据类型来说,比较是数值内容】
【3.双引号直接写在字符串在常量池当中,new的不在池当中】
常用方法:【重点】
判断功能方法
public boolean equals(Object anObject);将此字符串与指定对象进行比较,(参数可以是任意值)
当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
不但判断地址值,还进行内容判断,只要符合其中一个就返回true;
建议:如果比较双方是一个常量一个变量,推荐把常量字符串放在前面,把变量放在后面
如:"Hello".equals(str1)不建议写成:"str1".equals(Hello):防止空指针异常
public boolean equalsIgnoreCase(String anObject);将此字符串与指定的对象进行比较,不考虑大小写
获取功能
public int length();返回字符串的长度
public String concat(String str);将指定的字符串连接到该字符串的末尾
public char charAt(int index);返回指定索引处的char值 索引起始值为0
public int indexOf(String str);返回指定的子字符串第一次出现在该字符串内的索引值"连续的"(返回-1就是没有)
public String substring(int beginIndex);返回一个子字符串,从beginIndex开始截取该字符串的末尾
新的字符串 World是新的字符串对象
public String substring(int beginIndex,int endIndex);返回一个子字符串,从beginIndex区间截取该字符串
包含beginIndex索引值,不包含endIndex索引值---》[beginIndex,int endIndex)
转换功能:
public char[] toCharArray();将此字符串转换成新的字符数组
public byte[] getBytes();适用平台默认的字符集将该字符串编码转换成新的字节数组.
public String replace(CharSequence oldString,CharSequence newString);
将所有出现的老的字符串替换成新的字符串,返回是替换之后新的字符串
CharSequence意思就是可以接收字符串类型
备注:CharSequence是一个接口,也是一种引用数据类型,意思是可以接收字符串参数数据类型
static关键字
概述
static关键字的使用,可以修饰成员变量和成员方法,被修饰的成员是【属于类】的,不单单是属于某个对象的
也就是,既然是属于类的,那就不需要通过创建对象来调用类中的成员信息
定义和使用格式
类变量
当成员变量被static修饰,该变量就成为【类变量】.该类的每个对象都可以【共享】同一个类变量的值.
任何对象都可以更改类变量的值.类变量也可以不通过创建类对象的方式进行操作.通过类也可以进行操作.
//类变量不再属于对象自己,而是属于所在类,多个对象共享同一份数据
定义格式:
static 数据类型 变量名;
如:
static int roomID;
静态方法
当成员方法一旦被static关键字修饰时,该方法称为【类方法】,
类方法一般是通过类名.直接调用,而不需要单独创建对象来调用,调用方式很简单.习惯性称为【静态方法】
定义格式
修饰符 static 返回值类型 方法名(参数列表){
//方法体内容
}
如:
public static String arrayToString(int[] arr){
//方法体内容就是如何转换
//...
//必须有返回语句 return 返回值;
}
静态方法调用的注意事项
1.静态方法可以直接访问类变量和静态方法
2.静态方法【不能直接访问普通的成员变量和成员方法】,反之成员方法可以【直接访问】类变量和静态方法
3.静态方法中不能使用this关键字
调用格式
静态方法建议通过类来调用,但也可以通过对象来调用,会出现警告信息,不建议使用对象来调用
格式:
//访问类变量
类名.类变量名;
//访问静态方法
类名.静态方法名(参数);
备注:这些不能直接访问成员信息,可以间接的通过实例化对象来调用
静态原理图解
static修饰的内容:
1.是随着类的加载而加载,而且只会被加载一次
2.存储于一块固定的内存区域(静态域/区),所以可以被直接调用.
3.他优先于对象存在,所以可以被类的所有对象所共享
静态代码块
静态代码块:定义在成员的位置,被static修饰的代码块{}
1.位置:类中方法外
2.执行:随着类的加载而加载而且只会执行一次,优先于main方法和构造方法执行
格式:
public class ClassName{
static{
//执行语句 多条执行语句
//...
}
}
public static void main(String[] args){
/*static{
错误写法
}*/
}
-------------------------------------------
如:
//斗地主 需要三个成员
public class Game{
public static int number;//玩家数量
static ArrayList<String> members;//玩家们
static{
number = 3;
menbers = new ArrayList<>();
//添加玩家
list.add("小明");
list.add("小刘");
list.add("小花");
}
}
public class TestGame{
public static void main(String[] args){
/*ArrayList<String> list = new ArrayList<>();
list.add("小明");
list.add("小刘");
list.add("小花");*/
}
}
备注:static可以修饰成员变量,成员方法,代码块,在使用过程中,如果你不想在不创建对象的情况下去调用成员变量,
成员方法,可以定义为静态的.对于静态代码块来说,通常作用是对类中的成员变量进行初始化 ,
直接定义后初始化局限性很大 静态代码块更灵活还能写多条语句