JAVA学习记录(十四)—— String 类

字符串创建的方法

String str1 = "Hello world";

String str2 = new String("Hello world");

char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
关于字符串比较相等的问题:
String str1 = "abcde";

String str2 = new String("abcde");
System.out.println(str1 == str2); // false

String str3 = "abc" + "de";
System.out.println(str1 == str3)  // true

String str4 = new String("abc") + new String("de");
System.out.println(str1 == str4)  // false

String str5 = new String("abc") + "de";
System.out.println(str1 == str2)  // false
  • 上述代码中,因为字符串是引用类型,所以字符串之间的比较,比较的是str这个引用所存储的地址。str1的字符串是使用双引号直接定义在字符常量池中的,而str2是在堆中new了一个对象,str2中存放的是这个new的对象的地址,在堆中,所以,比较返回false。剩下的比较中,只要new了新的对象,地址一定不同,所以是false。str1与str3返回true是因为在字符常量池中定义好了以后在工程中是不会被删除的,所以str3再次定义字符串时,会先搜索字符常量池是否有该字符串,有的话会直接将地址给str3。
  • 如果要比较两个字符串的内容是否相等,则使用equals
String str1 = new String("Hello");
System.out.println(str1.equals("Hello")); //或
System.out.println("Hello".equals(str1));

// 但需要注意的是 如果str为空 即:
String str = null;
System.out.println(str.equals("Hello")); // 会报出空指针异常(java.lang.NullPointException)
System.out.println("Hello".equlas(str)) // 正常执行,返回false;

字符串的不可变

String str = "hello";
str = str + "world";
str += "!!!";
System.out.print(str); // 输出为 hello world!!!
  • 上述虽然看起来是str发生了变化,但其实在内存中是str引用

字符,字节与字符串

1、字符与字符串
  • 1、将字符数组中的内容变为字符串public String(char value[])(构造方法)
  • 2、将部分字符数组中的内容变为字符串public String(char value[] int offset, int count)(构造方法)
  • 3、取得指定索引位置的字符,索引从0开始public char charAt(int index)
String str = "hello";
System.out.println(str.charAt(0)); //取0下标位置的字符  输出为h
// 索引值过大会产生 StringIndexOutOfBoundsException异常
  • 4、将字符串变为字符数组返回public char[] toCharArray();
String str = "helloworld";
char[] data = str.toCharArray();
for(int i=0; i<data.length;i++){
    System.out.print(data[i]+" ");
}
// 数组转为字符串
System.out.println(new String(data)); //将数组全部转为字符串
System.out.println(new String(data,5,5)); //从5下标开始往后5个位置,转换为字符串

例:给定一个字符串,判断其是否全部由数字组成

public static boolean isNumber(String str){
    char[] data = str.toCharArray();
    for(int i = 0; i < data.length; i++){
        if(data[i] < '0' || data[i] > '9'){
            return false;
        }
    }
    return true;
}
public static void main(String[] args){
    String str = "1a23456c";
    System.out.println(isNumber(str)? "字符串由数字组成" : "字符串中有非数字成员");
}
2、字节与字符串
  • 1、将字节数组变为字符串public String(byte bytes[])(构造)

  • 2、将部分字节数组中的内容变为字符串public String(byte bytes[] ,int offset, int length)(构造)

  • 3、将字符串以字节数组的形式返回public byte[] getBytes()

  • 4、编码转换处理public byte[] getByets(String charsetName) throws UnsupportedEncodingException

String str = "helloworld";
// String 转byte[]
byte[] data = str.getBytes();
for(int i = 0; i < data.length; i++){
    System.out.print(data[i]+" ");
}
// byte[] 转String
System.out.print(new String(data));

字符串常见操作

1、字符串比较
  • 1、区分大小写的比较public boolean equals(Object anObject)
  • 2、不区分大小写的比较public boolean equalsIgnoreCase(String antherString)
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.euals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
  • 3、比较两个字符串大小关系public int compareTo(String anotherString)
    相等返回0;小于返回小于0的数;大于返回大于0的数
2、字符串查找
  • 1、判断一个子字符串是否存在public boolean contains(CharSequence s)
    JDK1.5之前只能使用indexOf()返回的是子字符串第一个字符的索引位置,没有则返回-1。
String str = "helloworld";
System.out.println(str.contains("world")) // true
  • 2、从开头查找指定字符串的位置,查找到了返回位置的索引,查找不到返回-1public int indexOf(String str)

  • 3、从指定位置开始查找子字符串位置public int indexOf(String str, int fromIndex)

  • 4、由后向前查找字符串位置public int lastIndexOf(String str)

  • 5、从指定位置由后往前查找public int lastIndexOf(String str, int fromIndex)

String str = "helloworld" ; 
System.out.println(str.indexOf("l")); // 2 
System.out.println(str.indexOf("l",5)); // 8 
System.out.println(str.lastIndexOf("l")); // 8
  • 6、判断是否以指定字符串开头public boolean startsWith(String prefix)
  • 7、从指定位置开始判断是否以指定字符串开头public boolean startsWith(String prefix, int toffset)
  • 8、判断是否以指定字符串结尾public boolean endsWith(String suffix)
String str = "**@@helloworld!!" ; 
System.out.println(str.startsWith("**")); // true 
System.out.println(str.startsWith("@@",2)); // ture 
System.out.println(str.endsWith("!!")); // true
3、字符串替换
  • 1、替换所有的指定内容public String replaceAll(String regex, String replacement)
  • 2、替换首个内容public String replaceFirst(String regx String replacement)
    由于字符串是不可变对象,替换不改变当前字符串,而是产生并一个新的字符串
String str = "hello"
System.out.println(str.replaceAll("l", "_")); //替换所有的l
System.out.println(str.replaceFiret("l", "_")); //替换第一个l
4、字符串拆分
  • 1、将字符串全部拆分public String[] split(String regex)
  • 2、将字符串部分拆分,该数组长度就是limit极限(最多有limit个数组)public String[] split(String regex, int limit)
    注意:字符"|","*","+"都得加上转义字符'\'
String str = "hello world give me five";
String[] result = str.split(" ");

String str1 = "192.168.1.1";
String[] result1 = str1.split("\\.");
  • 多次拆分
String str = "name=zhangsan&age=18";
String[] result = str.split("&"); //以&将字符串分为一个数组
                                  // name=zhangsan 是数组0下标
                                  // age=18 是数组1下标
for(int i = 0; i < reslut.length; i++){
    String[] temp = result[i].split("="); //遍历数组,对数组两个元素都以=在分割
    System.out.println(temp[0] + " = " + temp[1]) 
    //依然会打印出name = zhangsan  和 age = 18
    //但此时,name = zhangsan是在一个数组,age = 18是在一个数组
}
5、字符串截取
  • 1、从指定索引截取到结尾public String substring(int beginIndex)
  • 2、截取部分内容public String substring(int beginIndex, int endIndex)
    注意:索引是从0开始;部分截取是前闭后开写法,substring(0,5)包含0好下标,不包含5号下标。
String str = "helloworld" ; 
System.out.println(str.substring(5)); 
System.out.println(str.substring(0, 5));
6、其他常用操作方法
  • 1、去掉字符串中的左右空格,保留中间空格public String trim()
  • 2、字符串转大写public String toUpperCase()
  • 3、字符串转小写public String toLowerCase()
String str = " hello%$$%@#$%world 哈哈哈 " ;
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase()); //汉字和字符不会被大小写转换影响
  • 4、字符串入池操作public native String intern()
  • 5、字符串连接,此操作相当于"+",不会入池public String concat(String str)
  • 6、取得字符串长度public int length()
    数组长度使用的是数组名.length属性,而在String使用的是length()方法
String str = " hello%$$%@#$%world 哈哈哈 " ; 
System.out.println(str.length());
  • 7、判断是否为空字符串,但不是null,而是长度为0public boolean isEmpty()

StringBuffer与StringBuilder

public class Test{ 
    public static void main(String[] args) { 
        StringBuffer sb = new StringBuffer(); 
        sb.append("Hello").append("World"); 
        fun(sb); 
        System.out.println(sb); 
 } 
    public static void fun(StringBuffer temp) { 
    temp.append("\n").append("www.bit.com.cn"); 
    } 
}
  • String的内容无法修改,而StringBuffer的内容可以修改
  • String变为StringBuffer,利用StringBuffer的构造方法或append()方法
  • StringBuffer变String使用toString()方法
  • StringBuffer中一些String类没有的方法
  • 1、字符串反转public synchronized StringBuffer reverse()
StringBuffer sb = new StringBuffer("helloword");
System.out.println(sb.reverse());
  • 2、删除指定范围的数据public synchronized StringBuffer delete(int star, int end)
StringBuffer sb = new StringBuffer("helloword");
System.out.println(sb.delete(5, 10));
  • 3、插入数据public synchronized StringBuffer insert(int offset, 各种数据类型 b)_
StringBuffer sb = new StringBuffer("helloworld");
System.out.println(sb.delete(5, 10).insert(0, "你好"));

Sting、StringBuffer、StringBuilder的区别:

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改
  • StringBuffer与SringBuilder大部分功能相似
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值