String
String概述
String类在java.lang包下,所以使用的时候不需要导包
String类代表字符串,Java程序中所有的双引号字符串都是String类的对象。
字符串的特点:
- 字符串不可变,它们的值在创建后不能被更改
- 虽然String的值不可变的,但是可以被共享的
- 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
String的构造方法
public class StringDemo1{
//推荐使用直接赋值来创建字符串对象
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);//输出:abc
//public String(byte bys):根据字符数组中的内容,来创建字符串对象
byte[] bys={97,98,99};
String s3=new String(bys);
System.out.println("s3"+s3);//输出:abc
//数字转化为字符数组97=a,98=b,99=c
//String s="abc",直接赋值的方式来创建字符串对象,内容就是abc
String s4="abc";
System.out.println("s4"+s4);
}
}
String对象的特点
1.通过new创建的字符对象,每一次new就会申请一个内存空间,虽然内容相同,但是地址值不同。
char[] chs={'a','b','c'};
String s1=new String(chs);
String s2=new String(chs);
2.以“”方式给出的字符串对象,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,jvm都只会建一个String对象,并在字符池中维护。
String s3="abc";
String s4="abc"
//上述代码针对第一行代码,jvm会建立一个String对象放到字符串池中,并给s3参考,第二行代码直接参考字符串池中的String对象,换句话说他们本质是同一个东西。
字符串的比较
使用**==**作比较
- 基本类型:比较的是数据值是否相同
- 引用类型:比较的是地址值是否相同
字符串是对象,他比较内容是否相同,是通过一个方法来实现的,这个方法叫:equal()
- 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);//false
System.out.println(s2==s3);//false
System.out.println(s3==s4);//true
System.out.println("----------");
//比较字符串内容是否相同
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//true
System.out.println(s3.equals(s4));//true
}
}
String案例
import java.util.Scanner;
public class StringDemo {
/**
* 需求:已知用户名和密码,请实用程序实现模拟用户登陆。总共给三次机会,
* 登陆成功之后,给出相应的提示。
* 思路:1)已知用户名和密码,定义两个字符串表示
* 2)键盘录入要登陆的用户名和密码,用Scaaner实现
* 3)拿键盘录入的用户名、密码和已知的用户名和密码去比较,给出相应的提示,字符串内容的比较使用equal()方法实现。
*/
public static void main(String[] args) {
String login1=new String ( "qingzhu" );
String password=new String ( "12345" );
loginSystem(login1,password);
}
public static void loginSystem(String s1, String s2){
Scanner scanner=new Scanner (System.in);
while (true){
System.out.println ("请输入账户名:" );
String login2=scanner.next ();
System.out.println ("请输入密码:" );
String paw=scanner.next ();
if(s1.equals (login2)){
if ( s2.equals (paw)!=true){
System.out.println ("你输入的密码有误,请重新输入" );
}else{
System.out.println ("恭喜登陆成功" );
break;
}
}else{
System.out.println ("你输入的账户有误" );
}
}
}
}
import java.util.Scanner;
public class StringDemoThree {
/**
* 需求:键盘录入一个字符串,实用程序实现在控制台遍历该字符串
*/
public static void main(String[] args) {
Scanner scanner=new Scanner (System.in);
System.out.println ("请输入一个字符串:" );
String s1=scanner.nextLine ();
for (int i = 0; i < s1.length (); i++) {
System.out.print( s1.charAt (i));
}
}
}
import java.util.Scanner;
public class StringDemoFour {
/**
* 需求:键盘录入一个字符串,统计中字符传中大写字符,小写字符数字字符出现的次数(不考录其他字符)
* 思路:1)键盘录入一个字符串,使用Scanner实现
* 2)统计三种类型的字符个数,使用不同的变量计数
*/
public static void main(String[] args) {
Scanner s=new Scanner (System.in);
int q=0,x=0,y=0;
System.out.println ("请输入一个字符串:" );
String s1=s.nextLine ();
for (int i = 0; i < s1.length (); i++) {
if('A'<=s1.charAt (i) && s1.charAt (i)<='Z'){
q++;
}else if('a'<=s1.charAt (i) && s1.charAt (i)<='z'){
x++;
}else if('0'<=s1.charAt (i) && s1.charAt(i)<='9'){
y++;
}
}
System.out.println ("该字符串中有"+q+"个小写字符,"+x+"个大写字符,"+y+"个数字" );
}
}
import java.util.Scanner;
public class StringDemoFive {
/**
* 需求:定义一个方法,将int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法
* 并在控制台输出结果。例如,数组为int[] arr={1,2,3},执行方法后的输入结果为[1,2,3]
* 思路:1)定义一个int类型的数组,使用静态初始化完成数组的初始化
* 2)定义方法,将int数组中的数据按照指定格式拼接成字符串返回。返回值类型为String
* 3)在方法中遍历数组,按照要求进行拼接
*/
public static void main(String[] args) {
int[] arr={1,3,4,5};
pingjie (arr);
System.out.println (arrayToString (arr) );
}
public static void pingjie(int[] arr){
System.out.print ("[" );
for (int i = 0; i < arr.length; i++) {
if(i== arr.length-1){
System.out.print (arr[i]+"]" );
}else {
System.out.print (arr[i] +",");
}
}
}
public static String arrayToString(int [] arr){
String s="";
s+="[";
for (int j = 0; j < arr.length; j++) {
if(j==arr.length-1){
s+=arr[j];
}else{
s+=arr[j];
s+=",";
}
}
s+="]";
return s;
}
}
StringBuffer
string和stringBuffer的区别:
- stringBuffer中的对象是可以变化的,而string是不可以变的。
- stringbuffer是字符缓冲区,而stringbuilder是可变序列;两者都有appeand方法,该方法可以将各种类型的字符串添加到序列当中。
ArrayList
ArrayList提供一种存储空间可变的存储模型,存储的数据容量可以发生改变的。
ArrayList:可以调整大小的数组实现;是一种特殊的数据类型,泛型;后续在使用的时候引用数据类型替换掉即可。
方法名 | 说明 |
---|---|
pulic ArrayList() | 创建一个空的集合对象 |
public boolean add(E e) | 将在指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在集合的指定位置插入指定的元素 |
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index) | 使用指定的元素替换此列表中指定位置的元素。 |
public E get(int index) | 返回指定位置的元素 |
public int size() | 返回集合中的元素个数 |