String
String
概述
- 定义的变量可以存储字符串,同时String类提供了很多操作字符串的功能,我们可以直接使用
- java.long .String 类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串
- java中的所有字符串文字(例如“abc”)都为此类的对象
- String其实常被称为不可变字符串类型,它的对象在创建后不能被更改
String str="今天";
str+="天气";
str+="真好";
System.out.println(str);
结果:今天天气真好
String的对象在创建后不可变,但是为什么这个结果变了呢?
创建后不可变,但是,str的指向改变了。
总结:
1.String是什么,可以做什么?
字符串类型,可以定义字符串变量指向字符串对象
2.String是不了变字符串的原因
- String变量每次修改其实都是产生并指向了新的字符串对象
- 原来的字符串对象是没有改变的,所以称不可变字符串
String类创建对象的两种方式
方式一:直接使用“ ”定义
String name=“易烊千玺”;
方式二:
通过String的构造器去创建对象
构造器 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有内容 |
public String(String original) | 根据传入的字符串的内容,来创建字符串 |
public String (char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] chs) | 根据字节数组的内容,来创建字符串对象 |
两种方式有什么区别?
- 以“ ”方式创建的字符串对象,在字符串常量池中存储,而且相同的内容只会在其中存储一份(节省内存)
- 通过构造器new对象,每new一次都会产生一个新的对象,放在堆内存中
String s1="abc";
String s2="abc";
System.out.println(s1==s2);//true
char [] chars={'a','b','c'};
String s3=new String(chars);
String s4=new String(chars);
System.out.println(s3==s4);//false
内存原理图
总结
1.字符串对象的特点
“ ”创建的之创建了一个对象
new 则是两个对象
练习
String s1="abc";
String s2="ab";
String s3=s2+"c";
System.out.println(s1==s2);//false
因为s3在拼接之后在堆内存中,而不在字符串常量池中,所以地址不一样
String s1="abc";
String s2="a"+"b"+"c";
System.out.println(s1==s2);//true
因为在java中存在编译优化机制,程序在编译时:“a”+‘’b‘’+“c”直接会合成"abc";
String 常用方法equals方法(APl)
equals方法用来比较内容,是Object中的方法
public boolean equals(Object anObject)
public boolean equalsIgnoreCase(String anotherString) 不区分大小写
String的其他常用方法
1.public int length()//获取字符串的长度
2.public char charAt(int index)//获取某个索引位置的字符
遍历字符串中的字符
3.public char[] toCharArray();//把字符串转换成字符数组
4.public String substring(int beginindex,int endindex)//截取内容,包前不包后
5.public String substring(int index)//从index到结尾
6.public String replace(String target,String replacement);//替换
7.public boolean contains(String str);//是否包含str
8.public boolean startwith(String str)//是否以str开始
9.public boolean endwith(String str)//是否以str结尾
10.public String[] split(String s)//按照某个内容把字符串分割成字符串数组返回
11.public int indexof(char ch)//返回指定字符在字符串中第一次出现的索引
12.public int indexof(String str)//返回指定字符串在此字符串中第一次出现的索引(字符串的第一个索引)
13.public String concat(String str)//字符串拼接
14.public String trim()//去除两端空格
案例操作
需求:随机产生一个5位的验证码,没位数可能是数字,大写字母,小写字母
String datas="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String code="";
Random r=new Random();//随机数对象
for(int i=0;i<5;i++){
int index= r.nextInt(datas.length());//定义随机数生成的范围
char c=datas.charAt(index);
code+=c;
}
System.out.println(code);
需求:模拟用户登录,最多只给三次机会
String name="zhangsan";
String pwd="123456";
Scanner scanner=new Scanner(System.in);
for(int i=0;i<3;i++){
System.out.println("请输入登录名称");
String loginname=scanner.next();
System.out.println("请输入登录密码");
String loginpwd=scanner.next();
if(name.equals(loginname)){
if(pwd.equals(loginpwd)){
System.out.println("登录成功");
break;
}else{
System.out.println("登录密码错误");
}
}else{
System.out.println("登陆名错误");
}
}
需求:手机号码屏蔽,以字符串的形式从键盘接受一个手机号,将中间四位号码屏蔽,最终效果为
158****7839
Scanner scanner=new Scanner(System.in);
System.out.println("请输入手机号:");
String str=scanner.next();
String str1= str.substring(0,3);
String str2=str.substring(7);
System.out.println(str1+"****"+str2);
Scanner(System.in);
System.out.println(“请输入手机号:”);
String str=scanner.next();
String str1= str.substring(0,3);
String str2=str.substring(7);
System.out.println(str1+“****”+str2);