关Java JDK中内置的一个类:java. lang. String的介绍
1、String表示字符串类型,属于引用数据类型,不属于基本数据类型。
2、在java 中随便使用双引号括起来的都是String对象。例如: “abc”,“def”, “hello world!” ,这是3个String对象。
3、java 中规定,双引号括起来的字符串,是不可变的,也就是说"abc"自出生到最终死亡,不可变,不能变成"abcd",也
4、在JDK 当中双引号括起来的字符串,例如: “abc” “def” 都是直接存储在“方法区”的“字符串常量池”当中的。
为什么SUN公司把字符串存储在一个“字符串常量池”当中呢。因为字符串在实际的开发中使用太频繁。为了执行效率,
所以把字符串放到了方法区的字符串常量池当中。
对string在内存存储方面的理解:
第一:字符串一旦创建不可变。
第二:双引号括起来的字符串存储在字符串常量池中。
第三:字符串的比较必须使用equals方法。
第四: string已经重写了tostring ()和equals()方法。
String类常用的方法
1.endsWith:判断字符串是否以指定的后缀结束
//判断当前字符串是否以某个字符串结尾 返回ture或者false
System.out.println("test.txt".endsWith(".java"));//false
System.out.println("test.txt".endsWith(".txt"));//true
System.out.println("abcdefg".endsWith("efg"));//true
2.startsWith,判断字符串是否以指定的前缀开始
//判断某个字符串是否以某个子字符串开始
System.out.println("abcdef".startsWith("abc"));//true
System.out.println("abcdef".startsWith("abd"));//false
- equals,字符串相等比较,不忽略大小写
//比较两个字符串必须使用equsl方法,string类的equls方法已经重写好了,所以比较的是内容
//eqlusl方法有没有调用compareTo方法
System.out.println("abc".equals("abc"));//true
- equalsIgnoreCase,字符串相等比较,忽略大小写
//判断两个字符串是否相等忽略大小写
System.out.println("Abc".equalsIgnoreCase("aBC"));//true
- indexOf,取得指定字符在字符串的位置
//判断某个子字符串在当前字符串中第一次出现处的索引(下标)
System.out.println("phpjavaokhuobi".indexOf("java"));//3
- lastIndexOf,返回最后一次字符串出现的位置
System.out.println("abcdefg".lastIndexOf("efg"));//4
- length,取得字符串的长度
//判断字符串长度 用的是length方法 判断数组长度是lenght属性
System.out.println("abcde".length());//5
- replaceAll,替换字符串中指定的内容
//替换字符串
String e = "http://wwww.baidu.com".replace("wwww","xxxx");//http://xxxx.baidu.com
System.out.println(e);
String f = "111".replace("1", "2");//222
System.out.println(f);
- split,根据指定的表达式拆分字符串
//拆分字符串成数组
String[] ym = "abcde-fkglgl-asdas".split("-");
for ( int i = 0 ; i < ym.length ; i++)
System.out.println(ym[i]);
//abcde //fkglgl //asdas
//可以继续向下拆分
- substring,截子串,左边包含 右边不包含
//截取字符串 参数是截取开始下标
System.out.println("www.baidu.com".substring(4));//baidu.com
System.out.println("www.baidu.com".substring(4, 9));//左边包含 右边不包含 baidu
- trim,去前后空格
//去除字符串前后空白
System.out.println(" abc edsada ".trim());//abc
- valueOf,将其他类型转换成字符串
//String 中有一个方法是静态的,不需要new对象;
//将非字符串转化成字符串
String s1 = String.valueOf(100);
System.out.println(s1);//100字符串
- contains,判断前边这个字符串包含不包含后边这个字符串,可以看出是连续的字符串是否包含
//判断前边这个字符串包含不包含后边这个字符串
System.out.println("HelloWorld.java".contains(".java"));//true
System.out.println("www.baidu.com".contains("badu"));//false
15.isEmpty 判断某个字符串是否内容为空
//判断某个字符串是否为空
String s= "";
String d = "1";
System.out.println(s.isEmpty());//true
System.out.println(d.isEmpty());//false
16.toLowerCase() 将大写字符串转换成小写
//将大写字符串转换成小写
System.out.println("ABC".toLowerCase());
17.toCharArray() 把字符串转换成char 数组
//吧字符串转换成char 数组
char [] c = "我是中国人".toCharArray();
for ( int i = 0 ; i < c.length ; i ++)
System.out.println(c[i]);
StringBuffer和StringBulider
StringBuffer称StringBuilder的区别?
StringBuffer中的方法都有: synchronized关键字修饰。StringBuffer在多线程环境下运行是安全的。
StringBuilder中的方法都没有: synchronized关键字修饰,表StringBuilder在多线程环境下运行是不安全的。
如何优化StringBuffer的性能?
在创建StringBuffer的时候尽可能给定-个初始化容量。
最好减少底层数组的扩容次数。预估计一下,给一个大一些初始化容量。
思考:我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题?
因为java中的字符串是不可变的,每- -次拼接都会产生新 字符串。
这样会占用大量的方法区内存。造成内存空间的浪费。
String s = “abc”;
s += “hello”;
就以_上两行代码,就导致在方法区字符串常量池当中创建了3个对象:
“abc” .
“hello”
“abchello”
StringBuffer是字符串缓冲区,是一个容器。
特点:
1,长度是可变化的。
2,可以字节操作多个数据类型。
3,最终会通过toString方法变成字符串。
常用方法
StringBuffer() 构造一个字符串缓冲区,其中没有字符,初始容量为16个字符。
append 添加boolean,String,Int 等等…参数的字符串表示形式追加到序列中。
substring(int start, int end) 返回一个新的 String ,其中包含当前包含在此序列中的字符的子序列。
Insert 向字符串中插入各种类型的数据
等可以参考帮助文档
相关面试试题
下面总共几个对象
String s1 = new String( original: “he11o”);
String s2 = new String( original: “hel11o”);
一共3个对象:
方法区字符串常量池中有1个: “hello”
堆内存当中有两个String对象。一共3个。
字符串不可变是什么意思?
是说双引号里面的字符串对象一且 创建不可变。
String s = “abc”;
s变量是可以指向其它对象的。字
符串不可变不是说以上变量s不可变。说的是"abc ”这个对象不可变
S = “xyz”;
判断数组长度和判断字符串长度不一样
判断数组长度是Length属性,判断字符串长度是length()方法。.
System. out . println(“abc” .1ength()); // 3