15.5 String
String概述
String类在java.lang包下,所以使用的时候不需要导包
String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都被实现为此类的实例;也就是说,Java程序中所有的双引号字符串,都是String类的对象
字符串的特点
- 字符串不可变,它们的值在创建后不能被更改
- 虽然String的值是不可变的,但是它们可以被共享
- 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
String构造方法
package myString; /* String构造方法: 1. public String():创建一个空白字符串对象,不包含任何内容 2. public String(char[] chs):根据字符数组的内容,来创建字符串对象 3. public String(byte[] bys):根据字节数组的内容,来创建字符串对象 4. String s = "abc" 直接赋值的方法创建字符串对象,内容就是abc */ public class StringDemo01 { public static void main(String[] args) { //public String():创建一个空白字符串对象 String s1 = new String(); System.out.println("s1:" + s1); //输出空白内容 //public String(char[] chs):根据字符数组的内容,来创建字符串对象 char[] chs = {'a', 'b', 'c'}; String s2 = new String(chs); System.out.println("s2:" + s2); //public String(byte[] bys):根据字节数组的内容,来创建字符串对象 byte[] bys = {97,98,99}; String s3 = new String(bys); System.out.println("s3:" + s3); //String s = "abc" 直接赋值的方法创建字符串对象,内容就是abc String s4 = "abc"; // 这里是没有使用构造方法的 System.out.println("s4:" + s4); } }
String对象的特点
特点1
特点2
特点1内存过程:输出false
package myString; public class StringDemo1 { public static void main(String[] args) { //构造方法的方式得到对象 char[] chs = {'a', 'b', 'c'}; String s1 = new String(chs); String s2 = new String(chs); System.out.println(s1==s2); } }
特点2内存过程:输出true
代码实现比较如下:
package myString; public class StringDemo2 { public static void main(String[] args) { //直接赋值的方式得到对象 String s3 = "abc"; String s4 = "abc"; System.out.println(s3==s4); } }
15.6 字符串的比较
使用==做比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals(),返回值为bool类型
package myString; /* 使用 == 做比较 基本类型:比较的是数据值是否相同 引用类型:比较的是地址值是否相同 public boolean equals(Object anObject) 将此字符串与指定对象进行比较 */ public class StringDemo02 { public static void main(String[] args) { //构造方法的方式得到对象 char[] chs = {'a','b','c'}; String s1 = new String(chs); String s2 = new String(chs); //直接赋值的方式得到对象 String s3 = "abc"; String s4 = "abc"; //比较字符串对象地址是否相同 System.out.println(s1==s2); System.out.println(s2==s3); System.out.println(s3==s4); //相同 System.out.println("--------------"); //比较字符串内容是否相同 System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s3.equals(s4)); } }
案例1:用户登录模拟
package myString; import java.util.Scanner; public class StringTest01 { public static void main(String[] args) { //已知用户名和密码,定义两个字符串表示即可 String username = "itheima"; String password = "czbk"; //for循环实现多次机会 for (int i = 0; i < 3; i++) { //键盘录入要登录的用户名和密码,用Scanner实现 Scanner sc = new Scanner(System.in); System.out.println("请输入用户名:"); String name = sc.nextLine(); System.out.println("请输入密码:"); String pwd = sc.nextLine(); //进行比较 if (name.equals(username) && pwd.equals(password)) { System.out.println("登录成功"); break; } else { if (2 - i == 0) { System.out.println("你的账户被锁定,请与管理员联系"); } else { System.out.println("登录失败,你还有" + (2 - i) + "次机会"); } } } } }
案例2:遍历字符串
package myString; import java.util.Scanner; public class StringTest02 { public static void main(String[] args) { //键盘录入一个字符串,用Scanner实现 Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); //遍历字符串,首先要能够获取到字符串的每一个字符 //length()方法获取字符串长度 for (int i = 0; i < line.length(); i++) { System.out.println(line.charAt(i)); } } }
案例3:统计字符次数
package myString; import java.util.Scanner; public class StringTest03 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入字符串:"); String line = sc.nextLine(); int DaXie = 0; int XiaoXie = 0; int ZiMu = 0; for (int i = 0; i < line.length(); i++) { char ch = line.charAt(i); if (ch >= 'A' && ch <= 'Z') { DaXie += 1; } else if (ch >= 'a' && ch <= 'z') { XiaoXie += 1; } else if (ch >= '0' && ch <= '9') { ZiMu += 1; } } System.out.println("大写字母个数:" + DaXie); System.out.println("小写字母个数:" + XiaoXie); System.out.println("数字个数:" + ZiMu); } }
案例4:拼接字符串
package myString; /* 拼接字符串 */ public class StringTest04 { public static void main(String[] args) { int[] arr = {1, 2, 3}; //调用方法,接收结果 String s = arrayToString(arr); System.out.println("s: "+ s); } public static String arrayToString(int[] arr) { //在方法中遍历数组,按照要求进行拼接 String s = ""; s += "["; for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { s += arr[i]; } else { s += arr[i]; s += ", "; } } s += "]"; return s; } }
案例5:字符串反转
package myString; import java.util.Scanner; /* 字符串反转 */ public class StringTest05 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String s = sc.nextLine(); String sReverse = StringToReverse(s); System.out.println("反转后:" + sReverse); } public static String StringToReverse(String s) { String ss = ""; for (int i = s.length() - 1; i >= 0; i--) { ss += s.charAt(i); } return ss; } }
15.7 String中的方法
常见方法
可在帮助文档中查看到:
字符串中的方法比较多!
15.8 StringBuilder
String内存过程:我们知道字符串是不可变的,常量
可以看到进行字符串拼接会浪费堆内存
所以引出来了StringBuilder
StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是StringBuilder对象中的内容是可变的
String和StringBuilder的区别?
- String:内容是不可变的
- StringBuilder:内容是可变的
StringBuilder构造方法
例1
package myString; /* StringBuilder构造方法 public StringBuilder():创建一个空白可变字符串对象,不含有任何内容 public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象 */ public class StringBuilderDemo01 { public static void main(String[] args) { //1.public StringBuilder():创建一个空白可变字符串对象,不含有任何内容 StringBuilder sb = new StringBuilder(); System.out.println("sb:" + sb); System.out.println("sb.length():" + sb.length()); System.out.println("--------------------------"); //2.public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象 StringBuilder sb2 = new StringBuilder("hello"); System.out.println("sb2:" + sb2); System.out.println("sb2.length():" + sb2.length()); } }
StringBuilder添加和反转的方法
例:添加:.append()
package myString; public class StringBuilderDemo02 { public static void main(String[] args) { //创建对象 StringBuilder sb = new StringBuilder(); // StringBuilder sb2 = new StringBuilder("hello"); StringBuilder sb3 = sb.append("hello"); System.out.println("sb:" + sb); System.out.println("sb2:" + sb2); System.out.println("-----------------"); System.out.println("sb==sb2:" + (sb==sb2)); System.out.println("sb==sb3:" + (sb==sb3)); } }
例:反转:.reverse()
package myStringBuilder; /* StringBuilder 的添加和反转方法 public StringBuilder append(任意类型):添加数据,并返回对象本身 public StringBuilder reverse():返回相反的字符序列 */ public class StringBuilderDemo01 { public static void main(String[] args) { //创建对象 StringBuilder sb = new StringBuilder(); // sb.append("hello"); // sb.append("world"); // sb.append("java"); // sb.append(100); //链式编程 sb.append("hello").append("world").append("java").append(100); System.out.println(sb); //反转 sb.reverse(); System.out.println(sb); } }
15.9 StringBuilder和String的相互转换
- StringBuilder 转换为 String:
toString()
- String 转换为 StringBuilder:
public StringBuilder(String s):通过构造方法就可以实现
package myStringBuilder; /* StringBuilder 转换为 String toString() String 转换为 StringBuilder public StringBuilder(String s):通过构造方法就可以实现 */ public class StringBuilderDemo02 { public static void main(String[] args) { //1.StringBuilder to String StringBuilder sb = new StringBuilder(); sb.append("hello"); //String s = sb; //这个是错误做法 String s = sb.toString(); System.out.println(s); //2.String to StringBuilder String ss = "hello"; //StringBuilder s = ss; //这个是错误的 StringBuilder sb2 = new StringBuilder(ss); System.out.println(sb2); } }
案例:拼接字符串
package myStringBuilder; /* 拼接字符串 */ public class StringBuilderDemo03 { public static void main(String[] args) { int[] arr = {1, 2, 3}; String s = pinJie(arr); System.out.println(s); } public static String pinJie(int[] arr) { StringBuilder sb = new StringBuilder(); sb.append("["); for (int i = 0; i < arr.length; i++) { sb.append(arr[i]); if (i != arr.length - 1) { sb.append(","); } } sb.append("]"); String s = sb.toString(); return s; } }
案例:字符串反转
package myStringBuilder; /* 字符串反转 */ import java.util.Scanner; public class StringBuilderDemo04 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符串:"); String line = sc.nextLine(); String s = stringReverse(line); System.out.println("反转后:" + s); } public static String stringReverse(String s){ // StringBuilder sb = new StringBuilder(s); // sb.reverse(); // String ss = sb.toString(); // return ss; //用一行代码实现上面功能 return new StringBuilder(s).reverse().toString(); } }
这些方法都能在帮助文档中找到!
如下:
本博客到黑马视频的第133个!
16 集合
集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
集合类有很多,目前只学习一个:ArrayLlist,需要导包
16.1 ArrayList
ArrayList< E>
- 可调整大小的数组实现
- < E>:是一种特殊的数据类型,泛型
什么用呢?
在出现E的地方我们使用引用数据类型替换即可
举例:ArrayList<String>
,ArrayList<Student>
16.2 ArrayList构造方法和添加方法
package myArrayList; import java.util.ArrayList; /* ArrayList构造方法: public ArrayList():创建一个空的集合对象 ArrayList添加方法: public bollean add(E e):将指定的袁术追加到此集合的末尾 public void add(int index, E,element):在此集合中的指定未知插入指定的元素 */ public class ArrayListDemo01 { public static void main(String[] args) { //public ArrayList():创建一个空的集合对象 //ArrayList<String> array = new ArrayList<>(); ArrayList<String> array = new ArrayList<String>(); //这两个都行 //add添加元素 System.out.println(array.add("hello")); System.out.println(array.add("world")); array.add("100"); //add指定位置添加元素 array.add(1, "java"); //如果索引超出会报错 array.add(4, "javaee"); //输出集合 System.out.println("array:" + array); } }
16.3 ArrayList集合常用方法
代码举例如下:
package myArrayList; import java.util.ArrayList; /* Array常用方法: remove删除指定元素 remove删除指定索引处的元素 set修改指定索引处的元素 get获取指定索引处的元素 size()返回集合元素个数 */ public class ArrayListDemo02 { public static void main(String[] args) { //创建集合 ArrayList<String> array = new ArrayList<String>(); //添加元素 array.add("world"); array.add(1, "hello"); array.add("java"); array.add("python"); System.out.println("attay:" + array); //1.删除指定元素 System.out.println("1.删除world:" + array.remove("world")); System.out.println(" 删除javaee:" + array.remove("javaee")); //没有这个,false System.out.println("attay1:" + array); //2.指定索引 System.out.println("删除指定索引1,返回索引对应的值:" + array.remove(1)); //返回索引值的元素 //System.out.println(array.remove(3)); //删除时索引越界会报错 System.out.println("attay2:" + array); //3.修改索引对应的值 System.out.println("修改索引1的值,返回被修改的值:" + array.set(1, "C++")); //注意:索引越界会报错 System.out.println("attay3:" + array); //4.返回指定索引处的元素 System.out.println("返回1索引的元素:" + array.get(1)); System.out.println("attay4:" + array); //5.获取元素个数 System.out.println("元素个数:" + array.size()); } }
案例:存储字符串并遍历
package myArrayList; import java.util.ArrayList; public class ArrayListTest01 { public static void main(String[] args) { //创建集合对象 ArrayList<String> array = new ArrayList<String>(); //添加元素 array.add("aaa"); array.add("bbb"); array.add("ccc"); //遍历 for (int i=0; i<array.size(); i++){ String s = array.get(i); System.out.println(s); } } }
案例2:存储学生对象并遍历
package myArrayList; import java.util.ArrayList; public class ArrayTest02 { public static void main(String[] args) { //创建集合 ArrayList<Student> array = new ArrayList<Student>(); //括号里面改了 //创建学生对象 Student s1 = new Student("林青霞", 30); Student s2 = new Student("风清扬", 33); Student s3 = new Student("张曼玉", 18); //添加学生对象到集合中 array.add(s1); array.add(s2); array.add(s3); //遍历 for (int i=0; i< array.size(); i++){ Student s = array.get(i); System.out.println(s.getName() + "," + s.getAge()); } } }
案例3:
package myArrayList; import java.util.ArrayList; import java.util.Scanner; public class ArrayTest03 { public static void main(String[] args) { //创建集合 ArrayList<Student1> array = new ArrayList<Student1>(); //键盘录入 addStudent(array); addStudent(array); addStudent(array); //遍历集合 for(int i=0; i<array.size(); i++){ Student1 s = array.get(i); System.out.println(s.getName() + "," + s.getAge()); } } public static void addStudent(ArrayList<Student1> array){ //键盘录入 Scanner sc = new Scanner(System.in); System.out.println("请输入学生姓名:"); String name = sc.nextLine(); System.out.println("请输入学生年龄:"); String age = sc.nextLine(); //创建学生对象 Student1 s = new Student1(); s.setName(name); s.setAge(age); //往集合中添加学生对象 array.add(s); } }
此博客到视频139截止!