分类目录归档:JAVA

关于java的那些事儿

顺序打印,经典java多线程例子

java在2007年的时候编写过多线程爬虫,当时对多线程的理解仅仅限于可以同时并发任务,对于多线程之间的调度,完全没有理解。所以后来这的多线程的应用仅仅限于只能多线程并发任务。其实一切在线程中都可以被监控。 看下面的列子,我们来理解多线程之间如何进行控制的。 package com.javaer.thread;   public class PrintABC {   public static Boolean isThreadA = true; public static Boolean isThreadB = false; public static Boolean isThreadC = false;   public static void main(String[] args) { final PrintABC abc = new … 继续阅读

发表在 JAVA | 标签为 , | 一条评论

数据大规模插入效率问题

CSDN网友问: 目前有一个需求,用户需要在短时间内将几万条数据导入 MSSQL 数据库。 如果有一条无法导入,需要知道是哪条数据出的错。 导入之前最好还要根据条件验证一下数据是否存在,存在就删除。 现在我一条一条判断导入,非常缓慢。 请问有什么好的思路么? 月小升答: 你慢在搜索上。每次检查会相当消耗资源 1.如果数据有关键字段,能表示重复 比如用户ID号userid。那么把这个字段userid做唯一索引(插入的时候进行try catch 遇到重复会自动被catch,你就知道哪条重复了)被插入的永远都是不重复的 2.如果没有关键字段,所有字段合并做MD5值,单独加个字段叫md 做成唯一索引,然后try catch,原理和1相同 数据库的插入效率很高,搜索效率却很低。主要你要扫描的记录会越来越多,所以搜索会慢。避免搜索就变线性时间了。 (几万条数据,玩的还算比较少,我用这个办法玩过1000万的数据)

发表在 JAVA, 高并发与大数据 | 标签为 , , | 留下评论

Java字符串的10大热点问题盘点

下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: 1、如何比较字符串,应该用”==”还是equals()? 总的来说,”==”是用来比较字符串的引用地址,而equals()才是比较字符串的值。两个值相同的字符串用”==”比较结果有可能是false,而用equals()则一定为true。除非两个字符串是同一个new出来的对象,不然比较字符串值是否相同应该要用equals()。 2、对那些安全敏感的信息,为什么用char[]存储要优于String? String是不可变的,这就意味着它一旦被创建,就将永久驻留在内存中,直到垃圾回收器将其回收为止。然而用数组存储方式,你可以明确地改变数组中的元素,因此用数组方式,安全信息将有可能不存在系统内存的任何地方。 3、能否用字符串来声明switch语句? JAVA 7及以后的版本是支持的。在JDK 7中,允许你使用字符串做switch语句的比较条件。jdk 6以前的版本,不能这样使用: // java 7 only! switch (str.toLowerCase()) { case "a": value = 1; break; case "b": value = 2; break; } 4、如何将字符串转换成数字int类型? int n = Integer.parseInt("10"); 很简单,但却会经常用到,也很容易被忽略。 5、如何用空格字符来分割字符串? 我们可以很方便地用正则表达式来分割字符串,”\s”表示空格字符,比如” “, “\t”, … 继续阅读

发表在 JAVA | 标签为 , , | 留下评论

eclipse failed to create the java virtual

发生这个的背景: 昨天能启动,今天启动不了。 发生的原因: 系统内存不足,被其他软件吃的差不多了。 解决方案: 如何害怕复制以下内容会改变你的配置,自己手工修改内存值。256 改成128 512改成256 方法如下: 找到eclipse目录下的eclipse.ini,可以看到如下内容: -startup plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar –launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.0.v20100503 -product org.eclipse.epp.package.jee.product –launcher.defaultAction openFile –launcher.XXMaxPermSize 256M -showsplash org.eclipse.platform –launcher.XXMaxPermSize 256m –launcher.defaultAction openFile -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m 将其修改为如下内容,即可启动Eclipse -startup plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar –launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.0.v20100503 -product org.eclipse.epp.package.jee.product –launcher.defaultAction openFile –launcher.XXMaxPermSize … 继续阅读

发表在 JAVA | 标签为 , , , | 留下评论

java 编程的30个建议

(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如: ThisIsAClassName thisIsMethodOrFieldName 若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。 Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。 (2) 为了常规用途而创建一个类时,请采取”经典形式”,并包含对下述元素的定义: equals() hashCode() toString() clone()(implement Cloneable) implement Serializable (3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。 (4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。 (5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。 (6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议: ■一个复杂的开关语句:考虑采用”多形”机制 ■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现 ■许多成员变量在特征上有很大的差别:考虑使用几个类 (7) 让一切东西都尽可能地”私有”–private。可使库的某一部分”公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素–只有private字段才能在非同步使用的情况下受到保护。 (8) 谨惕”巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。 (9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。 (10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的”用内部类改进代码”)。 (11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。 (12) … 继续阅读

发表在 JAVA | 标签为 , , | 一条评论

java StringBuffer,StringBuilder,String自身连接效率对比

当我们仅仅需要a+b 的时候,两个字符串链接任何方法的效率基本一样,都在0.0001毫秒内就可以完成。不过如果需要1万次,10000万次,就会发现string自身的join速度显著下降 package com.java.lang;   public class StringTest { int MAX = 10000; //1万次累加 public String Buffer(){ StringBuffer sb = new StringBuffer(); for(int i = 0; i < MAX;i++){ sb.append("abc"); } return sb.toString(); } public String Build(){ StringBuilder sb = … 继续阅读

发表在 JAVA | 标签为 , , , , | 留下评论

java如何计算程序执行消耗时间

很多精细的程序,需要计算一次执行所消耗的时间。 或者,我们很多时候会测试一次数据读取所消耗的时间 System.currentTimeMillis() 可以读取当前时间的毫秒数 值是当前时间减去1970年第一天0分0秒。 package com.javaer.examples;   public class JavaTime {   public static void main(String[] args) { long t1 = System.currentTimeMillis(); for (int i = 0 ;i < 10000;i++){ System.out.println(i + " I am java-er.com"); } long t2 … 继续阅读

发表在 JAVA | 标签为 , | 一条评论

java拆分字符串split

经常需要用java拆分字符串如1,2,3,4 tom,jim,andy,han package com.java.lang;   public class StringSp {   /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub java.lang.String a = "my name is yuexiaosheng my blog is java-er.com";   // java.lang.String … 继续阅读

发表在 JAVA | 标签为 , , , , | 留下评论

java查找字符串

java中查找一个字符串是否包含一个字符,或者一段字符串java.lang.String indexOf方法 package com.java.lang;   public class StringX {   /** * @param args */ public static void main(String[] args) { java.lang.String a = "my name is yuexiaosheng,my blog is java-er.com"; int isPos = a.indexOf("is"); int islastPos = a.lastIndexOf("is");   … 继续阅读

发表在 JAVA | 标签为 , , | 留下评论

java的10个谎言

下面的这些都算是比较高级的问题了,面试中一般也很少问到,因为它们可能会把面试者拒之门外。不过你可以自己找个时间来实践一下。 1. System.exit(0)会跳过finally块的执行 System.setSecurityManager(new SecurityManager() { ?@Override public void checkExit(int status) { throw new ThreadDeath(); } ?}); try { ?System.exit(0); } finally { System.out.println(“In the finally block”); ?} 这段代码为什么会输出In the finally block?为什么没有打印出堆栈跟踪信息呢? 2. String str = “Hello”;其中str是一个字符串对象 跟C++不同的是,Java里的变量要么是基础类型,要么是引用。变量不可能是对象。这意味着像这样的表达式: String str … 继续阅读

发表在 JAVA | 标签为 , | 留下评论