字符串的特点
- 字符串的内容永不可变
- 正是因为字符串不可改变,所以字符串是可以共享使用的
- 字符串效果上相当于是char[]字符数组,但是底层原理是byte[]字节数组
创建字符串的常见3+1种方式
三种构造方法:
public String():创建一个空白字符串,不含有任何内容
public String(char[] array):根据字符数组的内容,来创建对应的字符串
public String(byte[] array):根据字节数组的内容,来创建对应的字符串
一种直接创建
String str = “Hello”;//右边直接用双引号
public class Demo{
public static void main(String[] args){
//使用空参构造
String str1 = new String();
System.out.println(“第1个字符串:” + str1);
//根据字符数组创建字符串
char[] charArray = {‘A’,’B’,’C’};
String str2 = new String(charArray);
System.out.println(“第2个字符串:”+str2);
//根据字节数组创建字符串
byte[] byteArray = {97,98,99};
String str3 = new String(byteArray);
//直接创建
String str4 = “Hello”;
System.out.println(“第4个字符串:” + str4);
}
}
字符串的比较相关方法
public static void main(String[] args){
String str1 = “Hello”;
String str2 = “Hello”;
char[] charArray = {‘H’,’e’,’l’,’l’,’e’};
String str3 = new String(charArray);
System.out.println(str1.equals(str2));
System.out.println(str2.equals(str3));
System.out.println(str3.equals(“Hello”));
System.out.println(“str2”.equals(str1));
String str4 = “hello”;
System.out.println(str1.equals(str4));//false
String str5 = null;
System.out.println(“abc”.equals(str5));//推荐,false
System.out.println(str5.equals(“abc”));
//不推荐,报错,空指针异常NullPointerException
String strA = “Java”;
String strB = “java”;
System.out.println(strA.equals(strB));//false,严格区分大小写
System.out.println(strA.equalsIgnoreCase(strB));//true,忽略大小写
}
==是进行对象的地址值比较,如果确实需要字符串内容的比较,可以使用两个方法
public boolean equals(Object obj):
参数可以是任何对象,只有参数是一个字符串并且内容相同的才会给true
否则返回false
注意事项:
- 任何对象都能用Object进行接收
- equals方法具有对称性,a.equals(b)和b.equals(a)效果一样
- 如果比较双方一个变量一个常量,推荐把常量字符串写在前面
推荐:“abc”.equals(str) 不推荐: str.equals(“abc”)
public boolean equalsIgnoreCase(String str):忽略大小写,进行内容比较
字符串的获取相关方法
public int length(); 获取字符串当中含有的字符串个数,拿到字符串的长度
public String concat(String str):
将当前字符串和参数字符串拼接成为返回值新的字符串
public char charAt(int index):
获取指定索引位置的单个字符。(从索引0开始)
public int indexOf(String str):
查找参数字符串在本字符串当中首次出现的索引位置,如没有,返回值为-1
public class Demo{
//获取字符串长度
int length = “adjghaurhuashf”.length();
System.out.println(“字符串的长度是:”+length);
//拼接字符串
String str1 = “Hello”;
String str2 = “World”;
String str3 = str1.concat(str2);
System.out.println(str3);//HelloWorld,新的字符串
//获取指定索引位置的单个字符
char ch = “Hello”.charAt(1);
System.out.println(“在1号索引位置的字符是” + ch);
//查找参数字符串在本来字符串当中出现的第一次索引位置
String original = “HelloWorld”;
int index = original.indexOf(“ll0”);
System.out.println(“第一次索引值是:” + index);//2
System.out.println(“HelloWorld”.indexOf(“abc”));//-1
}
字符串的截取方法
public String substring(int index);
截取从参数位置一直到字符串末尾,返回新字符串
public String substring(int begin,int end);
截取从begin开始,一直到end结束中间的字符串
备注:[begin,end),包含左边,不包含右边
public class Demo{
public static void main(String[] args){
String str1 = “HelloWorld”;
Strint str2 = str1.substring(5);
String str3 = str1.substring(4,7);
System.out.println(str2);//world
System.out.println(str3);//oWo
}
}
字符串的转换相关方法
String当中与转换相关的常用方法:
public char[] toCharArray();
将当前字符串拆分成为字符数组作为返回值
public byte[] getBytes();
获得当前字符串底层的字节数组
public String replace(CharSequence oldString,CharSequence newString);
将所有出现的老字符串替换成为新的字符串,返回替换之后的结果新字符串。
public static void main(String[] args){
//转换成为字符数组
char[] chars = “Hello”.toCharArray();
System.out.println(chars[0]);//H
System.out.println(chars.length);//5
//转换为字节数组
byte[] bytes = “abc”.getBytes();
for(int i = 0; i < bytes.length; i++){
System.out.println(bytes[i]);
}
String str1 = “How do you do?”;
String str2 = str1.replace(target:”o”,replacement:”*”);
System.out.println(str1);//How do you do?
System.out.println(str2);//H*w d* y*u d*?
字符串的分割方法
public String[] split(String regex)
按照参数规则,将字符串切分成为若干部分
注意事项:
split方法的参数其实是一个“正则表达式”
如果按照英文句点“.”进行切分,必须写“\.”
public class Demo{
public static void main(String[] args){
String str1 = “aaa,bbb,ccc”;
String[] array1 = str1.split(reqex:”,”);
for(int i = 0;i < array1.length;i++){
System.out.println(array1[i]);
}
}
}
public class Student{
private String name;
private int age;
static String room;
public Student(){
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
}
如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。
public class Student{
private int id;
private String name;
private int age;
static String room;
private static int idCounter = 0;//学号计数器,每当new了一个新对象的时候,计数器++
public Student(){
idCounter++;
}
public Student(String name,int age){
this.name = name;
this.age = age;
this.id = ++idCounter;
}
}
一旦使用static修饰成员方法,那么这就成为了静态方法。静态方法不属于对象,而是属于类。
如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它
无论是成员变量,还是成员方法,那么必须首先创建对象,然后通过对象才能使用它
静态变量:类名称.静态变量
静态方法:类名称.静态方法()
注意事项:
- 静态不能直接访问非静态
原因:因为内存当中是先有静态内容,后有非静态内容 - 静态方法当中不能用this
原因:this代表当前对象,通过谁调用的方法,谁就是当前对象
public class Demo{
public static void main(String[] args){
MyClass obj = new MyClass();
//首先创建对象,然后才能使用没有static关键字的内容
obj.method();
//对于静态方法来说,可以通过对象名进行调用,也可以直接通过类名称来调用
obj.methodStatic();
//正确,不推荐,这种写法在编译之后会被javac翻译成为“类名称.静态方法”
MyClass.methodStatic();//正确推荐
}
}
public class MyClass{
int num;//成员变量
static int numStatic;//静态变量
//成员方法
public void method(){
System.out.println(“这是一个成员方法”);
//成员方法可以访问成员变量
System.out.println(num)
//成员方法可以访问静态变量
System.out.println(numStatic);
}
//静态方法
public static void methodStatic(){
System.out,println(“这是一个静态方法”);
//静态方法可以访问静态变量
System.out.println(numStatic);
//静态不能直接访问非静态
System,out,println(num);//错误写法
//静态方法中不能用this关键字
System.out.println(this);//错误写法
}
}
静态代码块
静态代码块的格式:
public class 类名称{
static class 类名称{
//静态代码块的内容
}
}
特点:当第一次用到本类时,静态代码块执行唯一的一次
静态内容总是优先于非静态,所以静态代码块比构造方法先执行
静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值
public class Demo{
public static void main(String[] args){
Person one = new Person();
Person two = new Person();
}
}
java.util.Arrays是一个与数组相关的工具类,里面提供了大量的静态方法,用来实现数组的常见操作
public static String toString(数组):将参数数组变成字符串(按照默认格式:[元素1,元素2,元素3 …])
public static void sort(数组):按照默认升序(从小到大)对数组的元素进行排序
备注:
- 如果是数值,sort默认按照升序从小到大
- 如果是字符串,sort默认按照字母升序
- 如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持。
public class Demo{
public static void main(String[] args){
int[] intArray = {10,20,30};
//将int[]数组按照默认格式变成字符串
String intStr = Array.toString(intArray);
System.out.println(intStr);
int[] array1 = {2,1,3,10,6};
Array.sort(array1);
System.out.println(Array.toString(array1));//[1,2,3,6,10]
String[] array2 = {“bbb”,”aaa”,”ccc”};
Array.sort(array2);
System.out.println(Array.toString(array2));//[aaa,bbb,ccc]
}
}
数学工具类
java.util.Math类是数学相关的工具类,里面提供了大量的静态方法,完成与数学运算相关的操作
public static double abs(double num);//获取绝对值,有多种重载
public static double ceil(double num);//向上取整
public static double floor(double num);//向下取整
public static long round(double num);//四舍五入