/**
* Java 语言中最常见描述字符串的对象
* 字符串数据都是一个对象
* 字符串数据一旦初始化就不可以被改变了,双引号表示的都是字符串常量
* 字符串对象都存储常量池中 字符串常量池
* String 类不能有子类 不能被继承
*/
public class StringDemo { public static void main(String args[]) { String s = "abcd"; //常量池 //s ="haha"; //指向变了 而不是字符串改变 String s1 ="abcd"; String s3 = "ab"+"cd"; String s2 = new String("abcd");//先堆内存创建对象 然后再常量池中创建对象"abcd" System.out.println(s==s1); //true System.out.println(s==s2); //false System.out.println(s==s3); //true System.out.println(s.equals(s1)); //true System.out.println(s.equals(s2));//true System.out.println(s3.equals(s2));//true //对于字符串的对象比较 应该用equals方法比较 //String类覆盖了Object类中equals方法,用来比较字符串是否相等 System.out.println("s: "+s+"s1: "+s1+"s2: "+s2); System.out.println("s: "+s.toString()+"s1: "+s1.toString()+"s2: "+s2.toString()); }
/* * 字符串对象应具备什么功能的操作 */ public static void main(String args[]) { String str = "abcdefgh"; System.out.println("字符串长度:" + str.length()); System.out.println("字符串哈希码:" + str.hashCode()); for (int i = 0; i < str.length(); i++) { System.out.print(str.charAt(str.length() - 1 - i)); } System.out.println("字符串是否为empty:" + str.isEmpty()); System.out.println(str.indexOf("b", 0)); // 没有为-1 System.out.println(str.indexOf("bcde")); // System.out.println(str.charAt(8)); //字符串脚标越界异常 // StringIndexOutOfBoundsException String s1 = str.substring(3); System.out.println(s1); String s2 = str.substring(3, 5); // 重载 System.out.println(s2); String s3 = str.concat("abc"); // 将指定字符串(abc)连接到此字符串的结尾。 System.out.println(s3); String s4 = str.substring(0, str.length()); System.out.println(s4); String s5 = str.toUpperCase(); System.out.println("转化成大写:" + s5);
public static void main(String args[]) { String str ="abcdefg"; String s =str.replace("abc","nba"); //替换字符串 System.out.println(s); System.out.println(str); char arr[] =str.toCharArray();//将字符串转化为字符数组 System.out.println(arr); boolean b =str.contains("abc"); System.out.println(b); String name ="tang,yi,chao"; String names[]=name.split(","); for (int i = 0; i < names.length; i++) { System.out.println(names[i]); } String hh =" bbb ccc"; System.out.println(hh); String h=hh.trim();// 返回字符串的副本,忽略前导空白和尾部空白。 System.out.println(h); }
//提取字符串中 小片段字符串“nba”的个数
public static void main(String args[]) { String str = "nbacccnbanbahhh,\\\nbadddnba"; String key = "nba"; int count = getSubCount(str, key); System.out.println("count:" + count); } public static int getSubCount(String str, String key) { int count = 0; int index = 0; // 调用indexOf方法获取key出现的位置 while ((index = str.indexOf(key,index)) != -1) { index = index + key.length(); count++; } return count; }
//反转字符串
//思路:字符串转化为数组 数组进行反转 将数组变成字符串
public static void main(String[] args) { /** * 字符串转化为数组 数组进行反转 将数组变成字符串 */ String s2 = "abcdeghljklmogjjkk"; System.out.println("原来字符串:"+s2); s2 = reverseString(s2); System.out.println("反转字符串:"+s2); } private static String reverseString(String str) { // 将字符串转化为字符数组 char[] chs = str.toCharArray(); reverseArray(chs); return new String(chs); } /* * 将一个字符数组进行反转 */ private static void reverseArray(char[] chs) { // TODO Auto-generated method stub for (int start = 0, end = chs.length - 1; start < end; start++, end--) { swap(chs, start, end); } } private static void swap(char[] chs, int start, int end) { // TODO Auto-generated method stub char temp = chs[start]; chs[start] = chs[end]; chs[end] = temp; }
//对一个字符串进行字典顺序生成一个有序的字符串
public static void main(String args[]) { String s1 = "aAd/g=dD+-1"; s1 = sortString(s1); System.out.println("字典排序后的:"+s1); } private static String sortString(String str) { // TODO Auto-generated method stub char[] chs = str.toCharArray(); mySort(chs); return new String(chs); } private static void mySort(char[] chs) { // TODO Auto-generated method stub for (int x = 0; x < chs.length - 1; x++) { for (int y = x + 1; y < chs.length; y++) if (chs[x] > chs[y]) swap(chs, x, y); } } private static void swap(char[] chs, int x, int y) { // TODO Auto-generated method stub char tmp = chs[x]; chs[x] = chs[y]; chs[y] = tmp; }
StringBuffer讲解:
* 字符串缓冲流 * 线程安全的可变字符序列 * * 长度不够 再创建字符串一半或者一倍。 * 特点: * 缓冲区就是用来缓冲数据的 是一个容器 * 1,长度可变
* 2,线程安全 * 3,提供了对容器中内容的操作的方法(增删改查) * StringBuffer() 构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符。
public static void main(String args[]) { StringBuffer sb =new StringBuffer(); //使用其添加方法,往缓冲区添加添加元素 byte short 不能 sb.append(1234); sb.append("tangyichao"); sb.append(true); System.out.println(sb); sb.append(sb); //sb.append(sb); //sb.append(sb); //sb.append(sb); System.out.println(sb); //append 返回的还是原来的缓冲区 //String str ="abc"+6+"c"; // str =new StringBuffer().append("abc").append(6).append("c").toString(); StringBuffer sb1 =new StringBuffer("abcdfeg"); // sb1.insert(1, 123); // System.out.println(sb1); // sb1.delete(0, 1); // 包含头 不包含尾巴 // System.out.println(sb1); // sb1.delete(0,sb1.length()); //清空缓冲区 // System.out.println(sb1); sb1.replace(1, 3, "AK47"); System.out.println(sb1); System.out.println(sb1.reverse()); //反转字符串 }
用两种方法进行对数组转化为字符串
public static void main(String args[]) { int [] arr={1,2,3,4,5}; String s1=toString_1(arr); System.out.println(s1); String s2=toString_2(arr); System.out.println(s2); } private static String toString_1(int arr[]) { String str ="["; for(int i=0;i<arr.length;i++) { if(i!=(arr.length-1)) { str+=arr[i]+","; }else{ str+=arr[i]+"]"; } } return str; } private static String toString_2(int arr[]) { StringBuffer str =new StringBuffer(); str.append("["); for(int i=0;i<arr.length;i++) { if(i!=(arr.length-1)) { str.append(arr[i]+","); }else{ str.append(arr[i]+"]"); } } return str.toString(); }
/** * StringBuilder * JDK 1.5版本出现的一个新的字符串缓冲区 * 功能和StringBuffer一样的 * 单个线程建议用StringBuilder * StringBuffer 线程安全的 * StringBuilder 线程不安全的 * 提高效率 不用使用同步锁 * 加锁 一个线程在执行容器中德内容是,其他线程不可以执行 * 实际开发是: * 建议使用StringBuilder * 如果用到多线程 则使用StringBuffer * @param args */
用StringBuffer对数组转化为字符串
private static String toString_2(int arr[]) { StringBuilder str =new StringBuilder(); str.append("["); for(int i=0;i<arr.length;i++) { if(i!=(arr.length-1)) { str.append(arr[i]+","); }else{ str.append(arr[i]+"]"); } } return str.toString(); }