字符串的创建
1.直接创建
String s="hello world";
2.使用new进行创建
String s1=new String();//此时s1为""而不是null
String s2=new String("hello world");
char[] a={'h','e','l','l','o'};
String s3=new String(a);//后续对字符数组的修改不会影响字符串
String s4=new String(a,2,3);//第二个参数是开始位置,第三个参数是长度,s4为llo
3.通过StringBuilder和StringBuffer的toString()方法。(下面会介绍)
连接字符串
1.使用+来连接字符串
2.使用concat()方法
String a="";
a=a.concat("b).concat("cd);
3.使用StringBuilder和StringBuffer的append()方法。
字符串基本操作
1.基本操作方法
A.获取字符串长度方法length()
int length=str.length();
B.获取字符串中第i个字符方法charAt()
char ch=str.charAt(i);
C.获取指定位置的字符方法getChars(4个参数)
char array[]=new char[100];
str.getChars(indexBegin,indexEnd,array,arrayBegin);
indexBegin – 字符串中要复制的第一个字符的索引
indexEnd – 字符串中要复制的最后一个字符之后的索引
array – 目标数组
arrayBegin – 目标数组中的起始偏移量
注意:截取区间为[indexBegin,indexEnd)
D.判断字符串是否有内容
boolean flag=str.isEmpty();
E.字符数组和字符串的转换
char[] ch=str.toCharArray();
String s=String.valueOf(ch);
F.割裂字符串
String[] result=str.split(" ");
参数可以是一个正则表达式。
G.获得子串
String sub1=str.substring(begin);
String sub2=str.substring(begin,end);
sub1包含了[begin,str.length),sub2包含了[begin,end)
H.转大小写
String big=str.toUpperCase();
String small=str.toLowerCase();
2.字符串比较
A.比较大小
int a=s1.compareTo(s2);
int b=s1.compareToIgnoreCase(s2);
这两个方法会返回一个int值,只可能是0,1,或者-1.
如果字符串等于参数字符串,返回0;小于参数字符串,返回-1;大于参数字符串,返回1.
B.比较相等
boolean a=s1.equals(s2);
boolean b=s1.equalsIgnoreCase(s2);
注意:equals用来比较内容是否相同,而==用来比较对象是否相同。
String a="abc";
String b="abc";
此时a==b返回true,因为它们指向常量池中同一个对象。
String a=new String("abc");
String b=new String("abc");
此时a==b返回false,因为a和b是两个不同的对象。
C.比较前缀和后缀
boolean a=s1.startsWith(prefix);
boolean b=s2.endsWith(suffix);
3.字符串的查找
A.indexOf()方法,没有找到会返回-1
str.indexOf(ch);//查找字符,返回首次出现的索引
str.indexOf(ch,fromIndex);//包含fromIndex
str.indexOf(s);//查找字符串
str.indexOf(s,fromIndex);
B.lastIndexOf()方法
和indexOf()用法一致,返回值为最后一次出现的索引.
C.判断是否包含字符串
boolean flag=str.contains(s);
D.字符和字符串的替换
str=str.replace('a','b');
str=str.replace("aa","bb");
字符串的类型转换
数据类型字符串→其他类型其他类型→字符串1其他类型→字符串2byteByte.parseByte(str)String.valueOf(bt)Byte.toString(bt)intInteger.parseInt(str)String.valueOf(i)Integer.toString(i)longLong.parseLong(str)String.valueOf(l)Long.toString(l)doubleDouble.parseDouble(str)String.valueOf(d)Double.toString(d)floatFloat.parseFloat(str)String.valueOf(f)Float.toString(f)charstr.charAt()String.valueOf©Character.toString( c )booleanBoolean.getBoolean(str)String.valueOf(b)Boolean.toString(b)
StringBuilder和StringBuffer
StringBuilder和StringBuffer对象都代表一个字符序列可变的字符串,当一个对象被创建后,可以调用append(),insert(),reverse(),setCharAt(),setLength()等方法改变这个字符序列。一旦生成了想要的字符串,可以调用toString()方法来转换成String对象。两者的速度会比直接对String操作快得多。
StringBuffer b=new StringBuffer("123");//123
b.append("456");//123456
b.insert(2,"7");//1273456
b.reverse();//6543721
b.setCharAt(0,'A');//A543721
b.setLength(4);//A543
System.out.print(b.toString);
两者几乎完全相同,唯一不同的地方在于,StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,因此运行速度会快一些。StringBuffer类中的方法都添加了synchronized关键字,用来保证线程的安全。
String的不可变性
1.不可变对象,指创建后的对象不可以改变,典型例子为Java中的String。 2.String类不可变的好处: A.可以实现字符串池。字符串池的实现可以在运行时节约很多时间,因为不同的字符串变量都指向池中同一个字符串。 B.安全性得到保证。譬如数据库的用户名、密码等都是用字符串来传入;Socket编程中,主机名和端口都是字符串传入。字符串的不可变性防止黑客的修改。 C.对于多线程是安全的。 D.类加载器要用到字符串,不可变性提供了安全性,保证正确的类被加载,防止对数据库的损坏。 E.字符串不可变,因此它创建时的hash值可以被缓存,不需要重新计算。字符串很适合做Map中的键,处理速度要快过其他键对象。
格式字符串
String类的format()方法使用指定的格式字符串和参数返回一个格式化字符串。
转换符说明示例%b,%B格式化为布尔类型false%h,%H格式化为哈希码A05A5198%s,%S格式化为字符串类型“abc”%c,%C格式化为字符类型‘w’%d格式化为十进制数26%0格式化为八进制数12%x,%X格式化为十六进制数4b1%e格式化为科学计数法的十进制数1.700000e+01%a格式化为带有效位数和指数的十六进制浮点数0X1.C000000000001P4
String str=String.format("%d",400/2);
String str2=String.format("%b",3>5);
转换符说明示例%te一个月中的一天(1~31)12%td一个月中的一天(01~31)07%tb指定语言的月份简称Jan(英文)、一月(中文)%tB指定语言的月份全称February(英文)、二月(中文)%ta指定语言的星期几简称Mon(英文)、星期一(中文)%tA指定语言的星期几全称Monday(英文)、星期一(中文)%tc全部日期和时间信息星期三十月25 13:37:22 CST 2008%ty两位年份08%tY四位年份2008%tj一年中的第几天(001~366)060%tm月份05
Date date=new Date();
Locale form=Locale.US;
String year=String.format(form,"%tY",date);
String month=String.format(form,"%tB",date);
String day=String.format(form,"%td",date);
使用char而不是String来存储密码
1.由于字符串是不可变的,如果将密码保存为纯文本,它将在内存中可用,直到垃圾收集器清除它。而且它很有可能存储在字符串池中,会保留很长时间,从而构成安全威胁。 2.如果使用String,总是存在日志文件或控制台打印纯文本的风险,但如果使用array,则不会打印数组的内容而是打印其内存位置。 3.Java本身建议使用JPasswordField类的getPassword()方法,该方法返回一个Char[]和不推荐使用的getText()方法,该方法以明文形式返回密码。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。