----------- Android培训、Java培训、Java学习型技术博客、期待与您交流! ------------
Java的字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类
1.String不属于8种基本数据类型,String是一个对象,因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。
2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
3.创建字符串的方式很多,归纳起来有三类:
(1)使用new关键字创建字符串,比如String s1 = new String("jeek");
(2)直接指定。比如String s2 = "jeek";
(3)使用串联生成新的字符串。比如String s3 = "je" + "ek";
4.String str="jeek";和String str=new String ("jeek");的区别:这就涉及到了常量池这个概念.
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于 类、方法、接口等中的常量,也包括字符串常量。
例:
String s0=”jeek”;
String s1=”jeek”;
String s2=”je” + “ek”;
System.out.println( s0==s1 );
System.out.println( s0==s2 );
结果都为true.
首先,我们要知结果为道Java会确保一个字符串常量只有一个拷贝。
因为例子中的s0和s1中的”jeek”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true; 而”je”和”ek”也都 是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所 以s2也同样在编译 期就被解 析为一个字符串常量,所以s2也是常量池中”jeek”的一个引用。 所以我们得出 s0==s1==s2;
用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池 中,它们 有自己的地址空间。
例:
String s0=”jeek”;
String s1=new String(”jeek”);
String s2=”je” + new String(“ek”);
System.out.println( s0==s1 );
System.out.println( s0==s2 );
System.out.println( s1==s2 );
上述打印结果都为false.
例中s0还是常量池中”jeek”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”jeek”的引用,s2因 为有后 半部分new String(“ek”)所以也无法在编译期确定,所以也是一个新创建对象”jeek”的应用;明白了这些 也就知 道为何得 出此结果了。
String对象的创建原理
原理1:当使用任何方式来创建一个字符串对象s时,Java运行时(运行中JVM)会拿着这个X在String池中找是否 存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。
原理2:Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
原理3:使用直接指定或者使用纯字符串串联来创建String对象,则仅仅会检查维护String池中的字符串,池中没有 就在池中创建一个,有则罢了!但绝不会在堆栈区再去创建该String对象。
原理4:使用包含变量的表达式来创建String对象,则不仅会检查维护String池,而且还会在堆栈区创建一个String 对象。
另外,String的intern()方法是一个本地方法,定义为public native String intern(); intern()方法的价值在于让开发者 能将注意力集中到String池上。当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象 由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对 象的引用。
String类的不可变
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如String name= "jeek " ;现在修改为name="wong";
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个 "jeek "没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
String类中常用方法
1.charAt方法:该方法的作用是按照索引值(规定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),获得字符串中的指定字符.
eg: String s = "jeek";
char c = s.chatAt(1);则变量c的值是'e'.
2.compareTo方法:该方法的作用是比较两个字符串的大小,比较的原理是依次比较每个字符的字符编码。首先比较两个字符串的第一个字符,如果第一个字符串的字符编码大于第二个的字符串的字符编码,则返回大于0的值,如果小于则返回小于0的值,如果相等则比较后续的字符,如果两个字符串中的字符编码完全相同则返回0。还存在一个类似的方法compareToIgnoreCase,这个方法是忽略字符的大小写进行比较,比较的规则和compareTo一样.
3.concat方法:该方法的作用是进行字符串的连接,将两个字符串连接以后形成一个新的字符串.
eg:
String s = "jeek";
String s1 = "wong";
String s2 = s.concat(s1);
则连接以后生成的新字符串s2的值是"jeekwong",而字符串s和s1的值不发生改变。
如果需要连接多个字符串,可以使用如下方法:
String s = "jeek";
String s1 = "wong";
String s2 = "iteye;
String s3 = s.concat(s1).concat(s2);
则生成的新字符串s3的值为"jeekwongiteye".
其实在实际使用时,语法上提供了一种更简单的形式,就是使用"+"进行字符串的连接。例如:String s = "jeek" + "wong";则字符串s的值是"jeekwong",这样书写更加简单直观。而且使用"+"进行连接,不仅可以 连 接字符串,也可以连接其他类型。但是要求进行连接时至少有一个参与连接的内容是字符串类型。而 且"+"匹配的顺序是从左向右,如果两边连接的内容都是基本数字类型则按照加法运算,如果参与连接的内容有 一个是字符串才按照字符 串进行连接。
int a = 123;
String s = "jeek" + a + 1;
则连接以后字符串s的值是"jeek1231",计算的过程为首先连接字符串"jeek"和变量a的值,生成字符 串"jeek123",然后使用该字符串再和数字1进行连接生成最终的结果。
而如下代码:
int a = 10;
String s = a + 5 + "123";
则连接以后字符串s的值是"15123",计算的过程为首先计算a和数字5,由于都是数字型则进行加法运算或者数 字值15,然后再使用数字值15和字符串"123"进行连接获得最终的结果。
而下面的连接代码是错误的:
int a = 12;
String s = a + 5 + 's';
因为参与连接的没有一个字符串,则计算出来的结果是数字值,在赋值时无法将一个数字值赋值给字符串
4.endsWith方法:该方法的作用是判断字符串是否以某个字符串结尾,如果以对应的字符串结尾,则返回true
5.equals方法:该方法的作用是判断两个字符串对象的内容是否相同。如果相同则返回true,否则返回false
6.getBytes方法:该方法的作用是将字符串转换为对应的byte数组,从而便于数据的存储和传输.
public class StringDemo
{
public static void main(String[] args)
{
//练习模拟trim方法,去除空格
trim();
//将字符串反转
reverseString();
//将字符串局部反转
reverseSubString();
}
public static void reverseSubString()
{
String str = "jeek wong";
//012345678
//char[] chs = str.toCharArray();
reverseSub(str, 5, 8);
System.out.println(str);
}
public static void reverseSub(String str, int start, int end)
{
String subString = str.substring(start, end);//5.7 won
String subStringReverse = reverse(subString.toCharArray());
str.replace(subString, subStringReverse);
}
public static void trim()
{
String str = " jeek wong ";
System.out.println(str);
System.out.println("-----------------");
int start = 0;
int end = str.length() - 1;
while(start <= end && str.charAt(start) == ' ')
start++;
while(start <=end && str.charAt(end) == ' ')
end--;
str = str.substring(start, end + 1);
System.out.println(str);
}
public static void reverseString()
{
//将字符串变为数组,将数组反转,将数组变为字符串
String str = "jeek wong";
char[] chs = str.toCharArray();
reverse(chs);
System.out.println(new String(chs));
}
private static String reverse(char[] arr)//won
{
for(int start = 0, end = arr.length - 1; start < end; start++, end--)
{
swap(arr, start, end);
}
return new String(arr);//now
}
private static void swap(char[] arr, int x, int y)
{
char temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
7.indexOf方法:该方法的作用是查找特定字符或字符串在当前字符串中的起始位置,如果不存在则返回-1
8.length方法:该方法的作用是返回字符串的长度,也就是返回字符串中字符的个数。中文字符也是一个字符
9.replace方法:该方法的作用是替换字符串中所有指定的字符,然后生成一个新的字符串。经过该方法调用以后,原来的字符串不发生改变.
10.split方法:该方法的作用是以特定的字符串作为间隔,拆分当前字符串的内容,一般拆分以后会获得一个字符串数组.
public class StringTest2
{
public static void main(String[] args)
{
//String str = "huangjing";
//System.out.println(getSubCount(str, 'p'));
// String str1 = "hhuuaannhhggjjiinngghhkkoonn";
// System.out.println(getSubStringCount_1(str1, "hh"));
split();
}
//获取字符串中某个字符的个数
public static int getSubCount(String str, char key)
{
int num = 0;
char[] chs = str.toCharArray();
if(!(str.indexOf(key) == -1))
{
for(int i = 0; i < chs.length; i++)
{
if(chs[i] == key)
num++;
}
}
return num;
}
//获取某个字符串中子串的个数方式一
public static int getSubStringCount(String str, String key)
{
int count = 0;
int index = 0;
while((index = str.indexOf(key)) != -1)
{
str = str.substring(index + key.length());
System.out.println("str=" + str);
count++;
}
return count;
}
//获取某个字符串中子串的个数方式二
public static int getSubStringCount_1(String str, String key)
{
int count = 0;
int index = 0;
while((index = str.indexOf(key, index)) != -1)
{
index = index + key.length();
//System.out.println("str=" + str);
count++;
}
return count;
}
public static void split()
{
String str1 = "aabbcc";
System.out.println(str1.split("aa").length);//2
String str2 = "bbccaa";
System.out.println(str2.split("aa").length);//1
//注意两者切割的不同
}
11.startsWith方法:该方法的作用和endsWith方法类似,只是该方法是判断字符串是否以某个字符串作为开 始.
12.substring方法:该方法的作用是取字符串中的“子串”,所谓“子串”即字符串中的一部分.
/*
* 求两个字符串中最长的相同字串//
*/
public class StringTest3
{
public static void main(String[] args)
{
String str1 = "abcdefg";
String str2 = "abdcef";
System.out.println(maxLength(str1, str2));
}
public static String maxLength(String str1, String str2)
{
for(int x = 0; x < str2.length(); x++)
{
for(int y = 0, z = str2.length() - x; z <= str2.length(); y++, z++)
{
String temp = str2.substring(y, z);
System.out.println(temp);
//
// if(str1.contains(temp))
// return temp;
}
}
return "";
}
}
13.toCharArray方法:该方法的作用和getBytes方法类似,即将字符串转换为对应的char数组
StringBuffer和StringBuilder
package cn.itcast.day;
/*
* StringBuffer是字符串缓冲区,是一个容器,
* 1.长度是可以变化的,
* 2.可以添加任意类型的数据
* 3.最后全部由toString()变为字符串
* CURD create update read delete
*
* 增加append()方法没有byte和short参数 方法调用链
*
* 插入insert() 存在index才可以插入
*
* 删除delete(start, end)删除缓冲区中指定数据
* deleteCharAt(index)
* 清空缓冲区 sb = new StringBuffer();
* 全部清空sb.delete(0, sb.length)
*
* 获取
* charAt(index)
* indexOf(String)
* length
* String subString(start, end)
*/
public class StringBufferDemo
{
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer();
sb.append(32).append("aca");
sb.insert(1, "qq");
sb.delete(1, 3);
sb.deleteCharAt(2);
// StringBuffer sb1 = sb.append(32);
//
System.out.println(sb);
// System.out.println(sb1);
}
}
/*
* StringBuilder JDK1.5
* StringBuffered线程同步
* StringBuilder线程不同步.
*
* 升级:
* 1.提高效率
* 2.简化书写
* 3.提高安全性
*
*/
Done...
发表评论
-
黑马程序员_Java多线程通信基础
2012-12-14 16:46 1284----------- Android培训、Java培训、Ja ... -
黑马程序员_Java多线程基础
2012-12-14 10:42 842----------- Android培训、Java培训、Ja ... -
黑马程序员_IO(Input/Output)流 学习笔记
2012-12-08 16:58 01.IO流用来处理设备之间的数据. 2.Java对数据的操作 ... -
黑马程序员_模拟文本转换服务器
2012-12-06 12:43 1049----------- Android培训、Java培训 ... -
黑马程序员_模拟文本转换服务器
2012-12-06 12:16 2----------- Android培训、Java培训、Ja ... -
黑马程序员_自定义字节流的缓冲区
2012-12-05 12:23 1716----------- Android培训、Java培训、J ... -
黑马程序员-Title
2012-12-14 15:49 0----------- Android培训、Java培训、Ja ...
相关推荐
Java 8是Java语言发展的一个重要里程碑,引入了许多创新性的特性和改进,...黑马程序员的Java8新特性详解笔记和源码提供了深入学习这些概念的资源,结合实际的代码示例,将有助于你更好地理解和掌握Java 8的核心特性。
在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...
"黑马程序员_(适合初学者入门的Java基础视频)"是一套专为初学者设计的Java基础教学课程,旨在帮助零基础的学习者逐步掌握Java编程的基本概念和技能。 该视频教程涵盖了Java的基础知识,包括: 1. **环境搭建**:...
### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...
在本教程“黑马程序员_毕向东_Java基础视频教程第18天-11-IO流(文本文件读取方式二)”中,主讲人毕向东将深入讲解如何使用Java有效地读取文本文件,特别是第二种常用的方法。以下是关于Java IO流和文本文件读取的...
"黑马程序员Javase笔记"是一个自学者在学习黑马程序员提供的Java全套课程过程中整理的笔记,主要涵盖了Java Standard Edition (Javase) 的核心内容。下面将详细讨论其中的关键知识点。 首先,DOS命令是操作系统中的...
### 黑马程序员入学Java知识(精华总结) #### 一、Java概述与基础知识 ##### 1、何为编程? 编程是指使用计算机语言来编写指令,这些指令被计算机执行以完成特定任务的过程。通过编程,我们可以控制计算机的行为...
- `classpath`:用于指定Java程序在运行时的类搜索路径,包括程序类和第三方库类的位置。 ### 第三部分面试题 #### 47. collection和collections的区别 - `Collection`:接口,是Java集合框架的基础接口之一。 - `...
本套教程“2018年黑马程序员全套Java教程”针对的是第二天的学习内容,主要涵盖了数据类型转换、算数运算符、比较运算符、逻辑运算符以及三元运算符,同时也涉及到了简单方法的定义与调用。这些知识点是Java编程的...
《黑马程序员毕向东Java基础课堂完整版文档》是一份全面且深入的Java学习资源,由知名教育机构黑马程序员的讲师毕向东倾力打造。这份资料涵盖了从Java编程基础到高级特性的全过程,旨在帮助初学者系统地掌握Java编程...
"黑马程序员入学Java知识——精华总结"这份文档很可能包含了Java编程的基础到进阶的知识点,旨在帮助初学者快速掌握Java的核心概念和技能。 1. **Java基础知识**:Java是一种面向对象的语言,它的基础包括语法、...
Java自学宝典是针对初学者和有一定基础的学习者设计的一套完整的Java学习资源,由知名的教育机构黑马程序员出品。这份源代码压缩包包含了书中各个章节的实例代码,旨在帮助学习者深入理解Java编程语言的核心概念和...
### 黑马程序员入学Java知识 #### Java概述与基础知识 1. **何为编程?** - 编程是通过特定的计算机语言来编写指令,让计算机执行一系列任务的过程。 2. **Java语言概述,历史、特点** - **概述**:Java是一种...
### 黑马程序员Java基础视频辅导班Day01知识点总结 #### Java的跨平台特性与JVM 1. **Java的跨平台性**:Java语言能够实现跨平台运行的关键在于Java虚拟机(JVM),即Java代码可以在任何安装了对应JVM的操作系统上...
《黑马程序员面试宝典(java)2018版》是一本专门为Java开发者准备的面试指南,涵盖了大量在面试过程中可能遇到的问题和知识点。这本宝典由黑马程序员机构精心编纂,汇集了近万名学员的实际面试经验,为求职者提供了...
- 键盘输入通常有三种方式:命令行参数`String[] args`、`BufferedReader`通过IO流读取、`Scanner`类从`System.in`获取输入。`Scanner`的使用步骤包括导入包,创建对象,然后调用相应方法接收数据。 5. **switch...
综上所述,黑马程序员Java面试宝典2019最新版本为应聘者提供了一整套全面的Java面试知识点,详细解释了包括面向对象编程、Java基础语法、多态性、异常处理、常用API以及数据类型在内的多个重要领域。通过学习这些...