学习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://ybzwz.com/article/jhchg.html