一、String
1、概述
String字符串类型,可以定义字符串变量指向字符串对象。提供了操作字符串的功能。实际开发中用的多。
注意:创建的字符串不可改变,""方式给出的字符串对象,存储在字符串常量池中。每次修改字符串都指向新的字符串对象。
2、创建String对象两种方式
(1)直接用""定义(推荐)
(2)通过构造器创建对象,查看API文档,
前两种构造器不推荐,后两种在今后可能会用到。
package com.laogao.practice;
public class JavaPractice {
public static void main(String[] args) {
//String
//创建String对象,方式1
String s1="abc";
System.out.println(s1);//abc
//方式2
char[] ch={'t','t','x','s'};
byte[] bt={97,98,65,67};
String s2=new String(ch);
String s3=new String(bt);
System.out.println(s2);//ttxs,将字符自动拼接为字符串
System.out.println(s3);//abAC,输出ASCII码对应的字母
}
}
两种创建方式区别(面试):
1、以""方式创建的字符串对象,在字符串常量池中存储,且相同内容只存一份(原因:节省内存资源)
2、通过构造器new对象,每次都是一个新对象,放在堆内存中。
package com.laogao.practice;
public class JavaPractice {
public static void main(String[] args) {
//String
//创建String对象,方式1
String s1="abc";
String s11="abc";
System.out.println(s1==s11);//true,说明s1、s11存储地址一样
//方式2
char[] ch={'t','t','x','s'};
String s2=new String(ch);
String s3=new String(ch);
System.out.println(s2==s3);//false,说明s2、s3存储地址不一样
}
}
3、内存原理
4、面试题
(1)面试1
分析:
第一行代码创建了两个对象,双引号中的放入了字符串常量池,new是放入堆内存。
第二行代码在第一行代码基础上,不需要创建新对象。
s1和s2比较,实际上是字符串常量池中的对象和堆内存中的对象比较,是两个不同的对象,因此false。
(2)面试2
分析:
第一段代码中,s3不是直接用双引号创建的,因此是放在堆内存而不是字符串常量池中的,因此false,第二段代码中,因为优化机制,因此true
5、提供了哪些API
(1)字符串的比较
"=="是比较地址是否一样,但无法比较内容是否一样。"=="可以比较基本数据类型。
字符串内容比较两种方式:精确比较、忽略大小写比较(验证码),如下图所示:
案例:登陆注册
package com.laogao.practice;
import java.util.Scanner;
public class JavaPractice {
public static void main(String[] args) {
//String
//快捷键shift+ctrl+enter:调整某行格式
String rightusn = "李白";//直接存储在字符串常量池
String rightpsw = "123";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = scanner.next();//存储在堆内存中
System.out.println("请输入密码:");
String password=scanner.next();
System.out.println(username==rightusn);//false
System.out.println(password==rightpsw);//false
if(username.equals(rightusn)&&password.equals(rightpsw)){
System.out.println("登录成功!");
}
}
}
(2)其他常用API
(黑马老师举的例子太有意思了噗哈哈哈,草原三剑客)
代码练习:
package com.laogao.practice;
public class JavaPractice {
public static void main(String[] args) {
//String
String s1="1235den";
System.out.println(s1.length());//字符串长度,7
System.out.println(s1.charAt(5));//获取索引处字符,e
//可以用获取索引的这个方法来遍历数组
for (int i = 0; i < s1.length(); i++) {
System.out.println(s1.charAt(i));
}
char[] c1=s1.toCharArray();//将字符串转化为字符数组
//遍历数组
for (int i = 0; i < c1.length; i++) {
System.out.println(c1[i]);
}
//字符串截取,包前不包后
System.out.println(s1.substring(0, 5));//1235d
System.out.println(s1.substring(5));//en,从索引处截取到末尾
//替换
String s2=s1.replace("e","哈哈哈");//第一个是目标,第二个是替换值
System.out.println(s2);//1235d哈哈哈n
//字符串分割
String s3="小李,小森,小世界";
String[] s4=s3.split(",");
for (int i = 0; i < s4.length; i++) {
System.out.println(s4[i]);
}
}
}
6、案例
(1)生成随机验证码
package com.laogao.practice;
import java.util.Random;
public class JavaPractice {
public static void main(String[] args) {
//String
//随机5位验证码
String item="0123456789QWERTYUIOPLKJHGFDSAZXCVBNMqwertyuioplkjhgfdsazxcvbnm";
String yzm="";
Random random=new Random();
for (int i = 0; i < 5; i++) {
yzm+=item.charAt(random.nextInt(item.length()));
}
System.out.println(yzm);
}
}
(2)模拟用户登录
package com.laogao.practice;
import java.util.Scanner;
public class JavaPractice {
public static void main(String[] args) {
//String
//快捷键shift+ctrl+enter:调整某行格式
String rightusn = "李白";//直接存储在字符串常量池
String rightpsw = "123";
Scanner scanner = new Scanner(System.in);
for (int i = 1; i <= 3; i++) {
System.out.println("请输入用户名:");
String username = scanner.next();//存储在堆内存中
System.out.println("请输入密码:");
String password=scanner.next();
if(username.equals(rightusn)){
if (password.equals(rightpsw)){
System.out.println("登录成功!");
}else {
System.out.println("密码错误,您还有"+(3-i)+"次机会");
}
}else {
System.out.println("用户名错误,您还有"+(3-i)+"次机会");
}
}
}
}
(3)手机号码屏蔽
package com.laogao.practice;
import java.util.Scanner;
public class JavaPractice {
public static void main(String[] args) {
//String
//屏蔽手机号
Scanner scanner = new Scanner(System.in);
System.out.println("请输入手机号:");
String phone = scanner.next();//补变量快捷键:alt+enter
String phone2=phone.substring(0,3)+"****"+phone.substring(7);
System.out.println(phone2);
}
}
二、ArrayList
1、概述
ArrayList集合类,容器,与数组类似,但存储大小不固定,动态变化
集合非常适合元素不确定,进行增删改查的业务场景,集合提供了丰富的功能。
2、创建ArrayList对象
ArrayList是集合的一种。
package com.laogao.practice;
import java.util.ArrayList;
public class JavaPractice {
public static void main(String[] args) {
//ArrayList
//1、创建
ArrayList list=new ArrayList();
//向集合中添加元素,用到了方法的重载
list.add("我");
list.add("爱");
list.add("中国");
list.add(0,123);//指定索引位置添加元素
System.out.println(list);//[123, 我, 爱, 中国]
}
}
3、泛型
格式:<数据类型>,使用之前要确定是否支持,集合支持泛型,添加泛型时,后边的泛型可以不写
Java是强类型语言,没有泛型则可以添加任意类型的数据,所以要写上泛型,是规范和标准。加上泛型后,集合添加的元素类型要与泛型一致,否则报错。
集合只能存储引用类型,不支持基本数据类型,因此不能写int,要写Interger
package com.laogao.practice;
import java.util.ArrayList;
public class JavaPractice {
public static void main(String[] args) {
//ArrayList
ArrayList<String> list=new ArrayList<>();//泛型
list.add("我");
list.add("爱");
ArrayList<Integer> list2=new ArrayList<>();//泛型
list2.add(1);
list2.add(1546);
list2.add(11);
//list2.add("hhh");//数据类型与泛型不一致,报错
System.out.println(list);//[我, 爱]
System.out.println(list2);//[1, 1546, 11]
}
}
4、常用的API
5、案例练习
(1)案例1
package com.laogao.practice;
import java.util.ArrayList;
public class JavaPractice {
public static void main(String[] args) {
//ArrayList
ArrayList<Integer> list=new ArrayList<>();
list.add(98);
list.add(77);
list.add(66);
list.add(89);
list.add(79);
list.add(50);
list.add(100);
System.out.println(list);//[98, 77, 66, 89, 79, 50, 100]
//方法1
for (int i = 0; i < list.size(); i++) {
if (list.get(i)<80){
list.remove(i);
i--;//每次删除一个元素,后一个元素会前移一位,需要再判断
}
}
System.out.println(list);//[98, 89, 100]
//方法2
ArrayList<Integer> list2=new ArrayList<>();
list2.add(98);
list2.add(77);
list2.add(66);
list2.add(89);
list2.add(79);
list2.add(50);
list2.add(100);
System.out.println(list2);//[98, 77, 66, 89, 79, 50, 100]
for (int i = list2.size()-1; i >=0; i--) {
if (list2.get(i)<80){
list2.remove(i);
}
}
System.out.println(list2);
}
}
(2)案例2
package com.laogao.practice;
import java.util.ArrayList;
public class JavaPractice {
public static void main(String[] args) {
//ArrayList
ArrayList<Movie> movieArrayList=new ArrayList<>();//存储电影对象的列表
movieArrayList.add(new Movie("肖申克的救赎",9.7,"罗宾斯"));
movieArrayList.add(new Movie("霸王别姬",9.6,"张国荣"));
movieArrayList.add(new Movie("阿甘正传",9.5,"汤姆"));
for (int i = 0; i < movieArrayList.size(); i++) {
Movie m=movieArrayList.get(i);
System.out.println("电影名称:"+m.getName());
System.out.println("电影评分:"+m.getScore());
System.out.println("电影演员:"+m.getActors());
System.out.println("------------------");
}
}
}
内存原理:
(3)案例3
package com.laogao.practice;
import java.util.ArrayList;
import java.util.Scanner;
public class JavaPractice {
public static void main(String[] args) {
//元素搜索
ArrayList<Student> students=new ArrayList<>();
students.add(new Student("老A","20180302",23,"1班"));
students.add(new Student("老B","20180303",23,"2班"));
students.add(new Student("老C","20180304",26,"3班"));
students.add(new Student("老D","20180305",26,"4班"));
for (int i = 0; i < students.size(); i++) {
Student s=students.get(i);
System.out.println(s.getStudynum()+"\t"+s.getName()+"\t"+s.getAge()+"\t"+s.getClassroom());
}
Scanner scanner=new Scanner(System.in);
while (true) {
System.out.println("请输入您要检索的学生学号:");
String num=scanner.next();
Student rs = search(students,num);
if (rs==null){
System.out.println("未找到");
}else{
System.out.println(rs.getStudynum()+"\t"+rs.getName()+"\t"+rs.getAge()+"\t"+rs.getClassroom());
}
}
}
/**注释
*
* @param students 存储全部学生的集合
* @param num 要搜索的学生学号
* @return 返回学生对象或者null
*/
public static Student search(ArrayList<Student> students,String num){
for (int i = 0; i < students.size(); i++) {
Student s= students.get(i);
if (s.getStudynum().equals(num)){//注意此处使用equals
return s;
}
}
return null;
}
}