学习String类源码的感悟-创新互联
前两天看了一下String类的源码,大致的了解了它的一些方法,以及通过一些题目初步知晓的该如何运用这些方法。
成都创新互联公司主要从事网站建设、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务奇台,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220特性----不可变final关键字final是Java中的保留关键字,可以用来修饰类,方法和变量。
被final修饰的类不能被继承;
被final修饰方法不能被重写;
被final修饰的属性、变量初始化之后不能被修改。
不可变的原因首先,String类是以final关键字修饰的,这就表示了他的不可变,但是仅靠一个final不能保证String是不可变的,因为当final修饰的变量表示引用时,该变量的内容是可以被改变的,所以String里的属性都被private修饰,表示这些属性不可被除String以外的类调用,这也就保证了String类不可变
String s = "333";
s.substring(1,2); //栈里生成了一个指向堆中"3"的对象
s.replace("3","1"); //栈里生成了一个指向堆中"111"的对象
不可变的好处
字符串常量池在了解String类是不可变的过程中了解得到了字符串常量池,字符串常量池是Java为String开辟的一块内存缓冲区,为了提高性能同时减少内存开销。 在String类中有个hashCode()方法,当字符串没有设置hash值的时候,String才需要用该方法设置对象的hash值,也在一定程度上说明了字符串常量池的存在。
线程安全当String类是不可变时,也就保证了使用String类是多线程安全的。
换句话说,也只有字符串是不可变的才能实现字符串常量池。如果字符串是可变的,当有多个变量指向同一个字符串时,一旦其中一个变量将其改变,其他的几个变量也就跟着改变,就会变得线程不安全。
当然,也有说可以不同的变量指向的字符串内容相同,但是字符串地址不同,这样一来不就不会出现这里说的线程不安全。这样说也对,但是这样一来,当数据过于庞大时,Java就需要用更大的内存去存放很多相同的东西,过于浪费空间,这也是字符串常量池出现的原因之一。
方法首先是一些String重载的构造函数,可以构造存储String类型、char[]类型、byte[]类型、String Builder类型、StringBuffer类型的String对象。
一些常用的String方法
方法 | 参数 | 作用 |
---|---|---|
length() | null | 获取长度 |
charAt() | int index | 获取index位置上的字符 |
codePointAt() | int index | 获取index位置上字符的码点 codePointBefore()返回前一个索引的码点 |
getChars() | char dst[], int dstBegin | 将字符串中的字符从dstBegin开始复制到dst[]中 |
getBytes() | String charsetName | 返回字符串charsetName中字符的内码数组 |
equals() | Object anObject | 比较两个对象的内容是否相等 equalsIgnoreCase()是忽略大小写的比较 |
compareTo() | String anotherString | 按字典顺序比较两个字符串 |
regoinMatches() | int toffset, String other int ooffser, int len | 测试两个字符串的某段区域是否相等 |
startsWith() | String perfix, int toffset | 从toffset开始,判断字符串是否有以perfix为前缀 endsWith(),判断字符串是否有以suffix为后缀 |
indexOf() | int;String;char[] | 返回指定字符第一次出现的索引 lastIndexOf(),从后向前查找,返回指定字符第一次出现的索引 |
subString() | int beginIndex, int endIndex | 获取字符串从beginIndex到endIndex索引的字符串(左闭右开),无endIndex参数时,表示从beginIndex一直到字符串结尾 |
concat() | String str | 将str连接到字符串的末尾 |
replace() | char oldChar, char newChar;String | 将指定old字符或字符串用new字符或字符串替代 |
split() | String regex, int limit | 以regex为分隔符分隔字符串并存入String[]中,limit是限制产生多少个元素,不声明时默认为0,表示没有限制 |
join() | CharSequence delimiter, CharSequence…elements | 将elements用delimiter连接起来 |
toLowerCase() toUpperCase() | Locale locale/null | 转换字符串的大小写 |
trim() | null | 去除字符串前后的空格 |
matches() | String regex | 正则匹配 |
toString() | null | 返回字符串本身(前提是该对象是字符串) |
toCharArrary() | null | 返回字符串的字符数组 |
format() | Local l/null, String format, Object…args | 返回格式化后的字符串 |
valueOf() | boolen;char;int;long;float;double | 将指定类型转换成字符串 |
Object obj | 将对象转换成字符串 | |
char[] data;char[] data, int offset, int count | 将字符数组转换成字符串;将字符数组从offset开始的count个元素转换成字符串 |
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
文章名称:学习String类源码的感悟-创新互联
文章网址:http://scyanting.com/article/jhchg.html