分类目录归档:JAVA

关于java的那些事儿

华为上机面试题

华为java上机题目 题目: 手动输入一个字符串,仅限小写字母,统计并输出每个字符在字符串中出现的次数,并输出。提示可以用map 例子:输入:aaabbbccc 输出:a 3 b 3 c 3 分析: 看到后面的提示,简直就是不用动脑,直接简单粗暴的顺势而上 直接上代码: package com.javaer.huawei;   import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap;   public class TestCharAcount {   public static void main(String args[]) { String strIn = "aaabbbccc"; … 继续阅读

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

java多线程要注意的地方

多线程都会遇到主线程控制的事情,一个宿主分发了多个任务出去,如何知道各自的完成情况。就需要子线程给宿主报告。 1、明确目的,为什么要使用多线程?如果是由于单线程读写或者网络访问(例如HTTP访问互联网)的瓶颈,可以考虑使用线程池。如果是对不同的资源(例如SOCKET连接)进行管理,可以考虑多个线程。 2、线程使用中要注意,如何控制线程的调度和阻塞,例如利用事件的触发来控制线程的调度和阻塞,也有用消息来控制的。 3、线程中如果用到公共资源,一定要考虑公共资源的线程安全性。一般用LOCK锁机制来控制线程安全性。一定要保证不要有死锁机制。 4、合理使用sleep,何时Sleep,Sleep的大小要根据具体项目,做出合理安排。一般原则非阻塞状态下每个循环都要有SLeep,这样保证减少线程对CPU的抢夺。每次线程的就绪和激活都会占用一定得资源,如果线程体如果有多个循环,多处使用SLEEP将导致性能的下降。 5、线程的终止一般要使线程体在完成一件工作的情况下终止,一般不要直接使用抛出线程异常的方式终止线程。 6、线程的优先级一定根据程序的需要要有个整体的规划。

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

认识多任务、多进程、单线程、多线程

要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。 现在的操作系统都是多任务操作系统,每个运行的任务就是操作系统所做的一件事情,比如你在听歌的同时还在用MSN和好友聊天。听歌和聊天就是两个任务,这个两个任务是“同时”进行的。一个任务一般对应一个进程,也可能包含好几个进程。比如运行的MSN就对应一个MSN的进程,如果你用的是windows系统,你就可以在任务管理器中看到操作系统正在运行的进程信息。 一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空间,因为程序是在内存中运行的。在进程中,有些程序流程块是可以乱序执行的,并且这个代码块可以同时被多次执行。实际上,这样的代码块就是线程体。线程是进程中乱序执行的代码流程。当多个线程同时运行的时候,这样的执行模式成为并发执行。 多线程的目的是为了最大限度的利用CPU资源。 Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个JVM环境中,所有程序代码的运行都是以线程来运行。 一般常见的Java应用程序都是单线程的。比如,用java命令运行一个最简单的HelloWorld的Java应用程序时,就启动了一个JVM进程,JVM找到程序程序的入口点main(),然后运行main()方法,这样就产生了一个线程,这个线程称之为主线程。当main方法结束后,主线程运行完成。JVM进程也随即退出 。 对于一个进程中的多个线程来说,多个线程共享进程的内存块,当有新的线程产生的时候,操作系统不分配新的内存,而是让新线程共享原有的进程块的内存。因此,线程间的通信很容易,速度也很快。不同的进程因为处于不同的内存块,因此进程之间的通信相对困难。 实际上,操作的系统的多进程实现了多任务并发执行,程序的多线程实现了进程的并发执行。多任务、多进程、多线程的前提都是要求操作系统提供多任务、多进程、多线程的支持。 在Java程序中,JVM负责线程的调度。线程调度是值按照特定的机制为多个线程分配CPU的使用权。 调度的模式有两种:分时调度和抢占式调度。分时调度是所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间;抢占式调度是根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。 所谓的“并发执行”、“同时”其实都不是真正意义上的“同时”。众所周知,CPU都有个时钟频率,表示每秒中能执行cpu指令的次数。在每个时钟周期内,CPU实际上只能去执行一条(也有可能多条)指令。操作系统将进程线程进行管理,轮流(没有固定的顺序)分配每个进程很短的一段是时间(不一定是均分),然后在每个线程内部,程序代码自己处理该进程内部线程的时间分配,多个线程之间相互的切换去执行,这个切换时间也是非常短的。因此多任务、多进程、多线程都是操作系统给人的一种宏观感受,从微观角度看,程序的运行是异步执行的。 用一句话做总结:虽然操作系统是多线程的,但CPU每一时刻只能做一件事,和人的大脑是一样的

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

java多线程编程全集

1.什么是多线程 简单的可以理解为多个线程同时执行多个任务,比如同时下载10个URL 的速度会比一个个下载快的多。 有兴趣深入研究原理可以学习下什么叫线程,进程 2.java多线程Thread方法小例子 extends Thread 的方式进行一次多线程实验 3.runable例子

发表在 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 | 标签为 , , , , | 留下评论