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

---------------------- 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值