DUFQ_2020-12-1-杜飞强(String对象)
方法
变量的作用域和生命周期
作用域
作用域指定义一个变量后,在程序的什么地方能够使用,即变量的使用范围
变量的作用域是指包含该变量的,离该变量最近的大括号
方法中定义的变量,称为局部变量,方法的形式参数也是方法的局部变量。只能在当前的方法中使用,包括当前方法中的判断语句块,循环语句块,在判断语句块中声明的变量只能在当前判断语句块中使用,当前判断语句块之外的不能正常使用。
特殊情况:(1)for循环的循环变量只能在for循环体内部使用
(2)方法的形参只能在方法内部使用
eg:
超出作用域后的提示的异常是
异常解析:(1)第11行没有超出作用域
(2)第13行超出了作用域
生命周期
变量的生命周期是指变量从分配内存到回收内存的过程。
ps:变量的使用原则,尽量晚的分配内存,尽量早的回收内存。
作用域和生命周期示例程序
字符串
字符与字符串
字符是单引号引住的单个符号,eg:char ch ='A';字符在java中使用char类表示。字符串是字符的序列,在java中使用String类表示字符串。String类被定义在java.lang包中。java.lang包由系统自动导入,因此该包中的类无需导入。
字符和字符串的区别
区别1
字符类型: char 使用单引号
字符串类型:String 使用双引号
区别2
char是基本类型(原生类型)
String是引用类型
区别3
char类型的变量中必须存储一个字符
String类型的变量中可以存放任意个数的字符
字符串的适应场景
用户名;密码;地址;电话号码;文章的标题;文章的内容等
ASCII码
ASCII码(American Standard Code for Information Interchange): 美国信息交换标准代码。可以交换的字符一共有128个,其中包括:
0~31、127(共33个)表示不可见字符
65~90表示26个大写英文字母'A' - 'Z'
97~122表示26个小写英文字母'a' - 'z'
48~57表示10个数字字符'0'- '9'
ASCII码是字符型和整型之间的交换。例如字符'A'与整数65可以相互交换。
示例:生成随机密码
public static void main(String[] args) {
//找回密码:用户找回密码,系统随机生成9位由大写字母,小写字母,数字组合的随机密码,显示给用户。
java.lang.String password ="";
for (int i = 0; i < 3 ; i++) {
//随机生成大写字母
int big = new Random().nextInt(26);
big += 65;
char pass1 = (char)big;
//随机生成小写字母
int small = new Random().nextInt(26);
small += 97;
char pass2 = (char)small;
//随机生成数字
int digit = new Random().nextInt(10);
digit +=48;
char pass3 = (char)digit;
//拼接密码
password = password+pass1+pass2+pass3;
}
System.out.println("生成的随机密码是:"+password);
}
字符串的两种使用方式
第一种:字面量,用双引号直接赋值;
第二种:字符串对象,new的就是字符串对象。
字符串对象
字符串对象就是使用new运算符创建的字符串。例如:
如果要判断两个字符串内容是否相等,应该使用equals方法。
如果要判断两个字符串对象是否指向到同一个内存单元,应该使用==。
问题:
字符串在开发中频繁的使用,如果每次使用相同的字符串时都在堆中分配内存,会发生同样的字符串内容分配了多次内存,导致浪费内存。
如何能节省内存,让相同内容的字符串只分配一次内存?java使用了一个叫字面量的字符串处理方式。
字面量
字面量是直接使用双引号赋值的字符串。例如String name = "hello world";
字符串池
字面量在分配内存时,被分配在方法区,方法区中会独立出一块内存,专门用于存放字面量,java把单独存放字面量的内存称为字符串池。
String name1 = “aa”;
String name2 = ”aa”;
程序运行时,第一行的值是aa,此时jvm就会在字符串池里面查找是否有字符串aa,如果没有,则字符串池分配内存单元给字符串aa,当执行到第二行代码时,字符串的内容也是aa,此时jvm会查找字符串池里面是否有字符串aa,如果有就直接使用已有的aa,而不是重新为aa分配内存。
例如:
关于==和equals
在字符串的使用中判断是否相等,例如验证用户名和密码是否正确,两次密码一致吗?这些需求可以使用字符串是否相等的判断。
判断字符串是否相等,有两种方法:
一是使用==,二是使用equals方法。
两者区别
==是判断两个字符串变量的值是否相等
equals是判断两个字符串指向的内存单元中的内容是否相同。
PS:在实际开发中判断两个字符串是否相同多数是判断两个字符串的内容是否一样,因此应该使用equals方法,不能使用==。
推荐使用字面量的字符串
字符串常用的API
返回类型 | 方法名称 | 作用 |
---|---|---|
boolean | equals(String) | 比较两个字符串是否相等 |
boolean | equalsIgnoreCase(String) | 忽略大小写比较两个字符串是否相等 |
int | length() | 获取字符串的长度 |
char | charAt(int) | 获取字符串中的一个字符 |
int | indexOf(String) | 判断传入字符串在原字符串中第一次出现的位置 |
int | lastIndexOf(String) | 判断传入字符串在原字符串中最后一次出现的位置 |
boolean | startsWith(String) | 判断原字符串是否以传入字符串开头 |
boolean | endsWith(String) | 判断原字符串是否以传入字符串结尾 |
int | compareTo(String) | 判断两个字符串的大小 |
String | toLowerCase() | 获取小写字符串 |
String | toUpperCase() | 获取大写字符串 |
String | substring(int) | 截取字符串,从传入参数位置开始截取到末尾 |
String | substring(int,int) | 截取字符串,从参数1位置开始截取到参数2位置 |
String | trim() | 去掉字符串首尾的空格 |
String[] | split(String) | 将原字符串按照传入参数分割为字符串数组 |
String | replace(String,String) | 将字符串中指定的内容替换成另外的内容 |
评论留言