方法
方法重载
- 同一个类中定义的多个方法之间的关系
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
- 方法重载与返回值无关
public class MethodDemo {
public static int sum(int a, int b) {
return a + b;
}
public static int sum(int a, int b, int c) {
return a + b + c;
}
public static long sum(long a, long b) {
return a + b;
}
}
方法的参数传递
- 对于基本数据类型的参数,形式参数的改变不影响实际参数的值(值传递)
- 对于引用类型的参数,形式参数的改变,影响实际参数的值(引用传递)
值传递和引用传递
- 栈内存:负责存储变量和数值
- 堆内存:负责存储对象
- 值传递:传递的是变量对应的值
- 引用传递:传递的是变量对应的地址
字符串
字符串的定义方式
- 在java中,双引号""表示字符串
- 字面量定义
- 字面量(基本数据类型+字符串)
String s = "hello";
- 通过new关键字来创建一个对象
String s = new String("hello");
- 创建一个长度为0的空字符串
String s = new String();
- 先创建一个字符数组,然后将字符数组转为字符串
char[] c = {'h','e','l','l','o'};
String s = new String(c);
字符串中汉字占用的字节
- UTF-8 3个字节
- GBK 2个字节
UTF规定:如果一个符号只占一个字节,那么这个8位字节的第一位就为0。如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10,然后如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。
- 一个汉字占用多少字节相关解释
链接:https://www.zhihu.com/question/20451870/answer/391349703
字符串的创建特点
- 字符串一经创建,长度不可改变
- 当在一个字符串上拼接一个字符串时,则长度改变,即产生一个新的字符串
- new出来的字符串即产生一个新的地址值
String对象是不可变的,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,包含修改的字符串内容,最初的String对象没有变化。
String s = "hello";
String s1 = new String("hello");
String s2 = "hell" + "o";
String s3 = "o";
String s4 = "hell" + s3;
System.out.println(s == s1);//false
System.out.println(s == s2);//true
System.out.println(s2 == s4);//false
格式化字符串
- System.out.printf(format,…obj)
- String.format(format,…obj)
format()和printf()等价,只需要一个简单的格式化字符串,加上一串参数即可,每个参数对应一个格式修饰符。
%d : 整数 %s : 字符串 %f : 小数 %.3f : 保留三位小数 %x : 16进制数字
%% :对 % 进行转义
public class StringDemo3 {
public static void main(String[] args) {
//字符串的格式化
int a = 3;
int b = 4;
//在控制台输出3+4=7
// System.out.printf("%d + %d = %d",a,b,a+b);
String s = String.format("%d + %d = %d", a, b, a + b);
System.out.println(s);
}
}
字符串的拼接
+
- StringBuilder
String s2 = "hell" + "o";
StringBuilder sb = new StringBuilder();
StringBuilder append = sb.append("hel").append("lo");
System.out.println(append);
转字符串
- String.valueOf(x)
- String.valueOf(char[] , offset , count )
int i = 10;
String s1 = String.valueOf(i);
System.out.println(s1);//10
char[] c = {'h','e','l','l','o'};
String s2 = String.valueOf(c, 2, 3);
System.out.println(s2);//llo
字符串的遍历
- charAt(index) 获取指定索引位置的字符
Scanner sc = new Scanner(System.in);
System.out.println("请输入身份证号码:");
String id = sc.nextLine();
//循环遍历字符串
for (int i = 0; i < id.length(); i++) {
char c = id.charAt(i);
System.out.println(c);
}
其他方法
- equals() 比较两个字符串的内容是否相等
- isEmpty() 字符串长度是否为0
- isBlank() 字符串是否为空(包含空白字符)-- JDK11新特性
- equalsIgnoreCase 忽略大小写比较两个字符串的内容是否相等
- codePointAt() 获取对应字符的Ascll码值
- indexOf 获取指定元素第一次出现的索引位置
- lastIndexOf 获取指定元素最后一次出现的索引位置
- contains() 判断字符串中是否包含指定字符
- startWith() 判断字符串以…开头
- endWith() 判断字符串以…结尾
- comparedTo() 比较两个字符串的大小(比较首位字符的Ascll码值的大小)
- toLowerCase() 将字符串中的英文转为小写
- toUpperCase() 将字符串中的英文转为大写
- substring(int beginIndex, int endIndex) 截取字符串 字符串长度为endIndex-startindex
如果一个对象指向null,那么该对象不能调用方法,否则会产生空指针异常(NullPointerException)
//定义一个长度为0的空字符串
String s = "";
s = null;
if (s.isEmpty()){
System.out.println("字符串为空");
}
String s1 = "中国";
System.out.println("中国".equals(s1));
//不推荐,因为s1可能为空
System.out.println(s1.equals("中国"));
String s3 = "hello";
String s4 = "Hello";
//忽略大小写,比较两个字符串的内容是否相等,只适用于英文
System.out.println(s3.equalsIgnoreCase(s4));//true