---------------------------------------------------------

ArrayList<String> arrayList = new ArrayList<String>(10);
System.out.println(arrayList.size());

大家猜,打印结果会是什么?会是10吗?

答案:0

因为,new ArrayList<String>(10),只是告诉jvm分配10个Stirng的空间出来,arrayList 不是null而已。此时的arrayList 无任何内容!

---------------------------------------------------------

为什么说JDK中处理String的indexOf()方法效率低,建议不要使用?  今天探了个究竟。

上源码!

static int indexOf(char[] source, int sourceOffset, int sourceCount,
char[] target, int targetOffset, int targetCount,
int fromIndex) {
if (fromIndex >= sourceCount) {
return (targetCount == 0 ? sourceCount : -1);
}
if (fromIndex < 0) {
fromIndex = 0;
}
if (targetCount == 0) {
return fromIndex;
} char first = target[targetOffset];
int max = sourceOffset + (sourceCount - targetCount); for (int i = sourceOffset + fromIndex; i <= max; i++) {
/* Look for first character. */
if (source[i] != first) {
while (++i <= max && source[i] != first);
} /* Found first character, now look at the rest of v2 */
if (i <= max) {
int j = i + 1;
int end = j + targetCount - 1;
for (int k = targetOffset + 1; j < end && source[j]
== target[k]; j++, k++
); if (j == end) {
/* Found whole string. */
return i - sourceOffset;
}
}
}
return -1;
}

真整齐啊!

上来就看到了两个for循环。问题必然出在这里!和KMP算法不同,这明显是简单粗暴的loop index。为什么没采用复杂度为O(m+n)的KMP算法?估计时间问题吧。

以后注意尽量避免indexOf()方法。

顺便窥探了下subString()方法的实现:

上源码!

public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
} public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}

怪不得效率较高,原来用到了Arrays.copyOfRange()方法。

---------------------------------------------------------

一道非常老的面试题:

从字符串str1中找出子字符串str2出现的次数。比如:

String str1 = "sgiccomcocmcomomameadjcomfjecomcomcomcijr";
String str2 = "com";

自己想到的方法如下:

//暴力匹配
//KMP算法
//subString
//split
//RegEx(may be the best)

这其中,RegEx(正则匹配)的效率是最高的(个人理解)。而且实现起来也很简单,如下:

String str1 = "sgiccomcocmcomomameadjcomfjecomcomcomcijr";
String str2 = "com";
int times = 0;
Pattern pattern = Pattern.compile(str2);
Matcher matcher = pattern.matcher(str1);
while (matcher.find()) {
times++;
System.out.println(matcher.group());
}
System.out.println(times);

---------------------------------------------------------

7/30

刚刚正在探索KMP算法,然后有经验的同事过来看看究竟。不过扯出了另外一个话题,正则的效率不一定高!用他的话说,java代码需要JVM进行解释,那正则表达式也是需要解释器的(可以这么理解),所以效率很可能会低的。

另外,String类中也存在matches()方法,遂对该方法和Pattern中的matches()进行了对比。

代码如下:

public static void main(String[] args){
String string = "ddenfj#@fe_dw.comw";
int count = 100000;
long before = System.currentTimeMillis();
Runtime runtime = Runtime.getRuntime();
long r1 = runtime.totalMemory();
for (int i = 0; i < count; i++) {
string.matches("^([\\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
}
long r2 = runtime.totalMemory();
long end = System.currentTimeMillis();
System.out.println("the memory of match() in String is = " + (r2-r1)/1024);
System.out.println("the time of match() in String is = " + (end-before)); //Pattern
Pattern pattern = Pattern.compile("^([\\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((\\.[a-zA-Z0-9_-]{2,3}){1,2})$");
before = System.currentTimeMillis();
r1 = runtime.totalMemory();
for (int i = 0; i < count; i++) {
pattern.matcher(string).matches();
}
r2 = runtime.totalMemory();
end = System.currentTimeMillis();
System.out.println("the memory of match() in Pattern is = " + (r2-r1)/1024);
System.out.println("the time of match() in Pattern is = " + (end-before));
}

在count=100000的情况下,发现结果如下:

the memory of match() in String is = 92416
the time of match() in String is = 327
the memory of match() in Pattern is = 0
the time of match() in Pattern is = 26

结果让我吃惊!String类中的matches()方法相对于Pattern类中的matches()方法,简直不能用!

究其原因:String类中的matches()方法调用了Pattern.matches(regex, this),而该方法的实现如下:

public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}

强调部分的重复执行会占用大量内存。

而且该方法的解释中:If a pattern is to be used multiple times, compiling it once and reusing it will be more efficient than invoking this method each time.

总之,String类中的matches()方法不要使用!

---------------------------------------------------------

今天同事问了个问题:不同版本的jar包,能同时存在吗?如果能的话,应该加载的哪个?

做了个实验,把poi-3.10-beta2.jar和poi-3.10-FINAL.jar(我把名称改为chris.jar)放在lib文件夹下,编译没错,证明可以共存。

但是使用哪个jar包呢?最新的。怎么区分最新的?根据版本号?

最后证明编译器仍然使用chris.jar下的class文件。

结论:当不同版本的jar包共存时,编译器将根据class的时间以及META-INF下的信息区分哪个jar包是最新的,并加载之。

---------------------------------------------------------

 

java乱炖的更多相关文章

  1. HTM CSS 笔记乱炖

    一.常用实体(字符转义) '<' == '<' '©' == '©' '>' == '>' '"' == '"' ' ' == ' ' '®' == '®' ...

  2. Jerry的ABAP, Java和JavaScript乱炖

    写这个系列的初衷是SAP Chengdu office有越来越多的应届毕业生加入,这些新同事通过在大学的专业学习,具备了Java和JavaScript背景,但是进入SAP之后大家觉得ABAP没有Jav ...

  3. Anliven - 乱炖

    001 --- Ping Yourself! 由TCP/IP协议栈而想到的: 你的"协议分层"是如何的?有谁或者什么事务所对应着?谁先谁后,什么重要? 你的"协议栈&qu ...

  4. [PHP知识点乱炖]四、全局变量——小偷从良记

    本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...

  5. VAO VBO IBO大乱炖

    最近对程序中绘制卡顿的问题忍无可忍,终于决定下手处理了.程序涉及的绘制比较多,除了点.线.三角形.多边形.圆柱体之外,还有自组格式模型.开始想全部采用显示列表优化,毕竟效率最高,虽然显示列表存在编译之 ...

  6. Git 仓库 SSH、HTTP、Gitweb (Nginx) 乱炖

    简介: 自己搭建 Git 仓库,实现 SSH 协议.配合 Nginx 实现 HTTP 协议拉取.推送代码. 利用 Nginx 实现 Gitweb 在线浏览代码,使用 Gitweb-theme 更新默认 ...

  7. js知识点乱炖

    修改属性 元素.style.样式=值     document.getElementById('box').style.width='200px'; 属性操作方式 1.. 的 元素.属性名如果属性是单 ...

  8. HTML精确定位之位置参数乱炖一锅

    一.前言 公司项目,需要在一个图片的右上角放置一个类似“X”的东西(其实是需要显示一个数字,就像微信一样,在右上角显示几个消息),然后需要用到html的定位,看了几个网上的例子,恍惚间看到了一个off ...

  9. Shiro乱炖

    眼瞅着7月份又要浑浑噩噩的荒度过去了... 说好的计划呢?人的惰性真是无法治愈的伤痛啊 话说最近研究Shiro, Linux和JavaScript, 但结果不怎么如意:Shiro还停留在理解拦截器方面 ...

随机推荐

  1. HTML与XML的区别

    什么是HTML HTML的全拼是Hypertext Markup Language, 中文也就是超文本链接标示语言.HTML(HyperTextMark-upLanguage)即超文本标记语言,是WW ...

  2. 10大vim插件

    Taglist taglist是一个用于显示定位程序中各种符号的插件,例如宏定义.变量名.结构名.函数名这些东西 我们将其称之为符号(symbols),而在taglist中将其称之为tag.显然,要想 ...

  3. 九度oj 题目1533:最长上升子序列

    题目描述: 给定一个整型数组, 求这个数组的最长严格递增子序列的长度. 譬如序列1 2 2 4 3 的最长严格递增子序列为1,2,4或1,2,3.他们的长度为3. 输入: 输入可能包含多个测试案例. ...

  4. Codeforces Round #354 (Div. 2)——C. Vasya and String(尺取)

    C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. ajax同步导致ajax上面的代码不执行?

    js代码:环境:IE11要求:点击一个按钮后,页面xxx的地方立即显示"开始处理...",直到ajax处理结束后,xxx内容才更新为新的处理结果:点击事件执行代码如下:xxx.in ...

  6. Spring-IOC源码解读2-容器的初始化过程

    1. IOC容器的初始化过程:IOC容器的初始化由refresh()方法启动,这个启动包括:BeanDifinition的Resource定位,加载和注册三个过程.初始化的过程不包含Bean依赖注入的 ...

  7. Spring的@Configuration来代替xml配置

    一. Xml配置法 下面是一个典型的spring配置文件(application-config.xml): [xml] view plain copy <beans> <bean i ...

  8. 自动化测试框架之robot framework的应用分析

    序言:很多人都对自动化测试框架痴迷,我曾经也痴迷过一段时间,以前觉得自己对框架说的头头是道,现在回过头来看以前,说归说,但在如何应用还是欠缺,这一段时间,自己经历了一系列框架的构建和应用的时期,所以, ...

  9. 【笔记】Linux内核中的循环缓冲区

    1. 有关ring buffer的理解 1)  ring buffer位首尾相接的buffer,即类似生活中的圆形跑道: 2)  空闲空间+数据空间=ring buffer大小 3)  ring bu ...

  10. 安装破解版的webstorne

    参考以下链接:https://www.cnblogs.com/cui-cui/p/8507435.html