JAVA运行期数据存放
内存分为四个区域,堆 栈 数据 段代码段
堆:new(对象)
栈:局部变量
数据段:类变量,常量
代码段:方法的定义
需特别注意
String s=new String ("abc");
s 变量指向堆当中的字符串对象,但是在产生堆中的字符串对象之前,会先在常量区中,产生字符串常量对象(abc).然后以常量对象为模板,拷入堆中的字符串对象。如果常量区中有对应的字符串,就直接拷贝。
栈生命周期最短,方法结束空间释放,堆空间方对象,类结束,空间结束,数据段虚拟机关闭空间释放,代码的单独空间放置
equals 方法比较,如果是String 类型,比较的就是地址对应的内容,过个是引用类型,比较的就是地址是否相等
==比较的是地址,基本类型用==比较,因为数据和地址是一起的,所以可以用==直接比较内容
字符串的特性
字符串具有长度不可变化的特性,当对字符串进行添加,替换,删除时,不会改变字符串的内容,而是产生一个新的字符串
java.lang包String类常用方法
public class StringTest {
public static void main(String[] args) {
String s1="abc";
//得到指定下标的字符串
char c=s1.charAt(1);
System.out.println(c);
String s2="abc";
String s3="ABC";
//比较两个字符串是否相等,忽略大小写
System.out.println(s2.equalsIgnoreCase(s3));
//比较两个字符串是否相等,区分大小写
System.out.println(s2.equals(s3));
String s4="abcde";
//得到指定字符串第一次出现在s4字符串的下标,如果s4中不包含该字符串,返回-1
int index=s4.indexOf("bc");
//得到指定字符串最后一次出现在s4字符串的下标,如果s4中不包含该字符串,返回-1
int last=s4.lastIndexOf("c");
System.out.println(index+" "+last);
//得到字符串长度
int len=s4.length();
System.out.println(len);
//替换指定字符串
String s5="abdsafdsa";
String rep=s5.replace("a", "$");
System.out.println(rep);
String s6="acabdsafg";
//下标3开始,截取字符串
String sub=s6.substring(3);
//下标3开始,5结束,截取字符串,包含开始3,不包含结束5
String sub1=s6.substring(3, 5);
System.out.println(sub+" "+sub1);
String s7=" ab cd ef ";
//去掉两头空格
s7=s7.trim();
System.out.println(s7+"*");
}
}
编写一个程序,解析字符串,然后写入资源文件
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
public class Test2 {
public static void main(String[] args) {
String str="http://localhost:8088/abc?name=john&sex=男";
//获取问号下标
int num=str.indexOf("?");
//获取等号下标
int num2=str.indexOf("=");
//截取问号之后等号之前的数据
String nameStr=str.substring(num+1,num2);
//截取&之前,等号之后数据
int num3=str.indexOf("&");
String userName=str.substring(num2+1,num3);
//去掉&之前字符串
String newStr=str.substring(num3);
//获取性别
int num4=newStr.indexOf("=");
String sexStr=newStr.substring(1, num4);
//获取性别
String userSex=newStr.substring(num4+1);
//添加进资源文件
Properties pro=new Properties();
pro.setProperty(nameStr, userName);
pro.setProperty(sexStr, userSex);
try {
pro.store(new FileWriter("String.txt"),null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
正则表达式
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。
正则表达式的构造要求
1. [ ]:表示[ ]中描述的任意字符
2. {3,20}:表示前一个规则最少出现3次,最多出现20次
3. {3, }:表示最少出现3次,没有上限
4. {3}:表示只能出现3次,不能多,不能少
5. |:表示或者
6. *:等价于{0,},可以出现,可以不出现,如果出现,没有上限
7. +:等价于{1,},至少出现异常,没有上限限制
8. ?:等价于{0,1},可以出现,可以不出现,如果出现最多一次
9. .:表示任意字符
10. \d:等价于[0-9],表示数字
11. \s:表示空格或回车
12. \w:等价于[a-zA-Z0-9_ ],表示合法标识符
13. 匹配中文 \u4e00-\\u9fa5 两个斜杠 例如 \\w \\d
import javax.swing.JOptionPane;
public class EmailTest {
//匹配邮箱格式是否合法
public static void main(String[] args) {
String EmailStr = JOptionPane.showInputDialog(null, "请输入邮箱号");
// 设定正则表达式匹配的字符串的格式
String rex = "[a-zA-Z0-9]{3,20}[@][A-Za-z0-9]{2,9}[.](com|cn|net)";
if (EmailStr.matches(rex)) {
JOptionPane.showMessageDialog(null, "合法");
} else {
JOptionPane.showMessageDialog(null, "非法");
}
}
}
实际应用 添加信息匹配
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class StudnetFrame extends JFrame{
private Text nameTxt=new Text("姓名", 50, 50, this);
private Text ageTxt=new Text("年龄", 50, 100, this);
private Text sexTxt=new Text("性别", 50, 150, this);
public StudnetFrame(){
this.setLayout(null);
Button addButton=new Button("添加", 100, 200, this);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String info="";
if(nameTxt.getText().matches("[a-zA-Z\\u4e00-\\u9fa5]{2,}")==false){
info+="姓名必须是2位以上的字母或汉字\n";
}
if(ageTxt.getText().matches("\\d{1,3}")==false){
info+="年龄必须是数字\n";
}
if(sexTxt.getText().matches("(男|女)")==false){
info+="性别必须是男或女\n";
}
if(info.length()!=0){
JOptionPane.showMessageDialog(null, info);
return;
}
JOptionPane.showMessageDialog(null, "执行业务");
}
});
this.setSize(500,400);
this.setVisible(true);
this.setDefaultCloseOperation(3);
this.setLocationRelativeTo(null);
}
public static void main(String[] args) {
StudnetFrame s=new StudnetFrame();
}
}
StringBuffer类
StringBuffer是缓存区的对象,当对StringBuffer做添加,替换,删除时,直接改变StringBuffer的内容,不会产生新对象
如果需要对字符串做频繁操作时,一般先转换为为StringBuffer,操作完成后再通过toString()转换为字符串
StringBuffer类常用方法
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer("123456");
//追加
sb.append("s");
System.out.println(sb);
//插入 (插入的位置下标,插入的内容)
sb.insert(4, "********");
System.out.println(sb);
//删除(删除起始位置,结束位置)
sb.delete(1, 2);
System.out.println(sb);
// 将字符串倒序输出 比如:输入”abcde” 那么,输出 “edcba”
String str=JOptionPane.showInputDialog(null,"请输入一个数组");
StringBuffer str1=new StringBuffer(str);
//reverse()方法为反转输出,在StringBuffer中第一个方法
str=str1.reverse().toString();
System.out.println(str);
}
}
网友评论