java string常见操作题

  1. 每个基本类型封装类都有将string转换为基本数据类型的方法
    对于非常大的数字请使用Long,代码如下*
int age = Integer.parseInt("10");  
long id = Long.parseLong("190"); // 假如值可能很大.  
  1. 将char字符转换为String
    Chraracter.toString(char)
  2. 将stringBuilder转换为string,
    stringBuilder.tostring();
string类常用操作方法

1)string[] string.spilt(" ");//根据空格符进行分割,返回值是string数组

        String strings = new String("hello world");
        System.out.println("原始字符串"+strings);
        String[] string1 = strings.split(" ");
        System.out.println("新字符串"+Arrays.toString(string1));
        /*输出结果
        原始字符串hello world
        新字符串[hello, world]
        */

2)string string.replaceAll("a","b");//将a取代成b

String strings = new String("hello world");
        System.out.println("原始字符串:" + strings);
        String str2 = strings.replaceAll("hello", "你好");
        System.out.println("新字符串:" + str2);
        /*输出结果
        原始字符串:hello world
        新字符串:你好 world
        */

3)int string.indexOf(substr);//返回substr在string中第一个index
4)string string.subString(fromIndex.endIndex);//返回被截取的字符串

String strings = new String("hello world");
        System.out.println("原始字符串:" + strings);
        String str2 = strings.substring(6,9);
        System.out.println("新字符串:" + str2);
        /*输出结果
        原始字符串:hello world
        新字符串:wor
        */

5)string string.subString(fromIndex);//从第几位开始往后截取
6)char string.charAt(index);返回第几个字符
7)一切的前提,谨记string是final类的,不能更改。保存在方法区的常量池中。
8)用stringBuilder将string相反过来,因为stringBuilder.toReverse()方法,然后再stringBuilder.toReverse().toString()转换为字符串

String strings = new String("hello world");
        System.out.println("原始字符串:" + strings);
        StringBuilder stringBuilder = new StringBuilder(strings);
        strings = stringBuilder.reverse().toString();
        System.out.println("新字符串:" + strings);
        /*输出结果
        原始字符串:hello world
        新字符串:dlrow olleh
        */

9)谨记千万不要采用string1+string2+string3这种引用变量的相加,这种会容易造成内存溢出,常量池内存溢出,因为这是引用变量,在程序运行时才会操作。
若想string1这种相加,可以采用字面值相加,如“123”+“abc”+"cbb",因为这种是编译器会优化,优化成一个string。或者采用,stringBuilder的append(string)方法,将一个stringB附加到主stringBuilder后面。

  1. string.操作方法,默认会生成一个新的string保存在常量池中,不会改变原来常量池中的string。
    因为常量池,string是final的,一经创建无法改变。
    看下面代码:
String str = "abcde"; 
str.toUpperCase();
 System.out.println(str); //输出还是abcde,而非ABCDE。```
因为string是final的,string的改变内容的操作方法会生成一个新的string在常量池中。
2. 引用变量指向常量池中的新的str

String str = "abcde";
str = str.toUpperCase();
System.out.println(str);
//常量池中新生成一个string,以前的引用变量指向新地址

3. 字符串反转,用string缓存类,stringBuffer或者stringBuilder.
因为string缓存类,预先在堆内存中开辟一个16字符的存储空间,借以不断改变string的值

String str = "abcde";
StringBuilder stringBuilder = new StringBuilder(str);
stringBuilder.reverse();
str = stringBuilder.toString();
System.out.println(str);//输出edcba

stringBuilder是在堆内存开辟一个存储空间,对stringBuilder的修改全是在修改stringBuilder对象内存本身。
4. 判断字符串是否对称:

String str = "abcde";
StringBuilder stringBuilder = new StringBuilder(str);
String str2 = stringBuilder.reverse().toString();
System.out.println(str.equal(str2));

5. 输出字符串的子串,比如
string str = "@abc  efg . ghk";
string[] strArray = string.split("byChar");
string.split(“byChar”)方法
要求输出abc efg ghk

String str = "ab@cd ghk efg";
str = str.replaceAll("@", " ");
String[] strArray = str.split(" ");
for (String str1 : strArray) {
System.out.println(str1);
}

6. 编写一个程序,将下面的一段文本中的各个单词的字母顺序翻转,“To be or not to be",将变成"oT eb ro ton ot eb."。

public static void main(String[] args) {
String str = "To be or not to be";
String[] strings = str.split(" ");
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strings.length; i++) {
StringBuilder s = new StringBuilder(strings[i]);
stringBuilder.append(s.reverse());
if (i < strings.length - 1)
stringBuilder.append(" ");
}
stringBuilder.append(".");
System.out.println(stringBuilder.toString());
}
/**
* 输出结果:oT eb ro ton ot eb.
/
/
*
* 输出结果:oT eb ro ton ot eb.
*/

7. 
```String s="name=zhangsan age=18 classNo=090728"```
将上面的字符串拆分,结果如下:
    ```zhangsan 18 090728```

public static void main(String[] args) {
String s = "name=zhangsan age=18 classNo=090728";
String[] ss = s.split(" ");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ss.length; i++) {
String[] ss2 = ss[i].split("=");
sb.append(ss2[1]);
sb.append(" ");
}
System.out.println(sb);
}

8. 判断一个字符串是否包含另一个字符串?
答:
```int i = str.indexof("sss");```
如果不包含,则返回-1.如果包含则返回被包含字符串的起始位置。

if(str.indexof()!=-1){包含};

9. 给定一个字符串,判断该字符串中是否包含某个子串.如果包含,求出子串的所有出现位置.如:```"abcbcbabcb34bcbd"```中,```"bcb"```子串的出现位置为: 1,7,12.字符串和子串均由用户输入

public static void main(String[] args) {
String userInput = "abcbcbabcb34bcbd";
String subString = "bcb";
int index = 0;
while (true) {
if (userInput.indexOf(subString, index) != -1) {
System.out.println(userInput.indexOf(subString, index));
index = userInput.indexOf(subString, index) + subString.length();
} else
break;
}
}

10. 给定一个长度,随机产生一个该长度的字符串,由大写,小写字母以及数字组成Java中随机数的生成:
java.util.Random r = new java.util.Random();
int a = r.nextInt(100): a 0-99的随机数

public class suiji {
public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);
    System.out.println("请输入一个整数");
    int shuru = scanner.nextInt();
    char[] s = new char[shuru];
    for (int i = 0; i < shuru; i++) {
        int a = (int) (Math.random() * 3);
        if (a == 0) {
            s[i] = (char) (Math.random() * 10 + 48);
        } else if (a == 1) {
            s[i] = (char) (Math.random() * 26 + 65);
        } else {
            s[i] = (char) (Math.random() * 26 + 97);
        }
    }
    System.out.println(s);

/**
*方法二用Random
*/
// Scanner scanner = new Scanner(System.in);
// int zs = scanner.nextInt();
// Random random = new Random();
// char[] sz = new char[zs];
// for (int i = 0; i < zs; i++) {
// int b = random.nextInt(3);
// if (b == 0) {
// sz[i] = (char) (random.nextInt(10) + 48);
// } else if (b == 1) {
// sz[i] = (char) (random.nextInt(26) + 65);
// } else if (b == 2) {
// sz[i] = (char) (random.nextInt(26) + 97);
// }
// }
// System.out.println(sz);
}
}

11. 给定一个由数字组成的字符串,如:```"1239586838923173478943890234092"```,统计出每个数字出现的次数

public static void Method_Three()
{
Scanner scanner = new Scanner(System.in);
String string = scanner.next();
int[] c = new int[10];
for (int i = 0; i < string.length(); i++)
{
char c1 = string.charAt(i); //48-57
int a = c1-48; // 类型转换
c[a]++;
}
for (int i = 0; i < c.length; i++)
{
System.out.println(i+" 出现的次数: "+c[i]);
}

    System.out.println("=========方法二==========");
    String s = "12548954231351486214894562";
    char[] ch = s.toCharArray();
     
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    Set<Character> set = map.keySet();
    for (int i = 0; i < ch.length; i++)
    {
        if (set.contains(ch[i])) // 判断map中已经有的char值
        {
            map.put(ch[i], map.get(ch[i])+1);
        } else
        {
            map.put(ch[i], 1); // 第一次放入map中
        }
    }
    Set<Character> set2 = map.keySet();
    for (Character character : set2)
    {
        System.out.println(character+"=========="+map.get(character));
    }
}
12. 输出字符串里的大写字母数,小写英文字母数,非英文字母数

public static void main(String[] args) {
String s = "ddejidsEFALDFfnef2357 3ed";
int da=0,xiao=0,fei=0;
for (int i = 0; i < s.length(); i++) {
char a = s.charAt(i);
if (Character.isUpperCase(a))
da++;
else if (Character.isLowerCase(a))
xiao++;
else
fei++;
}
System.out.println("大写字母:"+da+" "+"小写字母:"+xiao+" "+"非字母"+fei);
}
/**
* 输出结果:大写字母:6 小写字母:13 非字母6
*/

##### 总结:字符串的常见操作无非几种
1.字符串反转 用stringBuilder.reverse();
2.字符串切割 String[] strArray = str.spilt("spiltChar");
3.字符串拼接 用stringBuilder.append("str");

/**

  • 1,给定一个字符串数组。按照字典顺序进行从小到大的排序。

  • {"nba","abc","cba","zz","qq","haha"}

  • <p>

  • 思路:

  • 1,对数组排序。可以用选择,冒泡都行。

  • 2,for嵌套和比较以及换位。

  • 3,问题:以前排的是整数,比较用的比较运算符,可是现在是字符串对象。

  • 字符串对象怎么比较呢?爽了,对象中提供了用于字符串对象比较的功能。
    /
    public class StringTest_1 {
    /
    *

    • @param args
      */
      public static void main(String[] args) {
      String[] arr = {"nba", "abc", "cba", "zz", "qq", "haha"};
      printArray(arr);
      sortString(arr);
      printArray(arr);
      }

    public static void sortString(String[] arr) {
    for (int i = 0; i < arr.length - 1; i++) {
    for (int j = i + 1; j < arr.length; j++) {
    if (arr[i].compareTo(arr[j]) > 0)//字符串比较用compareTo方法
    swap(arr, i, j);
    }
    }
    }

    private static void swap(String[] arr, int i, int j) {
    String temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
    }

    public static void printArray(String[] arr) {
    System.out.print("[");
    for (int i = 0; i < arr.length; i++) {
    if (i != arr.length - 1)
    System.out.print(arr[i] + ", ");
    else
    System.out.println(arr[i] + "]");
    }
    }
    }


package cn.itcast.p1.string.test;

/*

  • 2,一个子串在整串中出现的次数。
  • "nbaernbatynbauinbaopnba"
  • 思路:
  • 1,要找的子串是否存在,如果存在获取其出现的位置。这个可以使用indexOf完成。
  • 2,如果找到了,那么就记录出现的位置并在剩余的字符串中继续查找该子串,
  • 而剩余字符串的起始位是出现位置+子串的长度.
  • 3,以此类推,通过循环完成查找,如果找不到就是-1,并对 每次找到用计数器记录。

*/

public class StringTest_2 {

/**
 * @param args
 */
public static void main(String[] args) {

    String str = "nbaernbatnbaynbauinbaopnba";
    String key = "nba";
     
    int count = getKeyStringCount_2(str,key);
    System.out.println("count="+count);
             
}

public static int getKeyStringCount_2(String str, String key) {
     
    int count = 0;
    int index = 0;
     
    while((index = str.indexOf(key,index))!=-1){
         
        index = index + key.length();
        count++;
         
    }
     
    return count;
}

/**
 * 获取子串在整串中出现的次数。
 * @param str
 * @param key
 * @return
 */
public static int getKeyStringCount(String str, String key) {
     
    //1,定义计数器。 
    int count = 0;
     
    //2,定义变量记录key出现的位置。
    int index = 0;
     
    while((index = str.indexOf(key))!=-1){
         
        str = str.substring(index+key.length());
        count++;
    }
    return count;
}

}


package cn.itcast.p1.string.test;

/*

  • 3,两个字符串中最大相同的子串。
  • "qwerabcdtyuiop"
  • "xcabcdvbn"
  • 思路:
  • 1,既然取得是最大子串,先看短的那个字符串是否在长的那个字符串中。
  • 如果存在,短的那个字符串就是最大子串。
  • 2,如果不是呢,那么就将短的那个子串进行长度递减的方式去子串,去长串中判断是否存在。
  • 如果存在就已找到,就不用在找了。

*/
public class StringTest_3 {

/**
 * @param args
 */
public static void main(String[] args) {

    String s1 = "qwerabcdtyuiop";
    String s2 = "xcabcdvbn";

    String s = getMaxSubstring(s2, s1);
    System.out.println("s=" + s);
}

/**
 * 获取最大子串
 * 
 * @param s1
 * @param s2
 * @return
 */
public static String getMaxSubstring(String s1, String s2) {
     
    String max = null,min = null;
    max = (s1.length()>s2.length())?s1:s2;
     
    min = max.equals(s1)?s2:s1;
     
    System.out.println("max="+max);
    System.out.println("min="+min);
     
     
     
    for (int i = 0; i < min.length(); i++) {
         
        for(int a = 0,b = min.length()-i; b != min.length()+1; a++,b++){
             
            String sub = min.substring(a, b);

// System.out.println(sub);
if(max.contains(sub))
return sub;
}
}

    return null;
}

}


package cn.itcast.p1.string.test;

/*

  • 4,模拟一个trim功能一致的方法。去除字符串两端的空白

  • 思路:

  • 1,定义两个变量。

  • 一个变量作为从头开始判断字符串空格的角标。不断++。

  • 一个变量作为从尾开始判断字符串空格的角标。不断--。

  • 2,判断到不是空格为止,取头尾之间的字符串即可。
    */
    public class StringTest_4 {

    /**

    • @param args
      */
      public static void main(String[] args) {

      String s = " ab c ";

      s = myTrim(s);
      System.out.println("-" + s + "-");
      }

    public static String myTrim(String s) {

     int start = 0, end = s.length() - 1;
    
     while (start <= end && s.charAt(start) == ' ') {
         start++;
     }
     while (start <= end && s.charAt(end) == ' ') {
         end--;
     }
     return s.substring(start, end + 1);
    

    }

}

1. 编程. 已知字符串:"this is a test of java".
按要求执行以下操作:
(1) 统计该字符串中字母s出现的次数
(2) 取出子字符串"test"
(3) 用多种方式将本字符串复制到一个字符数组Char[] str中.
(4) 将字符串中每个单词的第一个字母变成大写, 输出到控制台。
(5) 用两种方式实现该字符串的倒叙输出。(用StringBuffer和for循环方式分别实现)
(6) 将本字符串转换成一个字符串数组,要求每个数组元素都是一个有意义的额英文单词,并输出到控制台
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,066评论 0 41
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,293评论 18 399
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,789评论 0 2
  • 一、 1、请用Java写一个冒泡排序方法 【参考答案】 public static void Bubble(int...
    独云阅读 1,231评论 0 6
  • 在这里不是要翻旧账控诉谁,只是觉得写出来给大家提个醒,恶人是随处可见的,人要是走背字立马雪上加霜。在连通的几个月写...
    掌声雷动阅读 112评论 0 0