String:
str.length()、str.indexOf()、str.lastIndexOf()、
str.substring()、str.trim()、startsWith()、endsWith()、
str.toUpperCase()、toLowerCase()
String.valueOf(其他类型)
StringBuilder:
builder.toString()、append()、
insert()、delete()、replace()、reverse()、
--------------------------------淫荡分隔---------------------------------------
字符串基本操作
String及其常见API
1. String是不可变对象
由于字符串在实际开发中被广泛使用,那么在频繁使用某个字符串时,会出现频繁创建一个字符串对象的现象,java为此对字符串的使用采用了一个优化措施,使得Stirng对象为不可变对象,一旦在内存中创建,内容不能发生变化,若要对字符串内容改变,那么就会创建新对象。这样做的目的是可以最大程度的重用相同内容的字符串以减小系统资源的开销。
字符串是引用类型 基本都是对象
java.lang string使用了final修饰 不能修改
一旦改变内容就会创建新对象
字符串被你引用可以重新赋值
2. String常量池
JVM对字符串有一个限制,让字符串作为不变对象,这样就可以做到重用。事实上,当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。因为字符串内容不能改变,所以我们可以放心的重用他们。
字符串是不可变对象
java 只对直接量 (字面量 ) 或者常量 进行缓存
1 2 public class TestStringDemo1 { 3 /** 4 * 测试常量池 5 */ 6 public static void main (String[] args){ 7 String str1 = "Hello"; 8 String str2 = "Hello"; 9 String str3 = new String("hello"); 10 System.out.println(str1==str2); 11 System.out.println(str1==str3); 12 13 } 14 }
双等于问题
引用类型比较
用于判断是否为同一个对象 原因:比的是地址
equals 用于判断对象内容是否相同
3. 内存编码及长度
java存储每一个字符均使用2个字节保存,使用的是Unicode编码。并且任何一个字符(无论是英文还是汉字)每个字符的长度都是1。所以字符串的长度就是该字符串所有的字符个数。
一般中文两个字节 英文一个字节
String 在内存中采用unicode编码 每一个字符都占有两个字节 不管中文英文 还是标点
str.length()
str.indexOf("can") 字符串第一次出现的位置
重载
str4.indexOf("can",6); 从第六个开始查找
str.lastIndexOf() 字符串最后出现的位置
substring 切割字符串
javaAPI中有个小特点 凡是使用2个数字表示范围 通常都是 含头不含尾 的
str.substring(11, 17);
也可这么写
str.substring(str.indexOf(".")+1, str.lastindexOf('.'));
str.substring(11); 从指定位置开始到末尾
嵌套截取 到点 .
String str = "myhh.jpg"; String sub = str.substring(0, str.indexOf('.')); System.out.println(sub);
String userName = " good man ";
/** * String trim() *去除字符串两侧的空白 */ System.out.println(userName.trim()); String str6 = "Thinking in java"; /** * boolean startsWith(sting str) * 判断字符串是否以给定字符串开头的 * boolean endsWith(string str) */ System.out.println(str6.endsWith("java")); }
aaa.doc
判断文件类型
/** * Sting toUpperCase() * Sting toLowerCase() * 将字符串中英文部分转换为小写 */ String str7= "我喜欢java"; System.out.println( str7.toUpperCase()); 在忽略大小写检查的时候用 /** * 将其他类型转换为字符串 * Sting有若干的重载方法 valueOf(其他类型数据) * */ double pi =3.1415926; boolean flag =true; int value =123; char[] charArr={'a','b','c','d','e','f'}; String str8 =pi+""; // 第一种方式:数字+ str =字符串 String str9 =flag+""; //这个时候的true就是字符串了 //第二种 valueOf System.out.println(String.valueOf(pi)); }
StringBuilder及其常用API
1. StringBuilder封装可变字符串
String类我们已经得知,它是不变对象,那么每当对内容修改时都会引发新对象的创建。那么当我们有一个需求是需要频繁修改字符串时,这样不仅不能减少内存的开销,返回会增加内存的开销。为此java为我们提供了一个专门用于修改字符串内容的类:StringBuilder.
该类封装了可变的字符串,换句话说,当我们需要改变字符串内容时,并不会创建新对象,而是在原对象基础上进行修改。从而减小了内存的开销。
当对字符串频繁修改的时候 使用 StringBuilder 类
StringBuffer 线程安全
StringBuilder 两者内容一样 作用一样
/** * 用于频繁修改字符串使用的类 */ //使用无参构造方法创建出来的是空字符串 StringBuilder builder = new StringBuilder(); builder = new StringBuilder("Programing Language:"); /** * * StingBuilder 不是字符串 * 只是用于在做频繁修改字符串的时使用的类,可以节省不必要的内存开销 * 想将StringBuilder所表示的内容转化为字符串 * 可以调用它的toString()方法 */ /* * 向字符串末尾追加新字符串 相当于字符串的+操作 * StringBuilder.append(String str) 返回值依然是 StringBuilder * Programing Language:java */ builder.append("java").append(",php"); //str+"java" append 里面不管什么基本类型都转换为字符串 || 返回给自身 所有可以连着写 String str10 = builder.toString(); System.out.println(str10);
/** * 希望变成字符串 * 插入PHP * StringBuilder insert(int index,String str) * */ StringBuilder builder1 = new StringBuilder("javacppc#objective-c"); builder1.insert(9, "php"); System.out.println( builder1.toString()); }
/** *测试删除字符串的部分内容 * 删除java * StringBuilder delete(int from ,int end) * 含头不含尾 */ StringBuilder builder1 = new StringBuilder("javacppc#objective-c"); builder1.delete(9, 11); System.out.println( builder1.toString());
/** *允许将部分内容替换 * * StringBuilder replace(int from ,int end,String str) * 含头不含尾 */ StringBuilder builder1 = new StringBuilder("javacppc#objective-c"); builder1.replace(9, 11,"ab"); System.out.println( builder1.toString());
/** * 翻转字符串 * StringBuilder reverse() */ StringBuilder builder1 = new StringBuilder("上海自来水来自海上"); builder1.reverse(); System.out.println( builder1.toString()); }