java中java字符串分割成数组和字符数组的区别

java的字符常量和字符串常量有何区别
java的字符常量和字符串常量有何区别
09-03-03 &匿名提问
ava.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。 StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append(&le&) 会使字符串缓冲区包含“startle”,而 z.insert(4, &le&) 将更改字符串缓冲区,使之包含“starlet”。 通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。 只要发生有关源序列(如在源序列中追加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。 每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。 例如,如果 z 引用一个当前内容为“start”的字符串生成器对象,则该方法调用 z.append(&le&) 将使字符串生成器包含“startle”,而 z.insert(4, &le&) 将更改字符串生成器,使之包含“starlet”。
请登录后再发表评论!下次自动登录
现在的位置:
& 综合 & 正文
三分钟理解Java中字符串(String)的存储和赋值原理
可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解。
1.在看例子之前,确保你理解以下几个术语:
栈:由JVM分配区域,用于保存线程执行的动作和数据引用。栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应。
堆:由JVM分配的,用于存储对象等数据的区域。
常量池:在编译的阶段,在堆中分配出来的一块存储区域,用于存储显式的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。
2.看这个例子,用JDK5+junit4.5写的例子,完全通过测试
import static org.junit.Assert.assertNotSimport static org.junit.Assert.assertS
import org.junit.T
* @author Heis
*/public class StringTest{
public void testTheSameReference1(){
String str1="abc";
String str2="abc";
String str3="ab"+"c";
String str4=new String(str2);
//str1和str2引用自常量池里的同一个string对象
assertSame(str1,str2);
//str3通过编译优化,与str1引用自同一个对象
assertSame(str1,str3);
//str4因为是在堆中重新分配的另一个对象,所以它的引用与str1不同
assertNotSame(str1,str4);
第一个断言很好理解,因为在编译的时候,"abc"被存储在常量池中,str1和str2的引用都是指向常量池中的"abc"。所以str1和str2引用是相同的。
第二个断言是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。
str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。
另一种说法,求大神指点
JVM内存分四种:
1、栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,的值等,具体方法执行结束之后,系统自动释放JVM内存资源
2、堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
3、静态区(datasegment)—存放,和,不释放
4、代码区(codesegment)—存放程序中方法的,而且是多个对象共享一个代码空间区域
在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的后,java会自动释放掉为该变量所分配的JVM内存空间;在堆中分配的JVM内存由的自动器来管理,堆的优势是可以动态分配JVM内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配JVM内存的。缺点就是要在运行时动态分配JVM内存,存取速度较慢;栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
◆java堆由Perm区和Heap区组成,Heap区则由Old区和New区组成,而New区又分为Eden区,From区,To区,Heap={Old+NEW={Eden,From,To}},见图1所示。
Heap区分两大块,一块是NEWGeneration,另一块是OldGeneration.在NewGeneration中,有一个叫Eden的空间,主要是用来存放新生的对象,还有两个SurvivorSpaces(from,to),它们用来存放每次后存活下来的对象。在OldGeneration中,主要存放应用程序中生命周期长的JVM内存对象,还有个PermanentGeneration,主要用来放JVM自己的反射对象,比如和方法对象等。
在NewGeneration块中,垃圾回收一般用Copying的,速度快。每次GC的时候,存活下来的对象首先由Eden拷贝到某个SurvivorSpace,当SurvivorSpace空间满了后,剩下的live对象就被直接拷贝到OldGeneration中去。因此,每次GC后,EdenJVM内存块会被清空。在OldGeneration块中,垃圾回收一般用mark-compact的算法,速度慢些,但减少JVM内存要求.
垃圾回收分多级,0级为全部(Full)的垃圾回收,会回收OLD段中的垃圾;1级或以上为部分垃圾回收,只会回收NEW中的垃圾,JVM通常发生于OLD段或Perm段垃圾回收后,仍然无JVM内存空间容纳新的Java对象的情况。
JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:当应用程序线程空闲;另一个是JVM内存堆不足时,会不断调用GC,若连续回收都解决不了JVM内存堆不足的问题时,就会报outofmemory错误。因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。为了避免这些问题,程序的设计和编写就应避免垃圾对象的JVM内存占用和GC的开销。显示调用System.GC()只能建议JVM需要在JVM内存中对垃圾对象进行回收,但不是必须马上回收,一个是并不能解决JVM内存资源耗空的局面,另外也会增加GC的消耗。
◆当一个URL被访问时,JVM内存区域申请过程如下:
A.JVM会试图为相关Java对象在Eden中初始化一块JVM内存区域
B.当Eden空间足够时,JVM内存申请结束。否则到下一步
C.JVM试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区
D.Survivor区被用来作为Eden及OLD的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区
E.当OLD区空间不够时,JVM会在OLD区进行完全的垃圾收集(0级)
F.完全垃圾收集后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建JVM内存区域,则出现"outofmemory错误"
&&&&推荐文章:
【上篇】【下篇】java 字符串split有很多坑,使用时请小心!! -
- ITeye博客
博客分类:
System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符全部忽略
System.out.println(":ab:cd:ef::".split(":",-1).length);//不忽略任何一个分隔符
System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//最前面的和末尾的分隔符全部都忽略,apache commons
System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//不忽略任何一个分隔符 apache commons
看了下jdk里String类的public String[] split(String regex,int limit)方法,感觉平时不太会用这方法,以为在用正则表达式来拆分时候,如果匹配到的字符是最后一个字符时,会拆分出两个空字符串,例如"o"split("o",5) or "o"split("o",-2)时候 结果是"" "" 也就是下图中红框里的内容,所以平时一般都用split(String regex) 方法,其实也就等同于split(String regex,0)方法,把结尾的空字符串丢弃!
String的split方法用到的参数是一个正则式,虽然强大,但是有时候容易出错。而且string并没有提供简化版本。mons.lang.StringUtils提供的split改变了这一状况,开始使用完整的字符串作为参数,而不是regex。同时,对类似功能的jdk版本的StringTokenizer,在内部方法splitWorker中有段注释:Direct code is quicker than StringTokenizer.也就是说,这个是更快的一个工具了~~
StringUtils里的split和splitPreserveAllTokens 底层都是调用splitWorker方法实现的
下面分别来理解下两个私有的splitWorker方法:
private static String[] splitWorker(String str, char separatorChar, boolean preserveAllTokens)
// Performance tuned for 2.0 (JDK1.4)
if (str == null) {
int len = str.length();
if (len == 0) {
return ArrayUtils.EMPTY_STRING_ARRAY;
List list = new ArrayList();
int i = 0, start = 0;
boolean match =
boolean lastMatch =
while (i & len) {
if (str.charAt(i) == separatorChar) {
if (match || preserveAllTokens) {
list.add(str.substring(start, i));
lastMatch =
start = ++i;
lastMatch =
if (match || (preserveAllTokens && lastMatch)) {
list.add(str.substring(start, i));
return (String[]) list.toArray(new String[list.size()]);
}是一个核心方法,用于拆分字符串,其中字符c表示分隔符,另外布尔变量b表示c在首尾的不同处理方式。为真,则在首位留一个""的字符串。但是在中间是没有作用的。该方法执行如下操作:
& 如果字符串为null,则返回null。
& 如果字符串为"",则返回""。
& 用i作为指针遍历字符串,match和lastMatch分别表示遇到和最后遇到可分割的内容。
&&& 如果字符串中第一个就遇到c,则看b的值,如果为真,则会在结果数组中存入一个""。如果没遇到,match置真,lastMatch置假,表示有要分割的内容。
&&& 一旦遇到c,则在结果数组中输出字符串在i之前的子字符串,并把起始点调整到i之后。且match置假,lastMatch置真。
& 遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符是c),则输出最后的部分(如果是后者,则会输出一个"")。
private static String[] splitWorker(String str, String separatorChars, int max, boolean preserveAllTokens)
// Performance tuned for 2.0 (JDK1.4)
// Direct code is quicker than StringTokenizer.
// Also, StringTokenizer uses isSpace() not isWhitespace()
if (str == null) {
int len = str.length();
if (len == 0) {
return ArrayUtils.EMPTY_STRING_ARRAY;
List list = new ArrayList();
int sizePlus1 = 1;
int i = 0, start = 0;
boolean match =
boolean lastMatch =
if (separatorChars == null) {
// Null separator means use whitespace
while (i & len) {
if (Character.isWhitespace(str.charAt(i))) {
if (match || preserveAllTokens) {
lastMatch =
if (sizePlus1++ == max) {
lastMatch =
list.add(str.substring(start, i));
start = ++i;
lastMatch =
} else if (separatorChars.length() == 1) {
// Optimise 1 character case
char sep = separatorChars.charAt(0);
while (i & len) {
if (str.charAt(i) == sep) {
if (match || preserveAllTokens) {
lastMatch =
if (sizePlus1++ == max) {
lastMatch =
list.add(str.substring(start, i));
start = ++i;
lastMatch =
// standard case
while (i & len) {
if (separatorChars.indexOf(str.charAt(i)) &= 0) {
if (match || preserveAllTokens) {
lastMatch =
if (sizePlus1++ == max) {
lastMatch =
list.add(str.substring(start, i));
start = ++i;
lastMatch =
if (match || (preserveAllTokens && lastMatch)) {
list.add(str.substring(start, i));
return (String[]) list.toArray(new String[list.size()]);
}也是一个核心方法,用于拆分字符串,其与上一个方法的不同之处在于其分隔符用字符串表示一组字符,且增加一个max变量,表示输出的字符串数组的最大长度。另外注意该方法的b如果为真,会在首尾及中间起作用,且如果分隔符字符串长度大于1,则数组中的""会更多(根据分隔符字符的数量)。该方法执行如下操作:
& 如果字符串为null,则返回null。
& 如果字符串为"",则返回""。
& 之后的处理分三种情况,分别是分隔符字符串为null,则默认为" ";分割符字符串长度为1;分割符字符串为普通字符串。这三种处理的不同只是在当前遍历中的字符的判断问题。
&&& 1.利用Character.isWhitespace方法判断每个字符是否为" "。
&&& 2.先把字符串转化为一个char,然后就和前一个splitWorker方法类似。
&&& 3.利用indexOf方法查找当前字符是否在分隔符字符串中,然后就和前一个splitWorker方法类似。
&&& 需要注意的是,如果输出的数组的数量已经等于max的值,则把指针直接挪到最后,等待下次遍历的时候直接跳出。同时由于lastMatch和match都置为假,最后也不会输出""了。
&& 遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符在分隔符字符串中),则输出最后的部分(如果是后者,则会输出一个"")。
浏览 50842
[u][i][b]1[color=red]1[size=xx-large]1[align=right]1[/align][/size][/color][/b][/i][/u][/list][/url][/img][/flash][/align][/size][/color]&&&&&&&&&&&&&&&&
[u][i][b][u]引用[list]
[*][*][*][*][*][*]
[*][*][*][*][*][/list][/u][/b][/i][/u][*][*][*][/list][*][*][/list][*][/list][/list][/list]
浏览: 175121 次
来自: 杭州
[color=red][size=xx-large][alig ...
讲的很好 看头像还是个女的 真是牛逼
写的什么狗屎
很好,感谢分享与总结,谢谢!
[list][list][*][list][*][*][lis ...在js声明var和不声明var的区别,JS和java删除数组字符串重复数组 -
- ITeye博客
var 声明的变量,作用域是当前 function
没有声明的变量,直接赋值的话, 会自动创建变量
但作用域是全局的.
//-----------------
function doSth() {
a = "AAA";
}
doSth(); // 执行一次 doSth
alert(a); // 可以看到 "AAA"
//-----------------
如果用了 var
//-----------------
function doSth() {
var a = "AAA";
}
doSth(); // 执行一次 doSth
alert(a); // 出错!!! 变量未定义, 因为 doSth 中声明的变量作用域只是 doSth 函数.
js数组中去除重复值
详细出处参考:http://www.jb51.net/article/25939.htm
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."
typeof 语法中的圆括号是可选项。
Array.prototype.del = function() {
var a = {}, c = [], l = this.
for (var i = 0; i & i++) {
var b = this[i];
var d = (typeof b) +
if (a[d] === undefined) {
c.push(b);
alert([1, 1, 2, 3, 4, 5, 4, 3, 4, 4, 5, 5, 6, 7].del());
alert(["ad","bc","cd","ad"].del());
&/script&
方法二:
js数组中去除重复值
//去重复数组
var arr = ["123","123","123","123","sfsdf","123","345","123","123","345","456","567","sdc"];
var str = [];
for(var i = 0,len = arr.i &i++){
! RegExp(arr[i],"g").test(str.join(",")) && (str.push(arr[i]));
alert(str);
详细出处参考:http://www.jb51.net/article/25939.htm
function districtArray(array){&
&&&& var result = new Array();&
&&&& for(var i in array){&
&&&&&&&& if(result.indexOf(array[i]) == -1){&
&&&&&&&&&&&& result.push(array[i]);&
&&&&&&&& }&
Array.prototype.distinct = function(){
var o1 = {};
var o2 = {};
var o3 = [];
for(var i=0;o = $[i];i++){
& if(o in o1){
&& if(!(o in o2)) o2[o] =
&& delete $[i];
&& o1[o] =
$.length = 0;
for(o in o1){
& $.push(o);
for(o in o2){
& o3.push(o);
return o3;
var a = [2,2,2,3,3,3,4,4,5,6,7,7];
alert("原数组:" + a);
alert("有重复的元素是:" + a.distinct());
alert("整理后的数组是:" + a);
alert("整理后的长度是:" + a.length)
详细出处参考:http://www.jb51.net/article/13727.htm
Javacode 删除重复数组的字符串
import java.util.A
import java.util.L
import java.util.LinkedL
public class Tests {&
&&& public static String[] array_unique(String[] a) {
&&&&&&& // array_unique
&&&&&&& List&String& list = new LinkedList&String&();
&&&&&&& for(int i = 0; i & a. i++) {
&&&&&&&&&&& if(!list.contains(a[i])) {
&&&&&&&&&&&&&&& list.add(a[i]);
&&&&&&&&&&& }
&&&&&&& }
&&&&&&& return (String[])list.toArray(new String[list.size()]);
&&& }
&&&
&&& public static void main(String[] args) {
&&&&&&& String[] ar = {"dd","cc","ee","ff","gg","cc","ee"};
&&&&&&& String[] s = array_unique(ar);
&&&&&&& for(String aa : s) {
&&&&&&&&&&& System.out.print(aa+" ");
&&&&&&& }
&&& }&&&
浏览: 189576 次
来自: 上海
问一下,如果1替换成 M2替换成 N3替换成 O那其实不要这样 ...
lomboz 目录我也没有看到
我安装好tomact插件但是没有看到web那个目录!在网上查了 ...
亲爱的楼主 为什么 java -cp &D:\TDd ...}

我要回帖

更多关于 java定义字符串数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信