1、字符串
字符串就是一个对象;动态初始化一个数组,就是创建一个对象;静态初始化一个对象,仍然是一个对象;字符串直接写上双引号,就是一个string类型的对象,string就是类名称;直接使用的字符串常量,也是字符串对象。
所有的类在使用时都需要导包,除了两种情况:
(1)需要使用的目标类,和当前类在同一包下
(2)要使用的目标类在java.lang<jdk的安装目录/lib/src/java.base/java/lang>下,但不包含子包内容
字符串是一个对象,其所对应的类就是String类,String类在java/lang下所以不需要导包。
打印paintln的方法逻辑:如果是字符串类型,直接显示内容;如果不是字符串,内部会想办法将其转换为字符串之后再显示,一般的对象都使用的是“类型信息@地址值”作为字符串内容显示。
2、创建字符串
字符串常见的2+1种方式(两种构造方法,一种直接赋值)
(1)格式:public String(char[] array) 参数是一个字符数组,根据字符数组的内容来创建一个字符串
(2)格式:public String(char[] array , int offset , int count) 根据字符数组的一部分内容创建字符串,其中参数offset代表一个数组当中的起始索引,从0开始;count代表取用多少个字符。
package xwg.Eric.study.object;
public class CreateString {
public static void main(String[] args) {
char[] array = { 'l', 'i', 't', 't', 'l', 'e', ' ', 'B', 'a', 'b', 'y' };
// 根据字符数组来创建字符串
// 格式:类名称 对象名 = new 类名称(构造参数);
String array1 = new String(array);
System.out.println(array1);
// 根据数组的一部分创建字符串
String array2 = new String(array, 7, 4);
System.out.println(array2);
// 指定索引超出合理范围时,将会发生索引越界异常
/*
* String array3 = new String(array, 20, 20);
* System.out.println(array3);
*/
// 直接赋值
String array4 = "little baby";
System.out.println(array4);
}
}
3、字符串池(一般使用双引号直接赋值可以节省空间)
(1)字符串池是位于堆当中的一小块空间,用来保存若干个字符串的地址值,对象在栈中创建。对象依靠地址寻找池中对应的内容
(2)字符串池当中绝对不会出现重复的字符串对应的地址,保证字符串不重复
(3)凡是直接双引号的字符串默认都在池中,而new出来的字符串默认不在池中。
(4)对于基本类型来说,==是进行内容的相同比较,但是对于引用类型来说,==是进行地址值得相同比较
(5)如果是两个对象,那么地址值必然不同;如果地址值相同,必然是同一个对象(new)
引用过程:创建字符串存放在堆中,字符串将自己所对应的地址值存放在字符串池中,栈中的对象通过地址先找到字符串池中的地址,然后找到对应的字符串进行调用。
4、字符串内容比较
方法一:public boolean equals(Object obj):进行字符串的内容比较,严格区分大小写,参数obj是指另一个比较的对象object也是一种类型,可以接收任何数据类型的数据。
方法二:public boolean euqalsIgnoreCase(String str):进行字符串内容比较,不区分大小写。
注意:(1)要对字符串内容进行比较,一定要使用equals方法进行比较,不能使用==运算
(2)equals方法具有对称性:a.equals(b)与b.equals(a)相同
(3)如果equals方法需要比较的字符串当中尽量将常量写在前面即a位置处
(4)调用方法时,对象当中如果存储的是null值,则会发生空指针异常
(5)直接写上双引号就是字符串对象,所以用双引号直接点也能调用方法
package xwg.Eric.study.object;
public class StringContentCompare {
public static void main(String[] args) {
String str1 = "baby";
char[] str = { 'b', 'a', 'b', 'y' };
String str2 = new String(str);
/*
* 使用==时进行对字符串的地址值得表,如果都是在字符串池且字符串内容相同,则地址值相等。
* 对于new出来的对象存放在堆中,产生新的地址指。
*/
System.out.println(str1 == str2);//false
/*方法一:
* public boolean equals(Object obj):进行字符串的内容比较,严格区分大小写,参数obj是指另一个比较的对象
* object也是一种类型,可以接收任何数据类型的数据。
* 注意事项:(1)要对字符串内容进行比较,一定要使用equals方法进行比较,不能使用==运算
* (2)equals方法具有对称性:a.equals(b)与b.equals(b)相同
* (3)如果equals方法需要比较的字符串当中尽量将常量写在前面及a位置处
* (4)调用方法时,对象当中如果存储的是null值,则会发生空指针异常
* (5)直接写上双引号就是字符串对象,所以用双引号直接点也能调用方法
*/
boolean same = str1.equals(str2);
System.out.println(same);//true
System.out.println(str1.equals("love"));
String str3 = null;
System.out.println(str1.equals(str3));
/*
* 对以上第(3)点进行检查
* 报错:java.lang.NullPointerException,空指针异常
*/
System.out.println(str3.equals(str1));
/*方法二:
* public boolean euqalsIgnoreCase(String str):进行字符串内容比较,不区分大小写。
*/
String str4 = "Baby";
boolean result = str4.equalsIgnoreCase(str1);
System.out.println(result);
System.out.println("Hello,little baby".equalsIgnoreCase("hello,little baby"));
}
}
案例一
package xwg.Eric.study.november;
import java.util.Scanner;
public class EssayLogin {
public static void main(String[] args) {
String username = "baby";//注意在使用的密码中存在空格时,将无法输入密码就执行结果,即空格等同于确认(回车)
String password = "love";
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String firstname = sc.next();
System.out.println("请输入密码");
String firstpasswd = sc.next();
if(firstname.equalsIgnoreCase(username) && firstpasswd.equals(password)){
System.out.println("登录成功,小宝贝,请开始show");
}else{
System.out.println("登录失败,你不是我的小宝贝");
}
}
}
5、字符串内容替换
方法:public String replace(CharSequence oldStr,CharSequence newStr)参数oldStr代表需要被替换的字符串,newStr代表替换为的字符串,CharSequence就是字符串String。
注意:字符串内容不可发生改变。所以replace方法的返回值结果是一个全新的字符串
str.replace("aaa","bbb")//将字符串str中的aaa替换为bbb
6、字符串切割(split)
方法:public String[] split(String regex):将regex作为标记进行切割,返回切分之后的若干字段的字符串,形成字符串数组
注意:不要使用英文句号.(点)作为切割标记,因为英文点在正则表达式中有特殊含义,参数regex实质为一个正则表达式,如果需要使用其作为分隔符,需要在前面加\\
package xwg.Eric.study.november;
public class StringReplaceAndSplit {
public static void main(String[] args) {
String str1 = "I love you baby";
String str2 = str1.replace("baby", "little baby");
System.out.println(str1);
System.out.println(str2);
String[] array = str1.split(" ");
System.out.println("字符串数组长度:" + array.length);
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
7、集合概述
集合与数组相类似,是一种因用哪个类型,可以保存很多数据,区别在与数组的长度不可以改变,集合的长度可以任意改变。集合包含很多种:ArrayList、HashSet、LinkedList、HasMap……通过API文档查询得ArrayList类属于java.util包中,使用时需要导包。
ArrayList常用的构造方法:public ArrayList()默认无参数的构造方法
格式;类名称 对象名 = new 类名称 ArrayList<泛型> list = new ArrayList<>()
泛型:集合当中存放的全都是统一的一种引用类型的数据。
注意:泛型只能是引用类型,不能是基本类型
使用方法:
(1)添加元素:public boolean add(E element):向集合中添加一个元素,参数是被添加的元素,返回值是true表示成功
(2)获取元素:public E get(int index):从集合当中获取一个元素,参数是元素索引(从0开始),返回值为要获取的元素对象
(3)获取长度:public int size():获取集合的元素个数,集合的长度,得到int数字
package xwg.Eric.study.november;
import java.util.ArrayList;
public class CreatAndUseArrayList {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
// ArrayList<int> list = new ArrayList<>();错误写法,泛型只能是引用类型。
System.out.println(list);
/*
* 添加元素
*/
list.add("I");
list.add(" ");
list.add("l");
list.add("o");
list.add("v");
list.add("e");
System.out.println(list);
/*
* 获取元素
*/
String name = list.get(2);
System.out.println(name);//将集合中索引号为2(第三个)元素赋值给name并打印
/*
* 获取长度
*/
int length = list.size();
System.out.println(length);
//增加元素
list.add(" ");
list.add("B");
list.add("a");
list.add("b");
list.add("y");
System.out.println(list);
System.out.println(list.size());
}
}
由于集合泛型存储的数据必须是引用类型,如果一定要存储基本类型,那么就要使用基本类型对应的“包装类”(包装类位于java.lang下,共8种)
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
ArrayList<Integer> list = new ArrayList<>();
从jdk1.5开始,基本类型可以和对应的包装类进行自动装箱(基本类型转化Wie包装类)拆箱(包装类转化为基本类型)
自定义引用类型的使用
定义类
package xwg.Eric.study.november;
public class CustomPerson {
private String name;
private int age;
public CustomPerson() {
}
public CustomPerson(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
使用自定义类遍历集合
package xwg.Eric.study.november;
import java.util.ArrayList;
public class CustomPersonArrayList {
public static void main(String[] args) {
CustomPerson first = new CustomPerson("baby", 18);
CustomPerson second = new CustomPerson("Baby", 1);
ArrayList<CustomPerson> list = new ArrayList<>();
list.add(first);
list.add(second);
System.out.println(list);
for (int i = 0; i < 2; i++) {
CustomPerson lala = list.get(i);
System.out.println("姓名:" + lala.getName() + "年龄:" + list.get(i).getAge());
}
}
}