目录
创建String的四种方法: |
方法3只产生一个字符串对象,str不入池,他是new出来的,只在堆中,值为data。
字面量 |
10---整形字面量 10.1--double字面量 true---boolean 字面量 “ 硕大的萨顶顶2231”----字符串字面量 就是一个字符串的对象 String是引用数据类型: 字面量即使对象也是字面量。 |
字面量入池,字符数组不是字面量。 |
字符串比较值是不是相等用equals方法 |
System.out.println(str1.equals(str));System.out.println(str1.equalsIgnoreCase(str1));这个是不区分大小写的比较
要比较字面量一定不为空时用前置的方式 |
关于字符串的常量池问题 |
有new就有新空间,三行代码产生四个字符串对象,一个在常量池三个在堆中。 |
何为“池”? |
池乃放一些要打印的东西,避开内存浪费,池里面搞得像是一个批发商,店里只有一个样品,你喜欢他会给你订货。所以同样的内容,池里面一定有且只有一个。 |
intern()方法 |
字符串的不可变性 |
package string_test;
public class String_Change {
public static void main(String[] args) {
String str="hello";
str=str+"world";
str=str+"!!!";
System.out.println(str);
}
}
过程:栈中的str先指向常量池中的“hello”,然后常量池中继hello之后右产生了一个“world”,之后hello和world拼接成helloword,str不再指向hello,转而指向helloworld;重复上述步骤,str指向helloworld!!!;
为何字符串的对象无法修改内容而其他类的对象能修改类的内容? |
字符串其实是一个字符数组-->char[],字符串保存的值实际上在数组中保存。
看一下String的 源码: 这个value储存在char 数组中。
解释:String的“hello”这个对象内部其实有一个value数组,这个value数组是“h”,“e”,“l”,"l"."o",为啥这个hello在外部改不了,因为value数组是private修饰,而且String类没有向外部提供Getter和Setter,外部根本就不可见。
如何修改字符串内容? |
1.在运行时通过反射破坏value的数组封装 (反射没学之前不推荐,了解一下得了,反射是所有框架的基础) |
Hello |
2.更换使用StringBuilder或者StringBuffer类(这两个类已经不属于String类了) |
StringBuilder类和String是不同的两个类,StringBuilder类的产生就是为了字符串的拼接,一定程度上补偿了String类无法修改的问题。 若碰到需要频繁的拼接字符串的情况,可以使用StringBuilder的append方法: StringBuilder只会产生一个对象,他里面的值在不断变化着l。 helloworld!!! |
StringBuilder类和String类的相互转换 |
任何的字符串常量都是String 对象,而且String 的常量一旦声明不可改变,如果改变对象内容,改变的是其引用的指向而已。
通常来讲String和StringBuilder 大部分功能是相同的。
在String中使用“+”来进行字符串链接,但是这个操作在StringBuffer类中需要更改为appen()方法:
public synchronized StringBuffer append(各种数类型)
把String类变成StringBuilder操作: |
1.通过构造方法把字符串的字面量变成StringBuilder的对象: 2.通过append |
把StringBuilder还原为String类的操作: |
|
StringBuilder类的其他操作 |
字符串的比较 |
字符串的比较-equals (区分大小写)和eaualsIgnoreCase(不区分大小写) |
字符串的比较--compareTo方法 |
CompareTo是根据字符串的ASC||差值比较 |
字符和字符串的相互转换。 |
字符串的内部是使用字符数组来存储的。
如何把一个字符char[]转为字符串String? |
构造方法 |
将字符数组的部分内容转换为字符串对象 |
String转换为char |
1.取出字符串中指定索引的字符 |
2.将字符串中的内容转换为字符数组返回 |
//此时产生了一个新的字符数组,将字符串的内容 复制过去 //记住铭哥说的:String对象不可变,内容变不了。
如何判断一个字符串的对象是有纯数字构成的呢? |
package string_test;
import org.omg.CORBA.StringHolder;
public class string_Test {
public static void main(String[] args) {
String str="123";
String str1="12a3";
System.out.println(isNumber(str));
System.out.println(isNumber(str1));
}
/**
* 传入一个String对象,判断是否由纯数字构成
* @param str
* @return
*/
public static boolean isNumber(String str){
//先把字符串转变为字符数组,用to,CharArray()
char [] data =str.toCharArray();
// 循环遍历data中所有的字符,判断这个字符是否是数字字符
// 如何判断是否是数字字符是关键。就用ASC||
for (char c :data) {
// 找到反例了!字符型的0和9
if (c< '0'||c>'9'){
// 此时字符'c'不是数字字符
return false;
}
}
return true;
}
}
true
false
铭哥语录:在处理一个逻辑让你返回TRUE OR FALSE 时
我们的思想是在循环中找反例,有一个反例就return FALSE。
对,反向思考问题。只要你能想到的方法,java中一定都帮你实现了!!!
look:char 的包装类, isDigit是不是数字
铭哥语录:字符串和数组之间的转换很重要,咱们碰到的大部分问题都需要转换为字符型数组来处理。
字符串和字节的相互转换 |
1.字节转字符串 按照ASC||来转的哦哦!
|
2.String 转byte[] 和字符不同,我们字符串不能转换为单个的字节,只能转成一个字节数组。 |
铭哥语录:牵扯到网络传输和文件存储就一定牵扯到字节,将文件保存到文件中,或是通过网络传输就会用到字节数组,比如我在QQ聊天框打入“显平”两个字,对方可以收到说明, 经历两String to byte 又从byte to String 的过程。
字符串的查找 |
1.判断一个子字符串是否存在contains |
2.从头位置开始查找指定字符串的位置,查到了返回未知的开始索引,如果查不到返回-1; (indexOf 是JDK1.5之后追加的) |
3.从指定位置开始查 |
4.从后向前查 |
5.从后向前的某索引位置开始找 |
6.判断是不是以指定字符开头的 |
7.从指定位置开始判断是不是以指定字符开头的 |
8.判断是否以字符串结尾 |
字符串的替换 |
1. ·替换 所有的指定内容,有几个替换几个。 ·replaceAll方法
|
2.替换一次 铭哥语录:针对字符串的所有操作方法都不会修改原字符串,而是产生了一个新的字符串。字符串不可变。 |
字符串的拆分
可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
|
split(),若字符串中没有指定拆分的子串,拆分后任然的到原数组。
拆分IP地址 得到一个空数组,如果发现没拆成,说明这个格式是一个转义字符,要特殊处理,或者这个格式在字符串中不存在; 比如我么的这个“.”就是一个引用操作符,我们需要对他转义处理, |
字符串截取从一个完整的 字符串中截取出部分内容 |
java中的字符串的其他操作 |
str == null表示 str 没有指向任何对象,就是没有对应堆中对象
str.length() == 0表示 str 指向一个字符串对象,但是这个字符串长度为0
/**
* ·java中没有提供首字母大写操作,需要自己实现
*/
public class byteToStr {
public static void main(String[] args) {
System.out.println(fistUpper("hello"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str){
if (str==null||"".equals(str)){
return str;
}
if (str.length()>1){
//substring:字符串的截取操作,toUpperCase()转大写,接上后边的部分
return str.substring(0,1).toUpperCase()+str.substring(1);
}
return str.toUpperCase();
}
}
package string_test;
/**
* ·StringBuffer的内容可以修改.
*/
import java.util.Locale;
/**
* ·java中没有提供首字母大写操作,需要自己实现
* @必须掌握
*/
public class StringBuffer {
public static void main(String[] args) {
System.out.println(fistUpper("hello"));
System.out.println(fistUpper(""));
System.out.println(fistUpper("a"));
}
public static String fistUpper(String str){
//判空
if (str==null||str.isEmpty()){
return null;
}
//边界
if (str.length()==1) {
return str.toUpperCase(Locale.ROOT);
}
//substring:字符串的截取操作,toUpperCase()转大写,接上后边的部分
return str.substring(0,1).toUpperCase()+str.substring(1);
}
}
Hello
null
A
|