文章目录
参数传递
基本数据类型:值传递
引用数据类型:引用本身无法被改变,而引用指向的对象内容可以被改变
如:
public void change(Studen s)
{
s.setName("张三");//允许
s = new Student("李四","男");//试图改变引用本身,不允许
String
在java.lang包中,且为final类,即不可以被拓展,没有子类。
1.String常量也是对象,用双引号括起来的字符序列,Java把用户程序中的String常量放入常量池。常量池中的数据在程序运行期间不允许被改变。凡new构造出的对象都不在常量池中。
Java中的引用有点像c++中的指针,通过引用可以对堆中的对象进行操作。在java程序中,最常见的引用类型是强引用,当使用new创建一个新对象并将其赋值给一个变量的时候,这个变量就成为指向该对象的一个强引用
如:String s = new String(“hi”)
String t = new String(“hi”)
二者的实体虽然相同,但二者的引用不同,即s==t的值是false.(使用new后,每次都要开辟新天地)
另外,用户无法输出String对象的引用:
输入System.out.printIn(s)
结果:
String类有两个常用构造方法:
(1)char a[]={‘j’,‘a’,‘v’,‘a’};
String s = new String(a);
用一个字符数组创建一个String对象
(2)String(char a[],int start,int count)
提取字符数组a中的一部分创建一个String对象
引用String常量
可以把String常量的引用赋给一个String对象,例如:
String s1,s2;
s1=“你好”;
s2=“你好”;
s1==s2返回true. s1,s2具有相同的引用。
"String testOne=“你”+“好”;“的赋值号的右边是两个常量进行并置运算,因此结果是常量池中的常量"你好”(常量优化技术:
常量折叠是一种Java编译器使用的优化技术,Java,Sti0《testOne=“你”+“好,被编译器优化为
Stxing testOne=“你好”,就像intx=1+2被优化为ntx=3样),所以,表达式"你好”
testOne和表达式 hello=testOne的值都是true。对象 testOn中存放着引用12AB, testOne的实体中存放着字符序列"你好":
"testTwo=you+hi;“的赋值号的
右边有变量,例如变量you参与了并置运算,那么you+hi相当于"new String(你好);”,因此结果在动态区诞生新对象, testTwo存放着引用BCD5, test Two的实体中存放着字符序列“你
好”,所以表达式hello==testTwo的结果是 false
如图:
String类的常用方法
1.valueOf() //将其他数据类型转化为字符串对象,参数可以是除byte以外的任何数据类型。
2.charAt(int index);//指定参数位置的字符
3.boolean startsWith(String str,inr offset) //判断调用字符串在位置offset处开始是否以子串str开头
boolean endsWith(String str) 是否以str结尾
4.int indexOf()和int lastIndexOf():返回调用字符串对象中指定的字符或者子串首次出现的位置/最后一次出现的位置,未找到返回-1
如int indexOf(int ch) (有多个重载函数)
5.取子串方法:substring()
String substring(int beginIndex)
String substring(int beginIndex,int endIndex)
6.boolean equals(Object anotherObject):字符串相等性比较(区分大小写)
boolean equalsIgnore(String string)字符串相等性比较(不区分大小写)
int conpareTo(String string);//字符串大小比较(区分大小写)
int conpareToIgnore(String string);//字符串大小比较(不区分大小写)
7.String concat(String str);//将str连接到后面
8.replace()替换
String s = "abcc";
//将s中的c用a替换
System.out.println( s.replace('c','a'));
String s = "abcc";
//将s中的c用a替换
s.replace('c','a');
System.out.println(s);//输出的还是原来的abcc
9.String trim()去掉前后空白
strip();去掉首位空格isBlank();//判断是否字符串空白
10.boolean contain(String s)
是否包含参数s的字符序列
StringBuffer和StringBuilder
Java提供了两个可变字符串类StringBuffer和StringBuilder,中文翻译为“字符串缓冲区”。
StringBuffer是线程安全的,它的方法是支持线程同步,线程同步会操作串行顺序执行,在单线程环境下会影响效率。StringBuilder是StringBuffer单线程版本,Java 5之后发布的,它不是线程安全的,但它的执行效率很高。
StringBuilder的中构造方法有4个:
StringBuilder():创建字符串内容是空的StringBuilder对象,初始容量默认为16个字符。
StringBuilder(CharSequence seq):指定CharSequence字符串创建StringBuilder对象。CharSequence接口类型,它的实现类有:String、StringBuffer和StringBuilder等,所以参数seq可以是String、StringBuffer和StringBuilder等类型。
StringBuilder(int capacity):创建字符串内容是空的StringBuilder对象,初始容量由参数capacity指定的。
StringBuilder(String str):指定String字符串创建StringBuilder对象。
StringBuilder中实现插入、删除和替换等操作的常用方法说明如下:
- StringBuilder insert(int offset, String str):在字符串缓冲区中索引为offset的字符位置之前插入str,insert有很多重载方法,可以插入任何类型数据。
2 .StringBuffer delete(int start, int end):在字符串缓冲区中删除子字符串,要删除的子字符串从指定索引start开始直到索引end - 1处的字符。start和end两个参数与substring(int beginIndex, int endIndex)方法中的两个参数含义一样。
3.StringBuffer replace(int start, int end, String str)字符串缓冲区中用str替换子字符串,子字符串从指定索引start开始直到索引end - 1处的字符。start和end同delete(int start, int end)方法。
以上介绍的方法虽然是StringBuilder方法,但StringBuffer也完全一样
StringTokenizer
和 split()方法不同的是,StringTokenizer 对象不使用正则表达式作分隔标记。有时需要分析 String 对象的字符序列并将字符序列分解成可被独立使用的单词,这些单词叫作语言符号。例如,对"You are welcome",如果把空格作为分隔标记,那么“ You are welcome”就有三个单词(语言符号);而对于“ You,are,welcome",如果把逗号作为分隔标记,那么“ You,are,welcome”有三个单词。
当分析—个 String 对象的字符序列并将字符序列分解成可被独立使用的单词时,可以使用 java.util 包中的 StringTokenizer 类,该类有两个常用的构造方法。
• StringTokenizer(String s):为 Strin g 对象s 构造一个分析器。使用默认的分隔标记,即空格符、换行符、回车符、Tab 符、进纸符做分隔标记。
• StringTokenizer(String s, String delim):为 String 对象s 构造一个分析器。参数 delim 的字符序列中的字符的任意排列被作为分隔标记。
例如:
StringTokeni zerStringTokenizer fenxi = new StringTokenizer
(" you#*are welcome " ) ;
称—个StringTokenizer 对象为—个字符串分析器。一个分析器可以使用nextToken()方法逐个获取 String 对象的字符序列中的语言符号(单词)。每当调用 nextToken(时,都将在 String对象的字符序列中获得下一个语言符号。每当获取到一个语言符号,字符串分析器中负责计数的变量的值就自动减 1, 该计数变量的初始值等于字符串中的单词数目。
通常用 while 循环来逐个获取语言符号,