String及其他
String
以下例开始讲解String
public class StringDemo { public static void main(String[] args) {
// String s = new String();
// String s1 = ""; String s1 = "abc";//s1是一个类类型变量,"abc"是一个对象
//字符串最大的特点:一旦被初始化就不可以被改变。
String s2 = new String("abc");
//面试题:s1和s2有什么区别?
//s1在内存中有一个对象,s2在内存中有两个对象。 System.out.println(s1 == s2);
System.out.println(s1.equals(s2));//String类复写了Object类中的equals(),
//该方法用于判断字符串是否相同
// s1 = "kk";
// System.out.println(s1); } }
String类是用于描述字符串事物的。那么它就提供了多个方法对字符串进行操作。
常见的操作有哪些?
1、获取
1.1、字符串中包含的字符数,也就是字符串的长度
int length();----获取长度
1.2、根据位置获取位置上某个字符
char charAt(int index);
1.3、根据字符获取该字符在字符串中的位置
int indexOf(int ch);----返回的是ch在字符串中第一次出现的位置
int indexOf(int ch, int fromIndex);----从fromIndex指定位置开始,获取ch在字符串中出现的位置
int indexOf(String str);----返回的是str在字符串中第一次出现的位置。
int indexOf(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 startWith(str);
2.4、字符串是否是以指定内容结尾
boolean endWith(str);
2.5、判断字符串的内容是否相同,复写了Object类中的equals()
boolean equals(str);
2.6、判断内容是否相同,并忽略大小写
boolean equalsIgnoreCase(str);
3、转换
3.1、将字符数组转成字符串
构造函数:String(char[])
String(char[], offset, count);将字符数组中的一部分转成字符串 ,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); int--->String
特殊:字符串和字节数组在转换过程中,是可以指定编码表的
4、替换
String replace(oldchar, 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);
举例说明以上方法:
public class StringMethodDemo { public static void method_7() {
String s = " Hello Java ";
sop(s.toUpperCase());
sop(s.toLowerCase());
sop(s.trim()); String s1 = "a1c";
String s2 = "aaa"; sop(s1.compareTo(s2)); } public static void method_sub() {
String s = "abcdef";
sop(s.substring(2));//从指定位置开始到结尾,如果角标不存在,会出现字符串角标越界异常
sop(s.substring(2, 4));//包含头,不包含尾。s.substring(0, s.length());
} public static void method_split() {
String s = "zhangsan,lisi,wangwu"; String[] arr = s.split(",");
for(int x = 0; x < arr.length; x++) {
sop(arr[x]);
}
} public static void method_replace() {
String s = "hello java"; // String s1 = s.replace('q', 'n');//如果要替换的字符不存在,返回的还是原串 String s1 = s.replace("java", "world");
sop("s="+s);
sop("s1="+s1); } public static void method_trans() {
char[] arr = {'a', 'b', 'c', 'd', 'e', 'f'};
String s = new String(arr, 1, 3);
sop("s="+s); String s1 = "zxcvbnm";
char[] chs = s1.toCharArray(); for(int x = 0; x < chs.length; x++) {
sop("ch="+chs[x]);
}
} public static void method_is() {
String str = "ArrayDemo.java";
//判断文件名称是否是以Array单词开头
sop(str.startsWith("Array"));
//判断文件名称是否是.java文件
sop(str.endsWith(".java"));
//判断文件名称是否包含Demo
sop(str.contains("Demo")); } public static void method_get() {
String str = "abcdeakpf"; //长度
sop(str.length()); //根据索引获取字符
sop(str.charAt(4));//当访问到字符串中不存在的角标时,会发生StringIndexOutOfBoundsException。
//根据字符获取索引
sop(str.indexOf('m', 3));//如果没有找到返回-1 //反向索引一个字符出现的位置
sop(str.lastIndexOf('a')); }
public static void main(String[] args) {
/*
String s1 = "abc";
String s2 = new String("abc");
String s3 = "abc"; System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s2 == s3);
*/
// method_get();
// method_is();
// method_trans();
// method_replace();
// method_split();
// method_sub();
method_7(); } public static void sop(Object obj) {
System.out.println(obj);
} }
练习1、模拟一个trim()方法,去除字符串两端的空格。
示例代码如下:
/*
1、模拟一个trim()方法,去除字符串两端的空格。 思路:
1、判断字符串第一个位置是否是空格,如果是继续向下判断,直到不是空格为止。结尾处判断空格也是如此
2、当开始和结尾都判断到不是空格时,就是要获取的字符串
*/ public class StringTest { public static void sop(String str) {
System.out.println(str);
} public static String myTrim(String str) { int start = 0, end = str.length()-1;
while(start <= end && str.charAt(start) == ' ')
start++;
while(start <= end && str.charAt(end) == ' ')
end--;
return str.substring(start, end+1); }
public static void main(String[] args) {
String s = " ab cd ";
sop("("+s+")");
s = myTrim(s);
sop("("+s+")");
} }
练习2、将一个字符串进行反转。将字符串中指定的部分进行反转,"abcdefg"--->"abfedcg"
示例代码如下:
public class StringTest1 { public static void sop(String str) {
System.out.println(str);
} 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) {
/*
char[] chs = s.toCharArray(); reverse(chs); return new String(chs);
*/
return reverseString(s, 0, s.length());
}
private static void reverse(char[] arr) {
for(int start = 0, end = arr.length - 1; start < end; start++, end--) {
swap(arr, start, end);
}
}
private static void reverse(char[] arr, int x, int y) {
for(int start = x, end = y-1; start < end; start++, end--) {
swap(arr, start, end);
}
}
private static void swap(char[] arr, int x, int y) {
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
} public static void main(String[] args) {
String s = "ab cd ";
sop("("+s+")");
sop("("+reverseString(s)+")");
sop("("+reverseString(s, 0, 3)+")");
} }
练习3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk"
示例代码如下:
/*
3、获取一个字符串在另一个字符串中出现的次数。"abkkcdkkefkkskk" 思路:
1、定义一个计数器
2、获取kk第一次出现的位置
3、从第一次出现的位置后剩余的字符串中继续获取kk出现的位置,每获取一次就计数一次
4、当获取不到时,计数完成 */
public class StringTest2 { public static void sop(String str) {
System.out.println(str);
} public static int getSubCount(String str, String key) {
int count = 0;
int index = 0; while((index = str.indexOf(key)) != -1 ) {
sop("str = " + str);
str = str.substring(index+key.length()); count++;
}
return count;
}
/*
* 方式二
*/
public static int getSubCount_1(String str, String key) {
int count = 0;
int index = 0; while((index = str.indexOf(key, index)) != -1) {
sop("index="+index);
index = index + key.length();
count++;
}
return count;
}
public static void main(String[] args) {
String str = "kkabkkcdkkefkks";
sop("count======"+str.split("kk").length);//不建议使用
sop("count="+getSubCount_1(str, "kk"));
}
}
练习4、获取两个字符串中最大相同子串。
示例代码如下:
/*
4、获取两个字符串中最大相同子串。第一个动作,将短的那个串进行长度一次递减的子串打印。
"abcwerthelloyuiodef"
"cvhellobnm"
思路:
1、将短的那个子串按照长度递减的方式获取到
2、将每获取到的子串去长串中判断是否包含,如果包含,已经找到
*/
public class StringTest3 { public static void sop(String str) {
System.out.println(str);
} public static String getMaxSubString(String s1, String s2) {
String max = "", min = "";
max = (s1.length() > s2.length())?s1:s2;
min = (max == s1)?s2:s1;
// sop("max="+max+"....min="+min);
for(int x = 0; x < min.length(); x++) {
for(int y =0, z = min.length() - x; z != s2.length()+1; y++, z++) {
String temp = min.substring(y, z);
// sop(temp);
if(max.contains(temp)) {
return temp;
}
}
}
return "";
}
public static void main(String[] args) {
String s1 = "abcwerthelloyuiodef";
String s2 = "cvhellobnm";
sop(getMaxSubString(s1, s2));
} }
StringBuffer
StringBuffer是字符串缓冲区,是一个容器。
特点:
- 长度可变化
- 可以直接操作多个数据类型
- 最终会通过toString()变成字符串
C(create)U(update)R(read)D(delete)
1、存储
StringBuffer append();---将指定的数据作为参数添加到已有数据的结尾处
StringBuffer insert(index, data);---可以将数据插入到指定index位置
2、删除
StringBuffer delete(start, end);---删除缓冲区中的数据,包含start,不包含end
StringBuffer deleteCharAt(index);---删除指定位置的字符
3、获取
char charAt(int index);
int indexOf(String str);
int lastIndexOf(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);
以下示例说明StringBuffer
public class StringBufferDemo { public static void main(String[] args) { // method_delete();
// method_update(); // StringBuffer sb = new StringBuffer("abcdef");
StringBuilder sb = new StringBuilder("abcdef");
char[] chs = new char[6]; sb.getChars(1, 4, chs, 1); for(int x = 0; x < chs.length; x++) {
sop("chs["+x+"]="+chs[x]+";");
}
} public static void method_add() {
StringBuffer sb = new StringBuffer();
sb.append("abc").append(true).append(34);//方法调用链
sb.insert(1, "qq");
sop(sb.toString());//abctrue34 // StringBuffer sb1 = sb.append(34);
// sop("(sb==sb1):"+(sb==sb1));//true
// sop(sb.toString());
// sop(sb1.toString());
}
public static void method_delete() {
StringBuffer sb = new StringBuffer("abcde");
// sb.delete(1, 3);
//清空缓冲区
// sb = new StringBuffer();
// sb.delete(0, sb.length()); // sb.delete(2, 3);
sb.deleteCharAt(2);
sop(sb.toString());
} public static void method_update() {
StringBuffer sb = new StringBuffer("abcde");
// sb.replace(1, 4, "java");
sb.setCharAt(2, 'k');
sop(sb.toString());
} public static void sop(String str) {
System.out.println(str);
} }
StringBuilder
JDK1.5版本之后,出现了StringBuilder。
StringBuffer与StringBuilder的区别:
- StringBuffer是线程同步的
- StringBuilder是线程不同步的
将StringBuilder的实例用于多个线程时是不安全的。如果需要这样的同步,则建议使用StringBuffer。
注意:以后开发,建议使用StringBuilder。
升级三个因素:
- 提高效率
- 简化书写
- 提高安全
基本数据类型对象包装类
byte | Byte |
short | Short |
int | Integer |
long | Long |
boolean | Boolean |
float | Float |
double | Double |
char | Character |
基本数据类型包装类的最常见作用:就是用于基本数据类型和字符串类型之间做转换。
基本数据类型转成字符串:
基本数据类型+"";
专业做法:基本数据类型的包装类.toString(基本数据类型值)
如:Integer.toString(34);//将整数34变成字符串"34";
字符串转成基本数据类型:
应用:文本框获取的数据都是字符串
xxx a = Xxx.parseXxx(String);
例如:
int a = Integer.parseInt("123");
double b = Double.parseDouble("12.23");
boolean b = Boolean.parseBoolean("true");
Integer i = new Integer("123");
int num = i.intValue();
十进制转成其他进制
toBinaryString();
toHexString();
toOctalString();
其他进制转成十进制
parseInt(String, radix);
示例代码:
public class IntegerDemo { public static void sop(String str) {
System.out.println(str);
}
public static void main(String[] args) {
//整数类型的最大值
// sop("int max : "+Integer.MAX_VALUE);
//将一个字符串转成整数
// int num = Integer.parseInt("123");//NumberFormatException,必须传入数字格式的字符串。
// long x = Long.parseLong("123");
// sop("num="+(num+4)); // sop(Integer.toBinaryString(6));
// sop(Integer.toBinaryString(-6));
// sop(Integer.toHexString(60)); int x = Integer.parseInt("3c", 16);
sop("x="+x);
} }
JDK1.5版本以后出现的新特性——装箱与拆箱
示例代码:
public class IntegerDemo1 {
public static void sop(String str) {
System.out.println(str);
}
public static void method() {
Integer x = new Integer("123"); Integer y = new Integer(123); sop("x==y:"+(x==y));
sop("x.equals(y):"+x.equals(y));
}
public static void main(String[] args) {
// Integer x = new Integer(4); Integer x = 4;//自动装箱 === new Integer(4); Integer x = null; x = x /*x.intValue()*/ + 2;//x+2:x进行了自动拆箱,变成了int类型,和2进行加法运算
//再将和进行装箱赋给x Integer m = 128;
Integer n = 128;
sop("m==n:"+(m==n));//false Integer a = 127;
Integer b = 127;
sop("a==b:"+(a==b));//结果为true。因为a和b指向了同一个Integer对象
//因为当数值在byte范围内时,对于新特性,如果该数值已经存在则不会再开辟新的空间 } }
String及其他的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- 从基础知识到重写Spring的Bean工厂中学习java的工厂模式
1.静态工厂模式其他对象不能直接通过new得到某个类,而是通过调用getInstance()方法得到该类的对象这样,就可以控制类的产生过程.顺带提一下单例模式和多例模式: 单例模式是指控制其他对象获 ...
- php更新修改excel中的内容例子
代码如下 复制代码 //模板存放目录$dir = $DOCUMENT_ROOT.'/backoffice/admin/oemcheck/'; $templateName = '1.xlsx';$ou ...
- Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程
这篇文章主要介绍了Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运行环境搭建教程,需要的朋友可以参考下 准备篇 一.环境说明: 操作系统:Windows Server 201 ...
- php win主机下实现ISAPI_Rewrite伪静态
有的win主机iss不支持 .htaccess 文件, 我在这里指的不是本地 在本地的话用apmserv服务器可以用.htaccess 文件,用apmserv服务器环境配置伪静态可以看 php 伪静态 ...
- Delphi XE5教程7:单元引用和uses 子句
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- C语言文件函数
FILE *fp: 其中的FILE应该大写,它实际上是系统定义的一个结构,在stdio.h文件中.该结构中有文件名,文件状态,文件当前的读写信息等. fp是指向FILE结构的指针变量,通过fp可以找到 ...
- 用Python作GIS之三:入口程序 - stargui.py
"""gui start file for Space-Time Analysis of Regional Systems#STARS的图形用户界面入口(高级用户可以直接 ...
- Virtualbox中安装Openwrt
Virtualbox:https://www.virtualbox.org/wiki/DownloadsOpenwrt:http://downloads.openwrt.org/backfire/10 ...
- glog使用
How To Use Google Logging Library Glog 的基本使用方法在google code上有介绍:How To Use Google Logging Library ;最好 ...
- 【img】 图片是怎么存储的
用ue 打开一张图片,动动手脚,出现卡碟的画面效果. 可不可以用C#来做一个图片编辑器? 怎么做?路线怎么走? 稍后揭晓答案 根据实际操作获取类一些基础知识: 1. 文件是二进制存储的,为了便于查看编 ...