黑马程序员--字符串以及字符串缓冲区
来源:互联网 发布:php剔除数组重复数据 编辑:程序博客网 时间:2024/06/08 04:22
字符串以及字符串缓冲区
String字符串:★★★
java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。
如何定义字符串对象呢?String s = "abc";只要是双引号引起的数据都是字符串对象。
特点:字符串一旦被初始化,就不可以被改变,存放在方法区中的常量池中。
------------------------------------------------------
String s1 = "abc"; // s1指向的内存中只有一个对象abc。
String s2 = new String("abc"); // s2指向的内容中有两个对象abc、new 。
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true ,字符串中equals比较的是字符串内容是否相同。
-------------------------------------------------------
字符串的方法:
1:构造方法:将字节数组或者字符数组转成字符串。
String s1 = new String();//创建了一个空内容的字符串。
String s2 = null;//s2没有任何对象指向,是一个null常量值。
String s3 = "";//s3指向一个具体的字符串对象,只不过这个字符串中没有内容。
//一般在定义字符串时,不用new。
String s4 = new String("abc");
String s5 = "abc"; 一般用此写法
new String(char[]);//将字符数组转成字符串。
new String(char[],offset,count);//将字符数组中的一部分转成字符串。
2:一般方法:
按照面向对象的思想:
2.1 获取:
2.1.1:获取字符串的长度。length();
2.1.2:指定位置的字符。char charAt(int index);
2.1.3:获取指定字符的位置。如果不存在返回-1,所以可以通过返回值-1来判断某一个字符不存在的情况。
int indexOf(int ch);//返回第一次找到的字符角标
int indexOf(int ch,int fromIndex); //返回从指定位置开始第一次找到的角标
int indexOf(String str); //返回第一次找到的字符串角标
int indexOf(String str,int fromIndex);
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
2.1.4:获取子串。
String substring(int start);//从start位开始,到length()-1为止.
String substring(int start,int end);//从start开始到end为止。//包含start位,不包含end位。
substring(0,str.length());//获取整串
2.2 判断:
2.2.1:字符串中包含指定的字符串吗?
boolean contains(String substring);
2.2.2:字符串是否以指定字符串开头啊?
boolean startsWith(string);
2.2.3:字符串是否以指定字符串结尾啊?
boolean endsWith(string);
2.2.4:判断字符串是否相同
boolean equals(string);//覆盖了Object中的方法,判断字符串内容是否相同。
2.2.5:判断字符串内容是否相同,忽略大小写。
boolean equalsIgnoreCase(string) ;
2.3 转换:
2.3.1:通过构造函数可以将字符数组或者字节数组转成字符串。
2.3.2:可以通过字符串中的静态方法,将字符数组转成字符串。
static String copyValueOf(char[] );
static String copyValueOf(char[],int offset,int count);
static String valueOf(char[]);
static String valueOf(char[],int offset,int count);
2.3.3:将基本数据类型或者对象转成字符串。
static String valueOf(char);
static String valueOf(boolean);
static String valueOf(double);
static String valueOf(float);
static String valueOf(int);
static String valueOf(long);
static String valueOf(Object);
2.3.4:将字符串转成大小写。
String toLowerCase();
String toUpperCase();
2.3.5:将字符串转成数组。
char[] toCharArray();//转成字符数组。
byte[] getBytes();//可以加入编码表。转成字节数组。
2.3.6:将字符串转成字符串数组。切割方法。
String[] split(分割的规则-字符串);
2.3.7:将字符串进行内容替换。注意:修改后变成新字符串,并不是将原字符串直接修改。
String replace(oldChar,newChar);
String replace(oldstring,newstring);
2.3.8: String concat(string); //对字符串进行追加。
String trim();//去除字符串两端的空格
int compareTo();//如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。
例子:
- package pack;
- // String类时用于描述字符串事物。
- // 那么他就提供了多个方法对字符串进行操作。
- // 常见的操作有哪些?“abcd”
- // 1,获取。
- // 1.1:字符串中包含的字符数,也就是字符串的长度。
- // int length:获取长度。
- // 1.2:根据位置获取位置上的某个字符。
- // char charAt(int index);获取某一位置上的字符。
- // 1.3:根据字符获取该字符在字符串中的位置。
- // int indexOf(int ch);返回的是ch在字符串中第一次出现的位置。
- // int indesOf(int ch,int fromIndex);从fromIndex指定位置开始,获取ch在字符串中出现的位置。
- // int indexOf(String str);返回的是str在字符串中第一次出现的位置。
- // int indesOf(String str,int fromIndex);从fromIndex指定位置开始,获取str在字符串中出现的位置。
- //
- // int lastIndexOf(int ch);反向索引。
- // 2,判断。
- // 2.1:字符串中是否包含某一个子串。
- // boolean contains(str);判断字符串是否存在,判断字符串是否包含。
- // 特殊之处:indexOf(str);可以索引str第一次出现的位置,如果返回-1,表示该str不再字符串中存在。
- // 所以,也可以使用对指定判断是否包含。
- // if(str.indexOf("aa"!=-1));而且该方法既可以判断,又可以获取出现的位置。
- // 2.2:字符串中是否有内容。
- // boolean isEmpty();原理就是判断长度是否为0。
- // 2.3:字符串是否是以指定内容开头。
- // boolean startsWith(str);
- // 2.4:字符串是否是以指定内容结尾。
- // boolean endsWith(str);
- // 2.5:判断字符串内容是否相同。复写了Object类中的equals方法。
- // booleam equals(str);
- // 2.6:判断内容是否相同,并忽略大小写。
- // boolean equalsIgnoreCase();
- // 3,转换。
- // 3.1:将字符数组转成字符串。
- // 构造函数:String(char[])
- // String(char[],offset,count):将字符数组中的一部分转成字符串。
- // 静态方法:
- // static String copyValueOf(char[]);
- // static String copyValueOf(char[] data,int offset,int count);
- // static String valueOf(char[]);
- // 3.2:将字符串转成字符数组。**
- // char[] toCharArray();
- // 3.3:将字节数组转成字符串。
- // String(byte[]);
- // String(byte[],offset,count);将字节数组中的一部分转成字符串。
- // 3.4:将字符串转成字节数组。
- // byte[] getBytes();
- // 3.5:将基本数据类型转换成字符串。
- // static String valueOf(int);
- // static String valueOf(double);
- // 3+"";//String.valueOf(3);
- // 特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
- // 4,替换。
- // String replace(dchar,newchar);
- // 5,切割。
- // String[] split(regex);
- // 6,字串。获取字符串中的一部分。
- // String substring(begin);
- // String substring(begin,end);
- // 7,转换,去除空格,比较。
- // 7.1:将字符串转成大写或者小写。
- // String toUpperCase();
- // String toLowerCase();
- // 7.2:将字符串两端的多个空格去除。
- // String trim();
- // 7.3:对两个字符串进行自然顺序的比较。
- // int compareTo(string);
- class StringMethodDemo{
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args){
- }
- public static void method_get(){
- String s="abcdefg";
- sop(s.length());// 打印长度
- sop(s.charAt(2));// 根据索引获取字符。
- // 当访问到字符串中不存在的角标时,
- // 会发生StringIndexOutOfBoundsException:字符串角标越界异常。
- sop(s.indexOf("a"));//根据字符获取索引。如果没有找到,返回-1.
- sop(s.lastIndexOf("a"));// 反向索引一个字符出现的位置。角标不被反向。所以打印的还是0角标
- }
- public static void method_is(){
- String s="ArrayTool.java";
- sop(s.startsWith("Array"));// 判断文件名称是否是Array单词开头。
- sop(s.contains("Tool"));// 判断文件名中是否包含Tool。
- sop(s.endsWith(".java"));// 判断文件名称是否是.java的文件。
- }
- public static void method_trans(){
- char[] arr={'a','b','c','d','e'};
- String s=new String(arr,1,3);// 将字节数组中的一部分转成字符串。
- sop("s="+s);
- String s1="abcdefg";
- char[] chs=s1.toCharArray();// 将字符串转成字节数组。
- for(int x=0; x<chs.length; x++){
- sop(chs[x]);
- }
- }
- public static void method_replace(){
- String s="Hello JAVA";
- String s1=s.replace("a","b");// 如果要替换的字符不存在,返回的还是原字符串。
- sop(s);sop(s1);
- }
- public static void method_7(){
- String s=" Hello JAVA ";
- sop(s.toUpperCase());// 将字符串转成大写。
- sop(s.toLowerCase());// 将字符串转成小写。
- sop(s.trim());// 去除字符串两端的空格。
- String s1="aaa";
- String s2="abc";
- sop(s.compareTo(s2));// 对字符串进行比较排序。
- }
- }
练习1:
- package pack;
- // 1,模拟一个trim方法,去除字符串两端的空格。
- // 思路:
- // 1,判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。
- // 结尾处判断空格也是如此。
- // 2,当开始和结尾都判断到不是空格,就是要获取的字符串。
- // 2,将一个字符串进行反转,将字符串中指定部分进行反转,"abcdefg";abfedcg.
- // 思路:
- // 1,曾静学习过对数组的元素进行反转。
- // 2,将字符串变成数组,对数组进行反转。
- // 3,将反转后的数组变成字符串。
- // 4,只要将或反转的部分的开始和结束为止作为参数传递即可。
- class StringTest1{
- public static void main(String[] args){
- }
- // 练习一:去除字符串两端空格。
- 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);
- }
- // 练习二:将字符串反转。
- // 将字符串变成数组,对数组进行反转,将数组变成字符串。
- public static String reverseString(String s,int start,int end){
- char[] chs=s.toCharArray();
- reverse(chs,start,end);
- return new String(chs);
- }
- public static String reverseString(String s){
- return reverseString(s,0,s.length()-1);
- }
- public static void reverse(char[] arr,int x,int y){
- for(int start=x,end=y; start<end; start++,end--){
- swap(arr,start,end);
- }
- }
- public static void swap(char[] arr,int x,int y){
- char temp=arr[x];
- arr[x]=arr[y];
- arr[y]=temp;
- }
- }
练习2:
- package pack;
- // 3,获取一个字符串在另一个字符串中出现的次数。
- // “adkkkcdkkefkkskk”
- // 思路:
- // 1,定义一个计数器。
- // 2,获取kk第一次出现的位置。
- // 3,从第一次出现的位置后剩余的字符串中继续获取kk出现的位置。
- // 每获取一次就计数一次。
- // 4,当获取不到时,计数完成。
- class StringTest2{
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args){
- }
- // 方式一。
- public static int getSubCount(String s,String key){
- int count=0;
- int index=0;
- while((index=s.indexOf(key))!=-1){
- sop(s);
- s=s.substring(index+key.length());
- count++;
- }
- return count;
- }
- // 方式二。
- public static int getSubString(String s,String key){
- int count=0;
- int index=0;
- while((index=s.indexOf(key,index))!=-1){
- sop(index);
- index=index+key.length();
- count++;
- }
- return count;
- }
- }
练习2:
- package pack;
- // 4,获取两个字符串中最大相同子串,第一个动作:将断的哪个串进行长度一次递减的子串打印。
- // “abcwerthelloyuiodef”
- // “cvhellobnm”
- // 思路:
- // 1,将短的哪个子串按照长度递减的方式获取到。
- // 2,将每获取到的子串去长传中判断是否包含。
- // 如果包含,已经找到。
- class StringTest3{
- public static void main(String[] args){
- String s1="abcwerthelloyuiodef";
- String s2="cvhellobnm";
- System.out.println(getMaxSubString(s1,s2));
- }
- public static String getMaxSubString(String s1,String s2){
- String max="",min="";
- max=(s1.length()>s2.length())?s1:s2;
- min=(max==min)?s1:s2;
- System.out.println(max);
- System.out.println(min);
- for(int x=0; x<min.length(); x++){
- for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++){
- String temp=min.substring(y,z);
- if(max.contains(temp))
- return "相同子串: "+temp;
- }
- }
- return "";
- }
- }
------------------------------------
StringBuffer字符串缓冲区:★★★
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
特点:
1:可以对字符串内容进行修改。
2:是一个容器。
3:是可变长度的。
4:缓冲区中可以存储任意类型的数据。
5:最终需要变成字符串。
容器通常具备一些固定的方法:
1,添加。
StringBuffer append(data):在缓冲区中追加数据。追加到尾部。
StringBuffer insert(index,data):在指定位置插入数据。
2,删除。
StringBuffer delete(start,end);删除从start至end-1范围的元素
StringBuffer deleteCharAt(index);删除指定位置的元素
//sb.delete(0,sb.length());//清空缓冲区。
3,修改。
StringBuffer replace(start,end,string);将start至end-1替换成string
void setCharAt(index,char);替换指定位置的字符
void setLength(len);将原字符串置为指定长度的字符串
4,查找。(查不到返回-1)
int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(string,int fromIndex);从指定位置开始查找字符串
int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索
5,获取子串。
string substring(start); 返回start到结尾的子串
string substring(start,end); 返回start至end-1的子串
6,反转。
StringBuffer reverse();字符串反转
StringBuilder字符串缓冲区:★★★
JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
方法和StringBuffer一样;
StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全。
StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
//想要使用缓冲区,先要建立对象。
StringBuffer sb = new StringBuffer();
sb.append(12).append("haha");//方法调用链。
String s = "abc"+4+'q';
s = new StringBuffer().append("abc").append(4).append('q').toString();
t-size:10.5000pt; mso-font-kerning:1.0000pt; " >
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
练习:
- package pack;
- // StringBuffer是字符串缓冲区,是一个容器。特点:
- // 1,而且长度是可变化的。
- // 2,可以直接操作多个数据类型。
- // 3,最终会通过toString方法变成字符串
- // c create U update Rread Ddelete
- // 1,存储。
- // StringBuffer append();将指定数据作为参数添加到已有数据的结尾处。
- // StringBuffer insert(index,数据);可以将数据插入到指定index位置。
- // 2,删除。
- // StringBuffer delete(start,end);删除缓冲区中的数据,包含start,不包含end。
- // StringBuffer deleteCharAt(index);删除指定位置的字符。
- // 3,获取。
- // char charAt(int index);
- // int indexOf(String str);
- // int laseIndexOf(String str);
- // int length();
- // String substring(int start,int end);
- // 4,修改。
- // StringBuffer replace(start,end,string);
- // void setCharAt(int index,char ch);
- // 5,反转。
- // StringBuffer reverse();
- // 6,缓冲区中指定数据存在到指定数组中。
- // void getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)
- // 在JDK1.5版本之后出现了StringBuilder
- // 不同在于:StringBuffer是线程同步。
- // StringBuilder是线程不同步。
- // 以后开发,建议使用StringBuilder。
- // 升级三个因素:1,提高效率。2,简化书写。3,提高安全性。
- class StringBufferDemo{
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args){
- }
- public static void method_add(){
- StringBuffer sb=new StringBuffer();
- sb.append("abc");sb.append(123);sb.append(true);
- StringBuffer sb1=sb.append(123);
- sop("sb: "+sb);sop("sb1: "+sb1);
- sb.insert(1,"qq");
- sop(sb.toString());
- sop(sb1.toString());
- }
- public static void method_delete(){
- StringBuffer sb=new StringBuffer("abcdefg");
- sb.delete(1,3);
- sb.delete(0,sb.length());
- sb.delete(2,3);sb.deleteCharAt(2);
- sop(sb.toString());
- }
- public static void method_udapter(){
- StringBuffer sb=new StringBuffer("abcdefg");
- sb.replace(1,3,"java");
- sb.setCharAt(2,'K');
- sop(sb.toString());
- }
- public static void getChars(){
- StringBuffer sb=new StringBuffer("abcdefg");
- char[] chs=new char[4];
- sb.getChars(1,4,chs,1);
- for(int x=0; x<chs.length; x++)
- sop("chs["+x+"]"+chs[x]+";");
- }
- }
- 黑马程序员--字符串以及字符串缓冲区
- 黑马程序员--字符串以及字符串缓冲区
- 黑马程序员--字符串缓冲区
- 黑马程序员_字符串缓冲区
- 黑马程序员 字符串缓冲区小结
- 黑马程序员_StringBuilder字符串缓冲区
- 黑马程序员,StringBuffer是字符串缓冲区
- 黑马程序员--字符串缓冲区StringBuffer 和 StringBuiler
- 黑马程序员__12JAVA基础 字符串缓冲区
- 黑马程序员__Java字符串的缓冲区对象
- 黑马程序员09——字符串、字符串缓冲区
- 黑马程序员———字符串和字符串缓冲区
- 黑马程序员--java基础--String类和字符串缓冲区
- 黑马程序员—Java API(字符串缓冲区StringBuffer、StringBuilder)
- 黑马程序员_日记28_Java字符串缓冲区
- 黑马程序员_字符串、字符串缓冲区和基本类型包装类
- 黑马程序员-字符串函数
- 黑马程序员_字符串
- android 5.1 源码编译adb
- C语言中运算符优先级
- linux 下安装ssh
- 华为OJ(字符串匹配)
- 什么是铁损和铜损?
- 黑马程序员--字符串以及字符串缓冲区
- linux学习之路(4)
- MFC tip信息
- Android:EditText中切换密码的显示与隐藏
- 关于结构体的复制
- UILabel属性总结
- 固定顶部导航栏和左侧边栏滚动条为右下方的一类布局分析
- python2.7虚拟环境virtualenv安装及使用
- LightOJ 1275 - Internet Service Providers