JAVA——字符串String
来源:互联网 发布:日本对中国文化知乎 编辑:程序博客网 时间:2024/06/10 23:10
【1】Stirng
- 要明确String不属于JAVA中的八大基本数据类型中的一种,而是一个特殊的类,而且创建的String对象是不可变的。通过查看JDK文档会发现几乎每一个修改String对象的操作,实际上都是创建了一个全新的String对象。
由于字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。
在java中,一个对象变量并没有实际包含一个对象,而是仅仅引用一个对象。任何对象变量的值都是对存储在另外一个地方的一个对象的引用。
- new操作符的返回值也是一个引用。如
Date deadline = new Date();
有两个部分。表达式new Date()创建了一个Date类型的实例对象,这个实例对象存储在对内存中的,并且它的返回值是对新创建对象的引用(从C语言讲,这个值就是Date类型的实例对象所在对内存的首地址[个人观点]),这个引用存储在变量deadline中(变量deadline存在占内存中)。 String类没有提供用于修改字符串本身的方法。
null,new String(),“ ”这三者的区别:
(1)java中,每个用双引号括起来的字符串都是String类的一个实例。
String str1 = "";string str2 = "hello";
(2)空串""
是长度为0的字符串,如String实例对象str1。空串是一个java对象,有自己的长度(0)和内容(空)。有时候检查字符串是否为空:
if(str.length() == 0){}或if(str.equals("")){}
(3)String变量还可以存放一个特殊的值,就是null。即在初始化字符串对象之前,它的值为null。
String str3 = null;
此处显示的将对象的变量值设置为null,表明这个对象变量目前没有引用任何对象,即这个变量里没有储存任何对象的首地址。
不能在一个null值上调用方法:
birthday = null;String s = birthday.toString();//runtime error!
要检查一个字符串是否为空,要使用一下条件:
if (str == null){}
有时候要检查一个字符串既不是null也不是空串,这时就要使用以下条件:
if (str!=null && str.length()!=0){}
【2】字符串创建过程
【2-1】创建字符串对象的几种方法:
(1)通过字面量的形式:String str = “abc”;
(2)通过new方式:String str = new String(“abc”);
(3)字面量+字面量:String str = “aa” + “bb”;
(4)变量+字面量:String str1 = “aa”; String str2 = str1 + “bb”;
【2-2】关于创建String对象过程的内存分配
http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
http://blog.csdn.net/xiabing082/article/details/49759071
【3】字符串常量池(String Constant Pool)
字符串在java程序中被大量使用,为了避免每次都创建相同的字符串对象及内存分配,JVM内部对字符串对象的创建做了一定的优化,在Permanent Generation中专门有一块区域用来存储字符串常量池(一组指针指向Heap中的String对象的内存地址)。
每当创建一个字符串对象时,首先就会检查字符串池中是否存在面值相等的字符串,如果有,则不再创建,直接放回字符串池中对该对象的引用,若没有则创建然后放入到字符串池中并且返回新建对象的引用。这个机制是非常有用的,因为可以提高效率,减少了内存空间的占用。所以在使用字符串的过程中,推荐使用直接赋值(即String s=”aa”),除非有必要才会新建一个String对象(即String s = new String(”aa”))。
JVM内部细节之三:字符串及字符串常量池
java中的String类常量池详解
- java字符串池和字符串堆内存分配
【4】不可变String对象
所属包:java.lang.String; 注意:字符串中的单个字符的索引和数组元素的索引类似,都是从0开始。
String对象是不可以被改变的。查看jdk文档,可以发现,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String类对象,以包含修改后的字符串内容。而最初的String对象则丝毫不动。
-子串:String类的substring()方法可以从一个较大的字符串提取一个子串。查看API文档,String类:
方法substring()支持重载,对于方法substring(int beginIndex),beginIndex表示从原字符串从索引第beginIndex开始,一直取到原字符串结束提取子串(包括第beginIndex个字符)。
String str = "hello";String substr = str.substring(3);//变量substr所引用的字符串对象是:lo
- 对于方法substring(int beginIndex, int endInedx),表示该方法截取从beginIndex到endIndex-1之间的字符串(包括第beginIndex个字符,包括第endIndex-1个字符)。
String str = "hello";String substr = str.substring(1,3);//变量substr所引用的字符串对象是:el
- 在前面提到,String类没有提供用于修改字符串本身的方法。字符串”hello”永远包含字符h,e,l,l,o的代码单元序列,不能修改其中的任何一个字符。
- 如果想把str指向的内容修改为”help!”,就不能直接将str的最后两个位置的字符修改为‘p’和‘!’。因为,String对象是不可修改的。
String str = "hello";String substr = str.substring(0,3) + "p!";//变量substr所引用的字符串对象是:help!
String str = "hello";String STR = upcase(str);//print(str)时,打印出hello//print(STR)时,打印出HELLO
当把str传给upcase()方法时,实际传递的是引用的一个拷贝。其实,每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在原来的物理位置上,一直没被动过。
对于一个方法而言,参数是为该方法提供信息的,而不是想让该方法改变自己的。
【4-1】为什么说Java的String对象是不可变的?
https://www.zhihu.com/question/20618891
http://blog.csdn.net/zhangjg_blog/article/details/18319521
【5】字符串的使用
【5-1】字符串比较
boolean equals(Object other)
—–【String 中的equals方法】Compares this string to the specified object.
用于比较两个引用变量所指向的对象的内容是否相等(并不会比较连个引用变量相等),如果相等,返回ture。boolean equalsIgnoreCase(Stirng other)
—–Compares this String to another String, ignoring case considerations.
如果字符串与other相等(忽略大小写),返回ture。int compareTo(String other)
—–按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。Compares two strings lexicographically.
int compareToignoreCase(String other)
—–比较方式与compareTo()一样,只是忽略大小写。Compares two strings lexicographically, ignoring case differences.
更详细的equals方法,见 java提高篇(十二)—–equals()
【5-2】字符串查找
- int indexOf(String str)
—–返回与字符串str匹配的第一个子串的第一次出现的索引。这个位置从索引0开始计算。如果在原始中不存在str,返回-1。 - int indexOf(Stirng str, int fromIndex)
—返回与字符串str匹配的第一个子串的第一次出现的索引。这个位置从索引formIndex开始计算。如果在原始中不存在str,返回-1。 - int indexOf(int ch)
—–返回指定字符在字符串中第一次出现处的索引,这个位置从索引0开始计算。如果此字符串中没有这样的字符,则返回 -1。 - int indexOf(int ch, int fromIndex)
—–返回指定字符在字符串中第一次出现处的索引,这个位置从索引formIndex开始计算。如果在原始中不存在str,返回-1。
package he.qiang;import java.lang.String;public class StringTest { public static void main(String[] args) { String str = "helloawllo"; System.out.println(str.indexOf("llo")); System.out.println(str.indexOf("llo",3)); System.out.println(str.indexOf('l')); System.out.println(str.indexOf('l',3)); }}
- int lastIndexOf(String str)
- int lastIndexOf(String str, int fromIndex)
- int lastIndexOf(int ch)
- int lastIndexOf(int ch, int fromIndex)
—–返回与字符串str或指定字符匹配的最后一个子串的开始位置。这个位置从原始串尾端开始计算。
—–fromIndex表示截取原字符串的前fromIndex个字符作为子字符串,再从这个子串里查找子串。
package he.qiang;import java.lang.String;public class StringTest { public static void main(String[] args) { String str = "llohelloawlloasd"; System.out.println(str.lastIndexOf("llo")); System.out.println(str.lastIndexOf("llo",7)); System.out.println(str.lastIndexOf('l')); System.out.println(str.lastIndexOf('l',3)); }}
【5-3】字符串判别
- boolean startsWith(String prefix)
—–如果字符串以prefix字符串开始,返回true。 - boolean endsWith(String suffix)
—–如果字符串以suffix字符串结尾,返回true。 - int length()
—–返回字符串的长度。
【5-4】字符串截取与替换—–>返回一个新的字符串
String replace(CharSequence oldString, CharSequence newString)
—–返回一个新的字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。String replace(char oldChar,char newChar)
—–返回一个新的字符串,将原String对象中的字符oldChar替换成新的newChar后生成一个新的字符串。String replaceAll(String regex,String replacement)
—–用正则表达式实现对字符串的匹配。注意replaceAll第一个参数为正则表达式。String substring(int beginIndex)
String substring(int beginIndex, int endIndex)
—–返回一个新的字符串,这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所有字符。String toLowerCase()
—–返回一个新的字符串。这个字符串将原始字符串中的所有大写字母改成了小写字母。String toUpperCase()
—–返回一个新的字符串。这个字符串将原始字符串中的所有小写字母改成了写写字母。String trim()
—–返回一个新的字符串,这个字符串将删除了原始字符串头部和尾部的空格。然而,不能删除字符串中间的空格。
- JAVA——字符串String
- Java — String(字符串)
- Java——关于String(字符串)
- Java初阶——字符串String
- Java基础-数组——String字符串
- Java基础——字符串类String
- Java语言基础——字符串String
- Java学习——字符串String
- Java代码优化(1)—String字符串
- Java基础(极客)——14、Java String字符串详解
- python—字符串string
- Java.lang包——字符串类(String, StringBuffer)
- 黑马程序员java学习日记——字符串String
- 黑马程序员——学习日记13 java字符串String
- Java探索之旅(13)——字符串类String
- 黑马程序员——Java基础-> String字符串
- JAVA笔记系列:字符串操作——string stringbuilder stringbuffer
- Java中的字符串缓冲池——String pool
- Android四大组件之BroadcastReceiver的使用
- Codeforces Round #409 div2 C
- .net的TreeView控件绑定数据库表建立树架构
- Centos7.2安装详解
- 在MYSQL上添加TokuDB引擎
- JAVA——字符串String
- 利用canvas,把多张图合并成一张图片
- 【BZOJ 1406】【AHOI 2007】密码箱
- 线性规划
- vSphere 6.5新功能
- 机器学习:金融领域的岗位需求
- JVM调优浅谈
- System里getProperty 方法获得系统参数
- Python 简单爬虫--获得网上的图片