您的位置:首页 > 职场人生

黑马程序员_Java基础_字符串操作

2014-01-28 12:02 549 查看
----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

一、String类的简单理解

在Java中,字符串是最常用的类之一,对于String类的声明方式有两种,一种是直接的String str = "abc";另外一种是:通过new 关键字来声明 即 String str = new String("abc");
    
那么者两种方式有什么区别呢?如果想要解释这个问题,就必须理解一个重要的概念:一个字符串就是String类的匿名对象,匿名对象就是已经开辟了对内存空间的并且可以直接使用的对象。对于第二种方式,如果使用new 关键字,不管如何都会在开辟一个新的空间,但是此时空间的内容还是“abc”,实际上此时在对内存中存在两个空间,而 str此时指向的就是new关键字开辟出来的空间,原来“abc”所占的空间就会变为垃圾空间。所以,一般情况下不要使用 String
str = new String("");的方式。【好吧,其实就一句话,new关键字声明String时会造成空间的浪费

对于String的常用API,感觉看着文档在这里记录学习笔记没什么意思,在学习中根据实际场景,慢慢都会知道了。好吧,说这么多感觉好空洞。

二、String类的简单练习

下面做几个String的练习

1.对给定字符串的指定位置进行反转操作  例如:"abcdefg" 变为 "abcfedg"

2.获取一个字符串在另外一个字符串中出现的次数

3.获取两个字符串最大相同的子串

不废话,直接上代码,并且解释

package com.itheima.string;

import java.util.regex.Pattern;

/**
* 字符串练习 1.实现字符串指定位置的反转
* 2.获取一个字符串在指定字符串中出现的次数
* 3.获取两个字符串中最大相同子串
*/
public class StringDemo {

public static void main(String[] args) {
String str = "a..12345b";
//System.out.println(reverse(str, 1, 6));
//String str1 = ".";
//System.out.println(getShowNum(str1, str));
System.out.println(getMaxSubstring(str, "a.1234b5"));
}

/**
* 获取两个字符串最大相同子串
* @param s1
* @param s2
* @return 返回最大相同子串
*/
public static String getMaxSubstring(String s1,String s2){
//得到最长的字符串与最短的字符串
String minStr = s1.length()>s2.length()? s2:s1;
String maxStr = s2.equals(minStr)? s1:s2;
//对最短的字符串进行循环
for(int i = 0 ; i < minStr.length();i++){
//例如 abcd 第一次就拿abcd进行比较,第二次abc,bcd 第三次 ab,bc,cd 每次开始位置都是0,然后结束位置就是(长度-次数)
//当结束位置与字符串长度相同是结束本次循环
for(int beginIndex = 0,endIndex = minStr.length()-i;endIndex <= minStr.length();beginIndex++,endIndex++){
String temp = minStr.substring(beginIndex, endIndex);
if(maxStr.contains(temp)){
return temp;
};
}
}
return "";
}

/**
* 获取一个字符串在指定字符串中出现的次数
* src 在 dest 中出现的次数
* @param src
* @param dest 指定字符串
* @return 出现的次数
*/
public static int getShowNum(String src,String dest){
if(src == null || src.isEmpty()){
throw new IllegalArgumentException("src cannot empty");
}
int index = 0;
while(dest.contains(src)){
index++;
//把指定字符串中包含src的部分依次去掉
dest = Pattern.compile(src, Pattern.LITERAL).matcher(dest).replaceFirst("");
}

return index;
}

/**
* 对给定的字符串,在开始位置与结束位置之间进行字符串的反转
*
* @param src
*            给定字符串
* @param beginIndex
*            开始位置索引
* @param endIndex
*            结束位置索引 (注意,结束位置不包含在反转中) [beginIndex,endIndex);
* @return 返回操作后的字符串
*/
public static String reverse(String src, int beginIndex, int endIndex) {
if (beginIndex < 0 || beginIndex > endIndex || endIndex > src.length()
|| beginIndex > src.length()) {
throw new IllegalArgumentException("illegal index,please check beginIndex,endIndex.");
}
if(src == null || src.isEmpty()){
return "";
}
//截取指定范围的字符串
String temp = src.substring(beginIndex, endIndex);
char[] tempchs = temp.toCharArray();
char[] chs = src.toCharArray();
//例如 截取的字符串范围为[1-6),那么字符串的长度就为5,下标就从0--4
for(int i = beginIndex; i <= endIndex-beginIndex ;i++){
chs[i] = tempchs[endIndex-i-1];
}
return new String(chs);
}

}


在开发中,尽量少使用 String str = "aa"+"bb"+"cc";这种形式就会在内存中开辟了三个空间,特别在for循环中,尽量不要这样使用。在JavaAPI中提供了一个StringBuffer,StringBuilder类,这两个类可以很容易进行字符串的相加操作:例如 StringBuilder mBuider = new StringBuilder("aaa"); mBuilder.append("").append("");这个类方法比较简单,可以参照Java文档进行练习。上述两个类操作方式完全一样,区别在于
StringBuffer是线程安全的,在操作时用到了线程中的锁机制,效率比较低。

关于Java中的基本数据类型的包装类

  boolean Boolean;
int Integer;
byte Byte;
short Short;
long Long ;
double Double;
float Float;
char Character;

在jdk1.5之后,这几种数据类型可以实现自动装箱与拆箱的操作。例如:Integer i = 4;相当于 Integer i = new Integer(4);  装箱   int j = i;自动拆箱,相当于 int j = Integer.valueOf(i);

基本API方法需要在学习工作中不断使用,就会慢慢的记住。【上述总结可能存在问题,希望大家批评指正。】

----------------------
ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐