一、String类
1.1 String类概述
概述
java.lang.String
类代表字符串。Java程序中所有的字符串文字(例如 "abc"
)都可以被看作是实现此类的实例。
类 String
中包括用于检查各个字符串的方法,比如用于比较字符串,搜索字符串,提取子字符串以及创建具有翻 译为大写或小写的所有字符的字符串的副本
特点
1.字符串内容永不可变
因为String对象是不可变的,所以它们可以被共享
"abc"
等效于char[] data={ 'a' , 'b' , 'c' }
1.2 构造和创建字符串
创建字符串的常见3+1种方法。
三种构造方法:
public String():
创建一个空白字符串,不含有任何内容。
public String(char[] array):
通过当前参数中的字符数组来构造新 的String
public String(byte[] array):
通过使用平台的默认字符集解码当前 参数中的字节数组来构造新的 String
举例:
//无参构造
String str = new String();
// 通过字符数组构造
char chars[] = {'a', 'b', 'c'};
String str2 = new String(chars);
// 通过字节数组构造
byte bytes[] = { 97, 98, 99 }; String str3 = new String(bytes)//a b c
一种直接创建 -> 注意:直接写上双引号,就是字符串对象(系统自动new)
String str="Hello";
内存中的字符串常量
//字符串常量池:程序中直接写上双引号的字符串,就在字符串常量池中。
//对于基本类型来说,==是对数值的比较
//对于引用类型来说,==是对内存地址的比较。->所以str1 == str2的结果是false
String str1="abc";
String str2="abc";
char[] charArray={'a','b','c'};
String str3 = new String(charArray);
System.out.println(str1 == str2);//->true
System.out.println(str1 == str3); //->false
- 双引号直接写的字符串数组在常量池当中,new的在堆中
- 字符串常量内容一样时共用一个内存地址
- 使用new方法后,字符串数组转换为一个byte数组
1.3常用方法
判断功能的方法
public boolean equals (Object anObject)
:将此字符串与指定对象进行比较。public boolean equalsIgnoreCase (String anotherString)
:将此字符串与指定对象进行比较,忽略大小 写 ```java /* == 是进行对象地址值的比较,如果比较的是字符串内容则使用:
public boolean equals(Object obj):参数可以是任何对象,只有参数是一个字符串 并且内容相同才会得到true; public boolean equalsIgnoreCase(Object obj):忽略大小写的比较
注意事项: 1.任何对象都能用Object进行接收。 2.equals方法具有对称性,也就是a.equals(b)和b.equals(a)是一样的 3.如果比较双方一个是常量一个是变量,推荐吧常量字符串写在前面: 推荐:”abc”.equals(str); 不推荐:str.equals(“abc”); 如果str是null值,则不推荐的方法会报错 */ public class Demo01string { 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));//true
System.out.println(str2.equals(str3));//true
System.out.println("hello".equals(str1));//false
//equalsIgnoreCase方法->忽略大小写
System.out.println(“hello”.equalsIgnoreCase(str1));//true } }
> Object 是” 对象”的意思,也是一种引用类型。作为参数类型,表示任意对象都可以传递到方法中。
<a name="20a9e97c"></a>
#### 获取功能的方法
String当中与获取相关的常用方法:
`public int length()`:获取字符串当中含有字符个数,字符串长度<br />`public String concat(String str)`:将当前字符串和参数字符串拼接<br />`public char charAt(int index)`:索引指定位置单个字符<br />`public int indexOf(String str)`:查找参数字符串在本字符串首次出现的位置,如果没有返回-1
```java
public class Demo02StringGet {
public static void main(String[] args) {
//获取字符串长度
int length="adjakdjakkajgkajfkajd".length();
System.out.println("字符串长度是:"+length);//21
//拼接字符串
String str1="Hello";
String str2="World";
String str3=str1.concat(str2);
System.out.println(str1);//Hello,原封不动
System.out.println(str2);//World,原封不动
System.out.println(str3);//HelloWorld,新的字符串
//获取指定索引的单个字符
char ch="Hello".charAt(1);
System.out.println("一号位置的索引字符是:"+ch); //e
//查找参数字符串在本字符串首次出现的位置
String original="HelloWorld";
int index=original.indexOf("llo");
System.out.println("llo在Helloworld中的位置:"+index); //2
System.out.println(original.indexOf("abc"));//-1
//截取字符串
String str4="HelloWorld";
String str5=str4.substring(5);
System.out.println(str5);//World
System.out.println(str4.substring(1,6));//elloW ->不包含6号位置'o'
}
}
注意:
String strA="Hello";
System.out.println(strA);//Hello
strA="Java";
System.out.println(strA);//Java
//下面这种写法字符串内容没有改变
//strA中保存的是地址值
//本来是“Hello”的地址值换成了“Java”的地址值
转换功能的方法
public char[] toCharArray()
:将当前字符串拆分为字符串数组作为返回值public byte[] getBytes()
:获得当前字符串底层的字节数组public String replace(CharSequence oldString,CharSequence newString)
:
将所有出现的老字符串替换为新的字符串,返回替换之后的结果新字符串
备注:CharSequence
意思就是可以接受字符串类型
public class Demo03StringConvert {
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]);
//97 98 99
}
String str1="How do you do?";
String str2=str1.replace("o","*");
System.out.println(str1);//How do you do?
System.out.println(str2);//H*w d* y*u d*?
}
}
分割功能的方法
public String[] split(String regex):
按照参数的规则,将字符串切分成为若干部分
public class Demo04StringSplit {
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]);
// aaa bbb ccc
}
}
}
//注意,这里的分割标准 regex是正则表达式,要避免正则表达式中的特殊字符
//例如 "." -> "\\."
//也可用正则表达式分割更多不一样的字符
public String substring(int beginIndex, int endIndex)
裁剪字符串
二、Static关键字
2.1 概述
关于 static
关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属 于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了
2.2 定义和使用格式
类变量
当static
修饰成员变量时,该变量成为类变量,该类的每一个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,单也可以在不创建该类的对象的情况下对类变量进行操作。
定义格式
static 数据类型 变量名;
static int numberID;
例子:创建一个班级类,创建一个类变量numberOfStudent
来记录学生个数,并且根据类变量来创建学生学号 sid
public class Student{
private String name;
private int age;
//学生的id
private int sid;
//类变量,记录学生数量,分配学号
public static int numberOfStudent =0;
public Student(String name,int age){
this.name=name;
this.age=age;
//通过numberOfStudent 给学生分配学号
this.sid= ++numberOfStudent;
}
//打印属性值
public void show(){
System.out.println("Student: name="+name+",age="+age+",sid="+sid);
}
}
public class StuDemo{
public static void main(String[] args){
Student s1=new Student("张三",23);
Student s2 = new Student("李四", 24); Student s3 = new Student("王五", 25); Student s4 = new Student("赵六", 26); s1.show(); // Student : name=张三, age=23, sid=1 s2.show(); // Student : name=李四, age=24, sid=2 s3.show(); // Student : name=王五, age=25, sid=3 s4.show(); // Student : name=赵六, age=26, sid=4
}
}
静态方法
当static修饰成员方法时,该方法成为类方法。静态方法在声明中有static,建议使用类名来调用,而不需要创建类的对象
定义格式:
修饰符 static 返回值类型 方法名(参数列表){
//执行语句
}
public static void showNum(){
System.out.println("num:"+ numberOfStudent);
}
注意事项
- 静态方法可以直接访问类变量和静态方法
- 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法
- 静态方法中,不能使用
this
关键字
小贴士:静态方法只能访问静态成员。 静态方法不能访问非静态成员->因为在内存当中【先】有的静态内容,【后】有的非静态内容
调用格式
被static修饰的成员可以并且建议通过类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属 于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息
//访问类变量
类名.类变量名;
//调用静态方法
类名.静态方法名(参数);
public class StuDemo2{
public static void main(String[] args){
//访问类变量
System.out.println(Student.numberOfStudent);
//调用静态方法
Student.showNum();
//不new对象通过类名调用(强烈推荐)
}
}
2.3 静态原理图解
方法区中有一个独立的空间静态区,静态方法储存在这里。
注意:类名称访问静态成员的时候,全场和new的对象没关系,只和类有关系
2.4 静态代码块
静态代码块:定义在成员位置,使用static
修饰的代码块{ }。
特点:
- 位置:类中方法外。
- 执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行
格式:
public class ClassName(){
static{
//执行语句;
}
}
public class Game {
public static int number; public static ArrayList<String> list;
static {
// 给类变量赋值
number = 2;
list = new ArrayList<String>();
// 添加元素到集合中
list.add("张三");
list.add("李四");
}
}
用途:用来一次性地对静态成员变量进行赋值。
三、Arrays类
3.1 概述
java.util.Arrays
是一个与数组相关的工具类,里面提供了大量静态方法,用来实现数组常见的操作
比如排序和搜索等。其所有方法均为静态方法,调用起来非常简单
3.2 操作数组的方法
public static String toString(int[] a)
:返回指定数组内容的字符串表示形式public static void main(String[] args){ //定义int 数组 int[] arr = {1,23,45,56,755,56}; //打印数组,输出地址值 System.out.println(arr);//0x666 //数组内容转为字符串 String s= Arrays.toString(arr); //打印字符串,输出内容 System.out.println(s);//[1,23,45,56,755,56] }
public static void sort(int[] a)
:对指定的 int 型数组按数字升序进行排序
public static void main(String[] args) {
// 定义int 数组
int[] arr = {24, 7, 5, 48, 4, 46, 35, 11, 6, 2}; System.out.println("排序前:"+ Arrays.toString(arr));
// 排序前:[24, 7, 5, 48, 4, 46, 35, 11, 6, 2]
// 升序排序
Arrays.sort(arr);
System.out.println("排序后:"+ Arrays.toString(arr));
// 排序后:[2, 4, 5, 6, 7, 11, 24, 35, 46, 48]
}
PS:如果是数组。sort默认从小到大升序 如果是字符串,sort默认字母升序 如果是自定义的类型,那么这个自定义的类需要有Comparable或者Comparator接口的支持
练习题:
请使用 Arrays
相关的API,将一个随机字符串中的所有字符升序排列,并倒序打印
import java.util.Arrays;
//生成随机字符串,升序排序后,倒叙打印
public class Demo01sort {
public static void main(String[] args) {
//定义一个随机字符串
String line="aglkalafaadwefga";
//转换为字符串数组
char[] arr=line.toCharArray();
//升序排序(静态方法直接调用)
Arrays.sort(arr);
System.out.println("升序排序结果:");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
//倒叙打印
System.out.println();
System.out.println("倒叙打印:");
for (int i = arr.length-1; i>=0 ; i--) {
System.out.print(arr[i]+" ");
}
}
}
四、Math类
4.1 概述
java.util.Math
类是数学相关的工具类,里面提供了大量静态方法,完成与数学运算相关的操作
4.2 基本的运算方法
public static double abs(double num)
:获取绝对值double d1 = Math.abs(‐5); //d1的值为5 double d2 = Math.abs(5); //d2的值为5
public static double ceil(double num)
:向上取整System.out.println(Math.ceil(3.9));//4.0 System.out.println(Math.ceil(3.1));//4.0 System.out.println(Math.ceil(3.0));//3.0 System.out.println(Math.ceil(-3.3));//-3.0
public static double floor(double num)
:向下取整System.out.println(Math.floor(3.9));//3.0 System.out.println(Math.floor(-3.3));//-4.0 System.out.println(Math.floor(5.1));//5.0
public static double round(double num)
:四舍五入
long d2 = Math.round(5.4); //d2的值为5.0
long d2 = Math.round(5.5); //d2的值为6.0
4.3 练习题
请使用 Math 相关的API,计算在 -10.8 到 5.9 之间,绝对值大于 6 或者小于 2.1 的整数有多少个
//利用Math相关的API,计算-10.8到5.9之间,
// 绝对值大于6或者小于2.1的整数有多少个
public class Mathtest {
public static void main(String[] args) {
//定义最小值
double min=-10.8;
//定义最大值
double max=5.9;
//定义变量次数
int count=0;
//范围内循环
for(double i=Math.ceil(min);i<=max;i++)
{
//获取绝对值并判断
if(Math.abs(i)>6 || Math.abs(i)<2.1)
{
//计数
count++;
}
}
System.out.println("个数为:"+count+"个");
}
}