java

阅读 / 问答 / 标签

java大数据专业对应的工作岗位有哪些?需要掌握哪些专业性的知识?

岗位:数据科学家、数据分析师、数据架构师、数据工程师、统计学家、数据库管理员、业务数据分析师、数据产品经理大数据技术以Java为基础的,相关的专业技术还有:基础阶段:Linux、Docker、KVM、MySQL基础、Oracle基础、MongoDB、redis。hadoop mapreduce hdfs yarn:hadoop:Hadoop 概念、版本、历史,HDFS工作原理,YARN介绍及组件介绍。大数据存储阶段:hbase、hive、sqoop。大数据架构设计阶段:Flume分布式、Zookeeper、Kafka。大数据实时计算阶段:Mahout、Spark、storm。大数据数据采集阶段:Python、Scala。大数据商业实战阶段:实操企业大数据处理业务场景,分析需求、解决方案实施,综合技术实战应用。

c#中有一个TimeSpan类型表示的是一个时间段,java中哪个类表示的是时间段啊?

SimpleDateFormat F = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("当前时间:"+F.format(new Date()));Calendar calendar = Calendar.getInstance();calendar.add(Calendar.HOUR, -2);System.out.println("两小时以前时间:"+F.format(calendar.getTime()));

在mycelipse里面执行java程序的时候显示的不是当前的程序结果,而是其他程序的结果,咋回事啊

直接在当前页面ctrl+f11 输出的什么?

帮我解释一道JAVA题目,详细点哦,我基础不好,谢谢

class Parent { // 5这里是第五步 void printMe() { System.out.println("parent"); } } class Child extends Parent { // 6,7两部都是这个方法 void printMe() { System.out.println("child"); } // 3.接着程序从main方法来到这里 void printAll() { // 4父类的printMe() super.printMe(); // 6本类的printMe(); this.printMe(); // 7本类的printMe() printMe(); } } public class test { public static void main(String args[ ]) { // 1.这里使程序执行的开始 // 常见Child的一个对象 Child myC = new Child( ); // 2.这里调用Child的printAll方法 myC.printAll( ); } }

java中将字符串转化成数组

你应该写在方法里

java上传到指定文件夹问题

用jspsmart 去看看吧 那个操作简单

ubuntu下已经安装JDK,为什么java -version命令还是提示安装

你好你的这个问题解决了吗?我现在的问题和你的一样,如果解决了可不可以麻烦你说一下怎么解决的

Java-编程题

public class Main {public static int reverseInt(int input) {int reversedNum = 0;while (input != 0) {reversedNum = reversedNum * 10 + input % 10;input = input / 10;}return reversedNum;}public static void main(String[] args) {int input = 352;int reversed = reverseInt(input);System.out.println("Reversed=" + String.valueOf(reversed));}}

Java WEB开发中,用SHH框架,根据id删除相应数据出错,想问问什么原因

用断点看有没有走Action里面的方法

Java中shh框架的原理是怎样的啊?

SHH??不是SSH么?请确认下

java 数据可视化 用什么好

以下几个都可以:1.Leaflet Leaflet是由 CloudMade 团队开发的一种微小的映射框架,小巧而轻便,用来创建移动页面。Leaflet和Modest Maps都是开源的,你可以根据自己网站的需求灵活运用它们。其后有强大的备份区支持,你不用担心它们会消失不见。 Polymaps Polymaps也是一种映射库,它更直接用于数据可视化。这是一个强大的资源库,类似于CSS选择器,可以创建地图独特的风格。 2、格式地图数据的发布 OpenLayers或许是最强大的映射库。文档不大,操作难度高,但在某些运用方便没有其他工具可与之相比。当你需要用到一个非常特殊的工具,而其他库没有提供的时候,就可以选择OpenLayers了 3.Kartogragh制图 Kartogragh中的标记线重新审视了映射,这也正是开发者正在做的。我们已经习惯了Mercator projection(墨卡托投射),但Kartogragh提供了更多的选择。如果你不是在处理世界范围的数据,能够把你的地图放在定义框内,那么运用Kartogragh可以使你的设计脱颖而出。4.CartoDB 你必须知道CartoDB站点,可以轻易的结合表格数据与地图,这是首屈一指的。比如,当你输入一个CSV文件地址字符串,它就可以转换为经度和纬度,还可以在地图上标示出来。它有五个免费的表,其他的需要按月度付费使用。

用友NC资产研发部主要用的是JAVA的哪些技术?是不是就是JAVA的SWING编程?其他的都不用?

差不多,如果你不是做底层的话,你说的那些是都用不着的。

resin 中jsp 编译之后的java文件在哪里 ?

我的路径是E: ools esin-4.0.21webappsMyStruts2WEB-INFwork\_jsp,相信你能找到

求javascript js正则表达式匹配以@@开头@@结尾,不包含@@的字符串

String regex = "^A*C*B$"; Pattern p = Pattern.compile(regex); java.util.regex.Matcher m = p.matcher("这里是你要匹配的字符串"); while (m.find()) { System.out.println(m.group()); }

JavaScript如何修改页面中iframe的属性值

<?xml version="1.0" encoding="gbk"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh" lang="zh" dir="ltr"><head profile="http://www.w3.org/2000/08/w3c-synd/#"> <title>New Page | xHTML1.0 Transitional</title> <link rel="shortcut icon" href="favicon.ico" /> <script type="text/javascript"> //放大 function ChangeBig() { var myFrame=document.getElementById("myFrame"); var fWidth=parseInt(myFrame.width); var fHeight=parseInt(myFrame.height); if(fWidth<600) { myFrame.width=fWidth+20; myFrame.height=fHeight+20; } else { alert("已经放至最大"); } } //缩小 function ChangeSmall() { var myFrame=document.getElementById("myFrame"); var fWidth=parseInt(myFrame.width); var fHeight=parseInt(myFrame.height); if(fHeight>=100) { myFrame.width=fWidth-20; myFrame.height=fHeight-20; } else { alert("已经缩至最小"); } } </script></head><body> <iframe src="http://www.baidu.com" id="myFrame" name="x" width="200" height="100"></iframe> <br/> <input type="button" value="放大" onclick="ChangeBig()"/> <input type="button" value="缩小" onclick="ChangeSmall()"/></body></html>说明:以上代码在IE6和Firefox中测试通过。看在我辛苦的敲了这么多字符的份上还是给我加点分三,(*^__^*) 嘻嘻……

如何使用json在前后台进行数据传输实例介绍_javascript技巧

上一篇博客写到用javascript生成多组文本,可以让数据的输入不受显示,现在我们需要把这些输入写入数据库,这里就用到json传入。 首先,我们来写一下后台如何生成要传输的数据 [html] 代码如下: function generateDtb() { //写入 var txtName = document.getElementById("txtName").value; //创建数组 var dtb = new Array(); //通过循环把数据写入到数组并返回 for (var i = 0; i < firstGroup.length; i++) { var row = new Object(); row.Name = txtName; row.fullMoney = firstGroup[i].value; row.discount = secondGroup[i].value; dtb.push(row); } return dtb; } function generateDtb() { //写入 var txtName = document.getElementById("txtName").value; //创建数组 var dtb = new Array(); //通过循环把数据写入到数组并返回 for (var i = 0; i < firstGroup.length; i++) { var row = new Object(); row.Name = txtName; row.fullMoney = firstGroup[i].value; row.discount = secondGroup[i].value; dtb.push(row); } return dtb; } 把数组转换成json串传入到后台: [html] 代码如下: $(function () { //点击botton1 $("#lbtnOK").click(function () { var url = "DiscountManger.aspx?ajax=1"; var dtb = generateDtb(); // var strName = document.getElementById("txtName").value; if (dtb == null) { } else { //序列化对象 var postdata = JSON.stringify(dtb); //异步请求 $.post(url, { json: postdata }, function (json) { if (json) { jBox.tip("添加成功!", "提示"); location.reload(); } else { jBox.tip("添加失败!", "提示"); location.reload(); } }, "json") } }); }); $(function () { //点击botton1 $("#lbtnOK").click(function () { var url = "DiscountManger.aspx?ajax=1"; var dtb = generateDtb(); // var strName = document.getElementById("txtName").value; if (dtb == null) { } else { //序列化对象 var postdata = JSON.stringify(dtb); //异步请求 $.post(url, { json: postdata }, function (json) { if (json) { jBox.tip("添加成功!", "提示"); location.reload(); } else { jBox.tip("添加失败!", "提示"); location.reload(); } }, "json") } }); }); 在后台的操作: 首先判断是否需要传输数据 [html] 代码如下: if (!IsPostBack) { //判断是否异步请求 if (Request.QueryString["ajax"] == "1") { ProcessRequest(); } if (!IsPostBack) { //判断是否异步请求 if (Request.QueryString["ajax"] == "1") { ProcessRequest(); } 在这里进行对数据的处理: [html] 代码如下: ////// 处理异步请求 ///private void ProcessRequest() { //存入要填写的策略 ArrayList arrDiscount = new ArrayList(); Response.ContentType = "text/html"; string json = Request.Form["json"]; //反序列化DataTable if (json == null) { return; } else { DataTable newdtb = Json2Dtb(json); for (int i = 0; i < newdtb.Rows.Count; i++) { Entity.StrategyDiscount enStrategyDiscount = new Entity.StrategyDiscount(); //打折方案名 enStrategyDiscount.name = newdtb.Rows[i]["Name"].ToString(); //商店ID enStrategyDiscount.shopId = long.Parse(LoginInfo.ShopID); enStrategyDiscount.fullMoney = Convert.ToDecimal(newdtb.Rows[i]["fullMoney"].ToString()); enStrategyDiscount.discount = Convert.ToDecimal(newdtb.Rows[i]["discount"].ToString()); //写入数据到数组 arrDiscount.Add(enStrategyDiscount); } //写入数据到数据库 IStrategyBLL strategy = new StrategyBLL(); if (strategy.AddStrategyDiscount(arrDiscount)) { Response.Write("true"); Response.End(); } else { Response.Write("false"); Response.End(); } } ////// 处理异步请求 ///private void ProcessRequest() { //存入要填写的策略 ArrayList arrDiscount = new ArrayList(); Response.ContentType = "text/html"; string json = Request.Form["json"]; //反序列化DataTable if (json == null) { return; } else { DataTable newdtb = Json2Dtb(json); for (int i = 0; i < newdtb.Rows.Count; i++) { Entity.StrategyDiscount enStrategyDiscount = new Entity.StrategyDiscount(); //打折方案名 enStrategyDiscount.name = newdtb.Rows[i]["Name"].ToString(); //商店ID enStrategyDiscount.shopId = long.Parse(LoginInfo.ShopID); enStrategyDiscount.fullMoney = Convert.ToDecimal(newdtb.Rows[i]["fullMoney"].ToString()); enStrategyDiscount.discount = Convert.ToDecimal(newdtb.Rows[i]["discount"].ToString()); //写入数据到数组 arrDiscount.Add(enStrategyDiscount); } //写入数据到数据库 IStrategyBLL strategy = new StrategyBLL(); if (strategy.AddStrategyDiscount(arrDiscount)) { Response.Write("true"); Response.End(); } else { Response.Write("false"); Response.End(); } } 这里,我们需要把json转换成datatable [html] 代码如下: ////// Json转DataTable /////////private DataTable Json2Dtb(string json) { JavaScriptSerializer jss = new JavaScriptSerializer(); ArrayList dic = jss.Deserialize(json); DataTable dtb = new DataTable(); if (dic.Count > 0) { foreach (Dictionary drow in dic) { if (dtb.Columns.Count == 0) { foreach (string key in drow.Keys) { dtb.Columns.Add(key, drow[key].GetType()); } } DataRow row = dtb.NewRow(); foreach (string key in drow.Keys) { row[key] = drow[key]; } dtb.Rows.Add(row); } } return dtb; } ////// Json转DataTable /////////private DataTable Json2Dtb(string json) { JavaScriptSerializer jss = new JavaScriptSerializer(); ArrayList dic = jss.Deserialize(json); DataTable dtb = new DataTable(); if (dic.Count > 0) { foreach (Dictionary drow in dic) { if (dtb.Columns.Count == 0) { foreach (string key in drow.Keys) { dtb.Columns.Add(key, drow[key].GetType()); } } DataRow row = dtb.NewRow(); foreach (string key in drow.Keys) { row[key] = drow[key]; } dtb.Rows.Add(row); } } return dtb; } 这样,就可以把数据无刷新的写入到数据库。 当然,如果我们有一个从数据库读取的datatable,如果通过json显示在前台呢。 首先,我们需要把datatable转换为json数据 [html] 代码如下: ////// DataTable转Json /////////private string Dtb2Json(DataTable dtb) { JavaScriptSerializer jss = new JavaScriptSerializer(); ArrayList dic = new ArrayList(); foreach (DataRow row in dtb.Rows) { Dictionary drow = new Dictionary(); foreach (DataColumn col in dtb.Columns) { drow.Add(col.ColumnName, row[col.ColumnName]); } dic.Add(drow); } return jss.Serialize(dic); } ////// DataTable转Json /////////private string Dtb2Json(DataTable dtb) { JavaScriptSerializer jss = new JavaScriptSerializer(); ArrayList dic = new ArrayList(); foreach (DataRow row in dtb.Rows) { Dictionary drow = new Dictionary(); foreach (DataColumn col in dtb.Columns) { drow.Add(col.ColumnName, row[col.ColumnName]); } dic.Add(drow); } return jss.Serialize(dic); } 然后写回到前台 [html] 代码如下: ////// 处理异步请求 ///private void ProcessRequest() { Response.ContentType = "text/html"; string json = Request.Form["json"]; //反序列化DataTable DataTable newdtb = Json2Dtb(json); //序列化DataTable为JSON string back = Dtb2Json(newdtb); Response.Write(back); Response.End(); } ////// 处理异步请求 ///private void ProcessRequest() { Response.ContentType = "text/html"; string json = Request.Form["json"]; //反序列化DataTable DataTable newdtb = Json2Dtb(json); //序列化DataTable为JSON string back = Dtb2Json(newdtb); Response.Write(back); Response.End(); } 在前台接受显示: [html] 代码如下: $(function() { //点击botton1 $("#botton1").click(function() { createTable(json); }); }); //显示Json中的数据 function createTable(json) { var table = $(""); for (var i = 0; i < json.length; i++) { o1 = json[i]; var row = $(""); for (key in o1) { var td = $(""); td.text(o1[key].toString()); td.appendTo(row); } row.appendTo(table); } table.appendTo($("#back")); } $(function() { //点击botton1 $("#botton1").click(function() { createTable(json); }); }); //显示Json中的数据 function createTable(json) { var table = $(""); for (var i = 0; i < json.length; i++) { o1 = json[i]; var row = $(""); for (key in o1) { var td = $(""); td.text(o1[key].toString()); td.appendTo(row); } row.appendTo(table); } table.appendTo($("#back")); } 这样,就完成了json向后台传输数据和显示后台数据了,当然,这种传输方式只是传输的一种,如果是简单的字符串也可以用get和post进行传输,但是,javascript本身具有不安全性和不稳定行,对于一些比较重要的数据,建议还是寻找一些更可靠的方法。

java系统就是塞班系统吗?

2个东西没啥关系哦

找一下怎么根据thrift文件生成java需要使用的类

提供一种命令行的方式,利用axis——下载一个axis,假设2-1.5版本,解压运行cmd,进入axis的bin目录,执行如下命令:axis2-1.5in>wsdl2java.bat-uriD:wsdl.xml-oD:output-pcom.bd.zd-uri:wsdl文件-o:Java文件输出路径-p:生成的Java文件包名

java怎么连接thrift服务器

package net.johnc.thrift; import org.apache.thrift.TException; public class TestImpl implements Test.Iface { public void ping(int length) throws TException { System.out.println("calling ping ,length=" + length); }}

javaeye 怎么变成iteye了

很有可能是整蛊。。求给最佳~~

java问题,高手请进!

方法类:package test;public class CaiQuan { private int computerFist=-10; private int result = -1; public CaiQuan() { super(); this.computerFist = ((int) (Math.random()*1000))%3;; } public String getComputerFist() { String s = "石头"; if(computerFist!=0)s=computerFist==1?"剪刀":"布"; return s; } public String getResult(int yourFist) { if(yourFist>2||yourFist<0)return "输入有误"; String y = ""; String r = ""; switch(yourFist) { case 0:y="石头"; if(computerFist==0){r="和电脑出得一样";result=1;} else if(computerFist==1){r="赢了";result=2;} else if(computerFist==2){r="输了";result=0;} break; case 1:y="剪刀"; if(computerFist==1){r="和电脑出得一样";result=1;} else if(computerFist==2){r="赢了";result=2;} else if(computerFist==0){r="输了";result=0;} break; case 2:y="布"; if(computerFist==2){r="和电脑出得一样";result=1;} else if(computerFist==0){r="赢了";result=2;} else if(computerFist==1){r="输了";result=0;} break; } return "你出的是:"+y+",电脑出的是:"+getComputerFist()+"。你"+r; } public int getResult() { return result; }}测试类:package test;import java.util.Scanner;public class TestCaiQuan { public static void main(String[] args) { Scanner input = new Scanner(System.in); int win = 0; int lose = 0; int draw = 0; int error = 0; int times = 10; int num = times; while(num>0) { CaiQuan cq = new CaiQuan(); System.out.println("请输入您要出的拳(0 石头)(1 剪刀)(2 布)"); System.out.println(cq.getResult(input.nextInt())); if(cq.getResult()==0)lose+=1; else if(cq.getResult()==1)draw+=1; else if(cq.getResult()==2)win+=1; else error+=1; num--; } System.out.println("您共玩了"+times+"次,赢"+win+"次,输"+lose+"次,平"+draw+"次,错误输入"+error+"次"); System.out.println("您的胜率是:"+Double.valueOf(win)/times*100+"%"); }}

javascript如何动态加载表格与动态添加表格行_javascript技巧

一、动态加载表格 1.首先在html中为表格的添加位置设置id 即是在html的body标签内部写一个div标签表明表格要添加到此div的内部。如下 2.在javascript中写添加表格的语句 若在当前html文件中,则写在标签内部,如 代码如下: document.getElementById("tbl").innerHTML="" //此处添加的表格可根据自己需要创建 若是通过引入js文件,则在js文件(假设是test.js)中直接写如下语句 代码如下: document.getElementById("tbl").innerHTML="" 然后再引入自己的html文件 代码如下: 二、 动态添加表格行 1.首先在html中为表格行的添加位置设置id,此位置必须是内部(不是特别准确,但根据我的测试就得到此结论,有其他的方法请留言,谢谢),如下 代码如下: //tfoot与thead是与tbody配套使用,但我在写的时候,没用也可以。 [sS ]* 2.在javascript内容中,要先创建行和单元格,再在中添加行,如下 [code] row=document.createElement("tr"); //创建行 td1=document.createElement("tr"); //创建单元格 td1.appendChild(document.createTextNode("content")); //为单元格添加内容 row.appendChild(td1); //将单元格添加到行内 document.getElementById("rows").append(row); //将行添加到中 三、我的小发现(也许别人早知道了、、、) 1. 我自己做了一下测试,html中写",测试可以添加内容。 3.思考:从上面两个测试似乎可以得出点什么结论,该如何总结还没想好,哪样的标签可以直接通过innerHTML直接添加呢?

java中SDF类的parse问题?

你的 Y 改成小写

java 的 Runnable 是个接口,既然是个接口就没有 可执行的方法。 那么为何它还能启动线程呢,请高手解答--

有run方法啊 thread会用到

javascript中怎么通过getelementById方法得到style中的opacity(透明度)的值

getElementById("objId").style.opacity 不太确定是不是这样getElementById("objId").style.filter

java rebel.xml 什么文件

以.cfg.xml这个结尾的都是hibernate的ORM映射文件

Java Sting转换为String[]

不明白你说什么

java Sting 如何替换指定位置的 字符?

使用replaceFirst方法。String s="1231";String sNew=s.replaceFirst("1","2"); //sNew="2231";

JAVA标识符;Sting 和User name为什么是非法的标识符?

系统标示符.

java操作数据库时添加数据后怎么返回其主键并输出

参考JAVA 的APIInterface java.sql.Statementint executeUpdate(String sql,  int autoGeneratedKeys) Executes the given SQL statement and signals the driver with the given flag about whether the auto-generated keys produced by this Statement object should be made available for retrieval.

为什么java中Hashmap 实例查看不到成员变量

jre编译成这样了

前端的mapping用java怎么写

在Java中,可以使用Spring框架来实现前端路由。具体步骤如下:1、在SpringBoot项目中引入spring-web模块和spring-webmvc模块。2、在SpringBoot的启动类中添加注解`@EnableWebMvc`,开启SpringMVC的自动配置。3、创建一个Controller类,添加注解`@Controller`,用于处理前端请求。4、在Controller类中添加方法,并使用注解`@RequestMapping`来指定URL路径。5、创建对应的HTML页面,并放置在resources/templates目录下。6、配置模板引擎,使得Spring能够正确解析HTML模板。

Java五个最常用的集合类之间的区别和联系

上网查吧,资料太多了。

为什么网上那些java视频讲集合框架都只讲arraylist,set,hashmap。其他集合都不

做java开发,用的最多的结合框架,就这么几个,关于别的集合框架,一是用的不多,二是,你要是真想学这些东西,你应该去学习下,数据结构,而不是去学java的API,你懂大概原理的时候,需要用的时候,你去找API就行了,空学API实际上用处不大

Java HashMap 复杂度的问题

第一个是O(n),因为是遍历整个集合 ,第二个是O(m*n),看他们提供的源码实现就可知道,两重for循环

java能做什么样的东西?

这么告诉你,java在未来十年内都很有前途。他的跨平台性、单继承的安全性使它格外突出,想学就抓紧吧。下一个IT小精英也许就是你!

急!!!java集合hashMap问题,高手请帮忙

这样理解:因为数组是引用型,test3 = hash_arrayHashSets[0];test3已经指向hash_arrayHashSets[0]这个实体, test3.add("c"),会在hash_arrayHashSets[0]增加一个元素“C”,这样实体hash_arrayHashSets[0]已经改变了。

java 中的hashmap如何解决冲突?就是如何保证两个不同的object放到hashmap中,计算key值时没有问题?

大概是不同的object计算出的hascode不同

Java中HashMap和TreeMap的区别深入理解

两者都是非线程安全,前者无排序,后者会自动排序

java7和java8对hashmap做了哪些优化

HashMap的原理介绍x0dx0ax0dx0a此乃老生常谈,不作仔细解说。x0dx0a一句话概括之:HashMap是一个散列表,它存储的内容是键值对(key-value)映射。x0dx0ax0dx0aJava 7 中HashMap的源码分析x0dx0ax0dx0a首先是HashMap的构造函数代码块1中,根据初始化的Capacity与loadFactor(加载因子)初始化HashMap.x0dx0a//代码块1x0dx0a public HashMap(int initialCapacity, float loadFactor) {x0dx0a if (initialCapacity < 0)x0dx0a throw new IllegalArgumentException("Illegal initial capacity: " +x0dx0a initialCapacity);x0dx0a if (initialCapacity > MAXIMUM_CAPACITY)x0dx0a initialCapacity = MAXIMUM_CAPACITY;x0dx0a if (loadFactor <= 0 || Float.isNaN(loadFactor))x0dx0a throw new IllegalArgumentException("Illegal load factor: " +loadFactor);x0dx0ax0dx0a this.loadFactor = loadFactor;x0dx0a threshold = initialCapacity;x0dx0a init();x0dx0a }x0dx0ax0dx0aJava7中对于的put方法实现相对比较简单,首先根据 key1 的key值计算hash值,再根据该hash值与table的length确定该key所在的index,如果当前位置的Entry不为null,则在该Entry链中遍历,如果找到hash值和key值都相同,则将值value覆盖,返回oldValue;如果当前位置的Entry为null,则直接addEntry。x0dx0a代码块2x0dx0apublic V put(K key, V value) {x0dx0a if (table == EMPTY_TABLE) {x0dx0a inflateTable(threshold);x0dx0a }x0dx0a if (key == null)x0dx0a return putForNullKey(value);x0dx0a int hash = hash(key);x0dx0a int i = indexFor(hash, table.length);x0dx0a for (Entry e = table[i]; e != null; e = e.next) {x0dx0a Object k;x0dx0a if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {x0dx0a V oldValue = e.value;x0dx0a e.value = value;x0dx0a e.recordAccess(this);x0dx0a return oldValue;x0dx0a }x0dx0a }x0dx0ax0dx0a modCount++;x0dx0a addEntry(hash, key, value, i);x0dx0a return null;x0dx0a }x0dx0ax0dx0a//addEntry方法中会检查当前table是否需要resizex0dx0a void addEntry(int hash, K key, V value, int bucketIndex) {x0dx0a if ((size >= threshold) && (null != table[bucketIndex])) {x0dx0a resize(2 * table.length); //当前map中的size 如果大于threshole的阈值,则将resize将table的length扩大2倍。x0dx0a hash = (null != key) ? hash(key) : 0;x0dx0a bucketIndex = indexFor(hash, table.length);x0dx0a }x0dx0ax0dx0a createEntry(hash, key, value, bucketIndex);x0dx0a }x0dx0ax0dx0aJava7 中resize()方法的实现比较简单,将OldTable的长度扩展,并且将oldTable中的Entry根据rehash的标记重新计算hash值和index移动到newTable中去。代码如代码块3中所示,x0dx0a//代码块3 --JDK7中HashMap.resize()方法x0dx0avoid resize(int newCapacity) {x0dx0a Entry[] oldTable = table;x0dx0a int oldCapacity = oldTable.length;x0dx0a if (oldCapacity == MAXIMUM_CAPACITY) {x0dx0a threshold = Integer.MAX_VALUE;x0dx0a return;x0dx0a }x0dx0ax0dx0a Entry[] newTable = new Entry[newCapacity];x0dx0a transfer(newTable, initHashSeedAsNeeded(newCapacity));x0dx0a table = newTable;x0dx0a threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1);x0dx0a }x0dx0ax0dx0a /**x0dx0a * 将当前table的Entry转移到新的table中x0dx0a */x0dx0a void transfer(Entry[] newTable, boolean rehash) {x0dx0a int newCapacity = newTable.length;x0dx0a for (Entry e : table) {x0dx0a while(null != e) {x0dx0a Entry next = e.next;x0dx0a if (rehash) {x0dx0a e.hash = null == e.key ? 0 : hash(e.key);x0dx0a }x0dx0a int i = indexFor(e.hash, newCapacity);x0dx0a e.next = newTable[i];x0dx0a newTable[i] = e;x0dx0a e = next;x0dx0a }x0dx0a }x0dx0a }x0dx0ax0dx0aHashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。x0dx0a根据源码分析可以看出:在Java7 中 HashMap的entry是按照index索引存储的,遇到hash冲突的时候采用拉链法解决冲突,将冲突的key和value插入到链表list中。x0dx0a然而这种解决方法会有一个缺点,假如key值都冲突,HashMap会退化成一个链表,get的复杂度会变成O(n)。x0dx0a在Java8中为了优化该最坏情况下的性能,采用了平衡树来存放这些hash冲突的键值对,性能由此可以提升至O(logn)。x0dx0a代码块4 -- JDK8中HashMap中常量定义x0dx0a static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; x0dx0a static final int TREEIFY_THRESHOLD = 8; // 是否将list转换成tree的阈值x0dx0a static final int UNTREEIFY_THRESHOLD = 6; // 在resize操作中,决定是否untreeify的阈值x0dx0a static final int MIN_TREEIFY_CAPACITY = 64; // 决定是否转换成tree的最小容量x0dx0a static final float DEFAULT_LOAD_FACTOR = 0.75f; // default的加载因子x0dx0ax0dx0a在Java 8 HashMap的put方法实现如代码块5所示,x0dx0a代码块5 --JDK8 HashMap.put方法x0dx0a public V put(K key, V value) {x0dx0a return putVal(hash(key), key, value, false, true);x0dx0a }x0dx0ax0dx0a final V putVal(int hash, K key, V value, boolean onlyIfAbsent,x0dx0a boolean evict) {x0dx0a Node[] tab; Node p; int n, i;x0dx0a if ((tab = table) == null || (n = tab.length) == 0)x0dx0a n = (tab = resize()).length; //table为空的时候,n为table的长度x0dx0a if ((p = tab[i = (n - 1) & hash]) == null)x0dx0a tab[i] = newNode(hash, key, value, null); // (n - 1) & hash 与Java7中indexFor方法的实现相同,若i位置上的值为空,则新建一个Node,table[i]指向该Node。x0dx0a else {x0dx0a // 若i位置上的值不为空,判断当前位置上的Node p 是否与要插入的key的hash和key相同x0dx0a Node e; K k;x0dx0a if (p.hash == hash &&x0dx0a ((k = p.key) == key || (key != null && key.equals(k))))x0dx0a e = p;//相同则覆盖之x0dx0a else if (p instanceof TreeNode)x0dx0a // 不同,且当前位置上的的node p已经是TreeNode的实例,则再该树上插入新的node。x0dx0a e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);x0dx0a else {x0dx0a // 在i位置上的链表中找到p.next为null的位置,binCount计算出当前链表的长度,如果继续将冲突的节点插入到该链表中,会使链表的长度大于tree化的阈值,则将链表转换成tree。x0dx0a for (int binCount = 0; ; ++binCount) {x0dx0a if ((e = p.next) == null) {x0dx0a p.next = newNode(hash, key, value, null);x0dx0a if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1stx0dx0a treeifyBin(tab, hash);x0dx0a break;x0dx0a }x0dx0a if (e.hash == hash &&x0dx0a ((k = e.key) == key || (key != null && key.equals(k))))x0dx0a break;x0dx0a p = e;x0dx0a }x0dx0a }x0dx0a if (e != null) { // existing mapping for keyx0dx0a V oldValue = e.value;x0dx0a if (!onlyIfAbsent || oldValue == null)x0dx0a e.value = value;x0dx0a afterNodeAccess(e);x0dx0a return oldValue;x0dx0a }x0dx0a }x0dx0a ++modCount;x0dx0a if (++size > threshold)x0dx0a resize();x0dx0a afterNodeInsertion(evict);x0dx0a return null;x0dx0a }x0dx0ax0dx0a再看下resize方法,由于需要考虑hash冲突解决时采用的可能是list 也可能是balance tree的方式,因此resize方法相比JDK7中复杂了一些,x0dx0a代码块6 -- JDK8的resize方法x0dx0a inal Node[] resize() {x0dx0a Node[] oldTab = table;x0dx0a int oldCap = (oldTab == null) ? 0 : oldTab.length;x0dx0a int oldThr = threshold;x0dx0a int newCap, newThr = 0;x0dx0a if (oldCap > 0) {x0dx0a if (oldCap >= MAXIMUM_CAPACITY) {x0dx0a threshold = Integer.MAX_VALUE;//如果超过最大容量,无法再扩充tablex0dx0a return oldTab;x0dx0a }x0dx0a else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&x0dx0a oldCap >= DEFAULT_INITIAL_CAPACITY)x0dx0a newThr = oldThr << 1; // threshold门槛扩大至2倍x0dx0a }x0dx0a else if (oldThr > 0) // initial capacity was placed in thresholdx0dx0a newCap = oldThr;x0dx0a else { // zero initial threshold signifies using defaultsx0dx0a newCap = DEFAULT_INITIAL_CAPACITY;x0dx0a newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);x0dx0a }x0dx0a if (newThr == 0) {x0dx0a float ft = (float)newCap * loadFactor;x0dx0a newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ?x0dx0a (int)ft : Integer.MAX_VALUE);x0dx0a }x0dx0a threshold = newThr;x0dx0a @SuppressWarnings({"rawtypes","unchecked"})x0dx0a Node[] newTab = (Node[])new Node[newCap];// 创建容量为newCap的newTab,并将oldTab中的Node迁移过来,这里需要考虑链表和tree两种情况。

Java中的强引用,软引用,弱引用,虚引用有什么用

这两天在看 Reference 相关的东西,虽然接触到的场景不多,但感觉还是比较有用的。在非常关心内存的情况下,有可能能派上用场。在涉及到某一个对象被 GC,需要得到通知,然后再做某些相关处理的时候,有可能派得上用场。对于第一点,目前接触到的就是 WeakHahsMap。像我们平常写缓存的时候,最简单的就是在一个类中public static Map<String,String> user_map = new HashMap<String, String>();然后再在全局使用它。这里就可以参考下 Tomcat 实现的这个 LRU 缓存:tomcat/ConcurrentCache.java at trunk · apache/tomcat · GitHub,它就用到了 WeakHashMap,WeakHashMap也用到了 WeakReference,可以参考下。WeakHahsMap 的实现原理简单来说就是里面的 Entry 使用继承了 WeakReference,那么当 Entry 的 key 不再被使用的时候,也就是被 GC 的时候,那么该 Entry 就会进入到 ReferenceQueue 中, WeakHashMap 在你调用相关方法的时候,那么就会把这个 Entry 从 ReferenceQueue 中删除,并且做相关处理(也就是把这个 key 删除)。这时候你就会发现,你的一个键值对没有了。对于第二点,目前接触到的就是一个 FileCleaningTracker,它的作用是,把一个文件和一个对象关联起来,当这个对象被 GC 的时候,文件也帮我们删除掉。FileCleaningTracker 的实现简单来说就是用了一个虚引用。它里面有一个 Tracker 的内部类,他继承自 PhantomReference,你可以理解成 WeakHashMap中的 Entry(其实也很像了)。这个 Tracker 就和我们的关联对象 marker 关联起来(你可以理解成 WeakHashMap 中的 Entry 的 key),那么当 marker 被回收的时候,Tracker 就会被GC 弄到 ReferenceQueue 中,那么 FileCleaningTracker 就会把 Tracker 从 ReferenceQueue 移除出来,并且执行相关操作(delete file)。最后:自己理解的引用(强,软,弱虚)是和 GC 比较相关的,能够在一个 对象被 GC 的时候,应用程序得到通知,然后执行相关操作。像 WeakHashMap 就是这样,底层发现 key 没了,上层就把 entry 删了。ps:第6条:消除过期对象的引用(WeakHashMap的缓存应用):愿无岁月可回首第6条:WeakHashMap扩展知识1(原理与Reference相关):愿无岁月可回首第6条:Reference应用-FileCleaningTracker:愿无岁月可回首最后的最后补充。。。突然想起,之前自己在工作中涉及到这样一种情况,我需要对用户投资的钱进行一个每日的加息,有一天客户忘了把加息的数据给我,然后给了我一份 csv 文件,让我加上。我当时的做法是,让运维把文件放在固定的地方,程序读取,执行逻辑,然后运维再手动删除。 这个时候,其实也可以通过这种 FileCleaningTracker,当读取完之后,自动的删除这个文件,就不用运维来做了。(这可能是一种应用场景)

java7和java8对hashmap做了哪些优化

HashMap的原理介绍此乃老生常谈,不作仔细解说。一句话概括之:HashMap是一个散列表,它存储的内容是键值对(key-value)映射。Java 7 中HashMap的源码分析首先是HashMap的构造函数代码块1中,根据初始化的Capacity与loadFactor(加载因子)初始化HashMap.//代码块1 public HashMap(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal initial capacity: " + initialCapacity); if (initialCapacity > MAXIMUM_CAPACITY) initialCapacity = MAXIMUM_CAPACITY; if (loadFactor <= 0 || Float.isNaN(loadFactor)) throw new IllegalArgumentException("Illegal load factor: " +loadFactor); this.loadFactor = loadFactor; threshold = initialCapacity; init(); }Java7中对于<key1,value1>的put方法实现相对比较简单,首先根据 key1 的key值计算hash值,再根据该hash值与table的length确定该key所在的index,如果当前位置的Entry不为null,则在该Entry链中遍历,如果找到hash值和key值都相同,则将值value覆盖,返回oldValue;如果当前位置的Entry为null,则直接addEntry。代码块2public V put(K key, V value) { if (table == EMPTY_TABLE) { inflateTable(threshold); } if (key == null) return putForNullKey(value); int hash = hash(key); int i = indexFor(hash, table.length); for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }//addEntry方法中会检查当前table是否需要resize void addEntry(int hash, K key, V value, int bucketIndex) { if ((size >= threshold) && (null != table[bucketIndex])) { resize(2 * table.length); //当前map中的size 如果大于threshole的阈值,则将resize将table的length扩大2倍。 hash = (null != key) ? hash(key) : 0; bucketIndex = indexFor(hash, table.length); } createEntry(hash, key, value, bucketIndex); }Java7 中resize()方法的实现比较简单,将OldTable的长度扩展,并且将oldTable中的Entry根据rehash的标记重新计算hash值和index移动到newTable中去。代码如代码块3中所示,//代码块3 --JDK7中HashMap.resize()方法void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newTable = new Entry[newCapacity]; transfer(newTable, initHashSeedAsNeeded(newCapacity)); table = newTable; threshold = (int)Math.min(newCapacity * loadFactor, MAXIMUM_CAPACITY + 1); } /** * 将当前table的Entry转移到新的table中 */ void transfer(Entry[] newTable, boolean rehash) { int newCapacity = newTable.length; for (Entry<K,V> e : table) { while(null != e) { Entry<K,V> next = e.next; if (rehash) { e.hash = null == e.key ? 0 : hash(e.key); } int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } } }HashMap性能的有两个参数:初始容量(initialCapacity) 和加载因子(loadFactor)。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。根据源码分析可以看出:在Java7 中 HashMap的entry是按照index索引存储的,遇到hash冲突的时候采用拉链法解决冲突,将冲突的key和value插入到链表list中。然而这种解决方法会有一个缺点,假如key值都冲突,HashMap会退化成一个链表,get的复杂度会变成O(n)。在Java8中为了优化该最坏情况下的性能,采用了平衡树来存放这些hash冲突的键值对,性能由此可以提升至O(logn)。代码块4 -- JDK8中HashMap中常量定义 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; static final int TREEIFY_THRESHOLD = 8; // 是否将list转换成tree的阈值 static final int UNTREEIFY_THRESHOLD = 6; // 在resize操作中,决定是否untreeify的阈值 static final int MIN_TREEIFY_CAPACITY = 64; // 决定是否转换成tree的最小容量 static final float DEFAULT_LOAD_FACTOR = 0.75f; // default的加载因子在Java 8 HashMap的put方法实现如代码块5所示,代码块5 --JDK8 HashMap.put方法 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; //table为空的时候,n为table的长度 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); // (n - 1) & hash 与Java7中indexFor方法的实现相同,若i位置上的值为空,则新建一个Node,table[i]指向该Node。 else { // 若i位置上的值不为空,判断当前位置上的Node p 是否与要插入的key的hash和key相同 Node<K,V> e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p;//相同则覆盖之 else if (p instanceof TreeNode) // 不同,且当前位置上的的node p已经是TreeNode的实例,则再该树上插入新的node。 e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { // 在i位置上的链表中找到p.next为null的位置,binCount计算出当前链表的长度,如果继续将冲突的节点插入到该链表中,会使链表的长度大于tree化的阈值,则将链表转换成tree。 for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }再看下resize方法,由于需要考虑hash冲突解决时采用的可能是list 也可能是balance tree的方式,因此resize方法相比JDK7中复杂了一些,代码块6 -- JDK8的resize方法 inal Node<K,V>[] resize() { Node<K,V>[] oldTab = table; int oldCap = (oldTab == null) ? 0 : oldTab.length; int oldThr = threshold; int newCap, newThr = 0; if (oldCap > 0) { if (oldCap >= MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE;//如果超过最大容量,无法再扩充table return oldTab; } else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY && oldCap >= DEFAULT_INITIAL_CAPACITY) newThr = oldThr << 1; // threshold门槛扩大至2倍 } else if (oldThr > 0) // initial capacity was placed in threshold newCap = oldThr; else { // zero initial threshold signifies using defaults newCap = DEFAULT_INITIAL_CAPACITY; newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY); } if (newThr == 0) { float ft = (float)newCap * loadFactor; newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE); } threshold = newThr; @SuppressWarnings({"rawtypes","unchecked"}) Node<K,V>[] newTab = (Node<K,V>[])new Node[newCap];// 创建容量为newCap的newTab,并将oldTab中的Node迁移过来,这里需要考虑链表和tree两种情况。

java中hashset和hashmap有什么特点?

什么是HashSetHashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true。什么是HashMapHashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。public Object put(Object Key,Object value)方法用来将元素添加到map中。你可以阅读这篇文章看看HashMap的工作原理,以及这篇文章看看HashMap和HashTable的区别。HashSet和HashMap的区别*HashMap* *HashSet* HashMap实现了Map接口 HashSet实现了Set接口 HashMap储存键值对 HashSet仅仅存储对象 使用put()方法将元素放入map中 使用add()方法将元素放入set中 HashMap中使用键对象来计算hashcode值 HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false HashMap比较快,因为是使用唯一的键来获取对象 HashSet较HashMap来说比较慢

java 为什么使用hashmap

http://blog.csdn.net/rickiyeat/article/details/52708794

java面试需要哪些基础

面向对象软件开发的优点有哪些?答:开发模块化,更易维护和修改;代码之间可以复用;增强代码的可靠性、灵活性和可理解性。多态的定义?答:多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。继承的定义?答:继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性抽象的定义?抽象和封装的不同点?答:抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴漏接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看成是用来提供抽象的一种策略。接口和抽象类的区别是什么?答:Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?答:上次电话面试被问到了这个问题,一脸蒙B。Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。 这里分享一个讲Java虚拟机的趣文,小说的形式。很有趣,读完你就明白虚拟机的工作原理:http://blog.jobbole.com/101114/”static”关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法?答:“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?答:这道题如果面试考概念,80%会被问到。太容易被混淆了,上次面试时候,一紧张就说反了。Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。Java支持的数据类型有哪些?什么是自动拆装箱?答:byte,short,int,long,float,double,boolean,char自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?答:当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。Java支持多继承么?答:Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,或者说一个类可以实现多个接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。什么是值传递和引用传递?答:这个问题也比较经典。 值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象。一般认为,java内的传递都是值传递。好像还是稀里糊涂这边有个例子:http://blog.csdn.net/yangjingyuan/article/details/5862944 大家看完应该就理解了创建线程有几种不同的方式?答:有三种方式可以用来创建线程: 继承Thread类 实现Runnable接口应用程序可以使用Executor框架来创建线程池实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。概括的解释下线程的几种可用状态。答:一句话说不明白这个问题,可以参考我的这篇文章:http://blog.csdn.net/zjwcdd/article/details/51517096同步方法和同步代码块的区别是什么?答:同步方法默认用this或者当前类class对象作为锁;同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;这篇文章的例子不错:http://blog.sina.com.cn/s/blog_4ae8f77f0101iifx.html在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?答:监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。Java集合类框架的基本接口有哪些?答:集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有: Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的Collection。 List:有顺序的collection,并且可以包含重复元素。 Map:可以把键(key)映射到值(value)的对象,键不能重复。什么是迭代器(Iterator)?答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。Iterator和ListIterator的区别是什么?答:Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。Java中的HashMap的工作原理是什么?答:Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。hashCode()和equals()方法的重要性体现在什么地方?答:Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。HashMap和Hashtable有什么区别?答:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点: HashMap允许键和值是null,而Hashtable不允许键或者值是null。 Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。一般认为Hashtable是一个遗留的类。数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?答:Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。Array大小是固定的,ArrayList的大小是动态变化的。ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。ArrayList和LinkedList有什么区别?答:ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。 LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。Comparable和Comparator接口是干什么的?列出它们的区别。答:Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。Java提供了包含compare()和equals()两个方法的Comparator接口。compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。什么是Java优先级队列(Priority Queue)?答:PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。如何权衡是使用无序的数组还是有序的数组?答:有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。Java集合类框架的最佳实践有哪些?答:根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。编程的时候接口优于实现。 底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。Enumeration接口和Iterator接口的区别有哪些?答:Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。HashSet和TreeSet有什么区别?答:HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。Java中垃圾回收有什么目的?什么时候进行垃圾回收?答:垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?答:垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize()可能永远不被执行,显然指望它做收尾工作是靠不住的。 那么finalize()究竟是做什么的呢?它最主要的用途是回收特殊渠道申请的内存。Java程序有垃圾回收器,所以一般情况下内存问题不用程序员操心。但有一种JNI(Java Native Interface)调用non-Java程序(C或C++),finalize()的工作就是回收这部分的内存。如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?答: 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?答:JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象。一直到垃圾收集器把这些对象回收掉之前,他们会一直占据堆内存空间。在Java中,对象什么时候可以被垃圾回收?答:当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。Java中的两种异常类型是什么?他们有什么区别?答:Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。Java中Exception和Error有什么区别?答:Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。具体解释和图说明见:http://blog.csdn.net/zjwcdd/article/details/51508475throw和throws有什么区别?答:throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。异常处理完成以后,Exception对象会发生什么变化?答:Exception对象会在下一个垃圾回收过程中被回收掉。finally代码块和finalize()方法有什么区别?答:无论是否抛出异常,finally代码块都会执行,它主要是用来释放应用占用的资源。finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。

Java中HashMap和TreeMap的区别深入理解

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对。  HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的)。  HashMap 非线程安全 TreeMap 非线程安全  线程安全  在Java里,线程安全一般体现在两个方面:  1、多个thread对同一个java实例的访问(read和modify)不会相互干扰,它主要体现在关键字synchronized.如ArrayList和Vector,HashMap和Hashtable  (后者每个方法前都有synchronized关键字)。如果你在interator一个List对象时,其它线程remove一个element,问题就出现了。  2、每个线程都有自己的字段,而不会在多个线程之间共享。它主要体现在java.lang.ThreadLocal类,而没有Java关键字支持,如像static、transient那样。  1.AbstractMap抽象类和SortedMap接口  AbstractMap抽象类:(HashMap继承AbstractMap)覆盖了equals()和hashCode()方法以确保两个相等映射返回相同的哈希码。如果两个映射大小相等、包含同样的键且每个键在这两个映射中对应的值都相同,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不论映射内部顺序如何,两个相等映射会报告相同的哈希码。  SortedMap接口:(TreeMap继承自SortedMap)它用来保持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了访问方法。除了排序是作用于映射的键以外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的唯一一份实现。  2.两种常规Map实现  HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。  (1)HashMap(): 构建一个空的哈希映像  (2)HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射  (3)HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像  (4)HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像  TreeMap:基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。  (1)TreeMap():构建一个空的映像树  (2)TreeMap(Map m): 构建一个映像树,并且添加映像m中所有元素  (3)TreeMap(Comparator c): 构建一个映像树,并且使用特定的比较器对关键字进行排序  (4)TreeMap(SortedMap s): 构建一个映像树,添加映像树s中所有映射,并且使用与有序映像s相同的比较器排序  3.两种常规Map性能  HashMap:适用于在Map中插入、删除和定位元素。  Treemap:适用于按自然顺序或自定义顺序遍历键(key)。  4.总结  HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap.  import java.util.HashMap;  import java.util.Hashtable;  import java.util.Iterator;  import java.util.Map;  import java.util.TreeMap;  public class HashMaps {  public static void main(String[] args) {  Map<String, String> map = new HashMap<String, String>();  map.put("a", "aaa");  map.put("b", "bbb");  map.put("c", "ccc");  map.put("d", "ddd");  Iterator<String> iterator = map.keySet()。iterator();  while (iterator.hasNext()) {  Object key = iterator.next();  System.out.println("map.get(key) is :" + map.get(key));  }  // 定义HashTable,用来测试  Hashtable<String, String> tab = new Hashtable<String, String>();  tab.put("a", "aaa");  tab.put("b", "bbb");  tab.put("c", "ccc");  tab.put("d", "ddd");  Iterator<String> iterator_1 = tab.keySet()。iterator();  while (iterator_1.hasNext()) {  Object key = iterator_1.next();  System.out.println("tab.get(key) is :" + tab.get(key));  }  TreeMap<String, String> tmp = new TreeMap<String, String>();  tmp.put("a", "aaa");  tmp.put("b", "bbb");  tmp.put("c", "ccc");  tmp.put("d", "cdc");  Iterator<String> iterator_2 = tmp.keySet()。iterator();  while (iterator_2.hasNext()) {  Object key = iterator_2.next();  System.out.println("tmp.get(key) is :" + tmp.get(key));  }  }  }  运行结果如下:  map.get(key) is :ddd  map.get(key) is :bbb  map.get(key) is :ccc  map.get(key) is :aaa  tab.get(key) is :bbb  tab.get(key) is :aaa  tab.get(key) is :ddd  tab.get(key) is :ccc  tmp.get(key) is :aaa  tmp.get(key) is :bbb  tmp.get(key) is :ccc  tmp.get(key) is :cdc  HashMap的结果是没有排序的,而TreeMap输出的结果是排好序的。  下面就要进入本文的主题了。先举个例子说明一下怎样使用HashMap:  import java.util.*;  public class Exp1 {  public static void main(String[] args){  HashMap h1=new HashMap();  Random r1=new Random();  for (int i=0;i<1000;i++){  Integer t=new Integer(r1.nextInt(20));  if (h1.containsKey(t))  ((Ctime)h1.get(t))。count++;  else  h1.put(t, new Ctime());  }  System.out.println(h1);  }  }  class Ctime{  int count=1;  public String toString(){  return Integer.toString(count);  }  } 在HashMap中通过get()来获取value,通过put()来插入value,ContainsKey()则用来检验对象是否已经存在。可以看出,和ArrayList的操作相比,HashMap除了通过key索引其内容之外,别的方面差异并不大。  前面介绍了,HashMap是基于HashCode的,在所有对象的超类Object中有一个HashCode()方法,但是它和equals方法一样,并不能适用于所有的情况,这样我们就需要重写自己的HashCode()方法。下面就举这样一个例子:  import java.util.*;  public class Exp2 {  public static void main(String[] args){  HashMap h2=new HashMap();  for (int i=0;i<10;i++)  h2.put(new Element(i), new Figureout());  System.out.println("h2:");  System.out.println("Get the result for Element:");  Element test=new Element(5);  if (h2.containsKey(test))  System.out.println((Figureout)h2.get(test));  else  System.out.println("Not found");  }  }  class Element{  int number;  public Element(int n){  number=n;  }  }  class Figureout{  Random r=new Random();  boolean possible=r.nextDouble()>0.5;  public String toString(){  if (possible)  return "OK!";  else  return "Impossible!";  }  }  在这个例子中,Element用来索引对象Figureout,也即Element为key,Figureout为value.在Figureout中随机生成一个浮点数,如果它比0.5大,打印"OK!",否则打印"Impossible!".之后查看Element(3)对应的Figureout结果如何。  结果却发现,无论你运行多少次,得到的结果都是"Not found".也就是说索引Element(3)并不在HashMap中。这怎么可能呢?  原因得慢慢来说:Element的HashCode方法继承自Object,而Object中的HashCode方法返回的HashCode对应于当前的地址,也就是说对于不同的对象,即使它们的内容完全相同,用HashCode()返回的值也会不同。这样实际上违背了我们的意图。因为我们在使用 HashMap时,希望利用相同内容的对象索引得到相同的目标对象,这就需要HashCode()在此时能够返回相同的值。在上面的例子中,我们期望 new Element(i) (i=5)与 Elementtest=newElement(5)是相同的,而实际上这是两个不同的对象,尽管它们的内容相同,但它们在内存中的地址不同。因此很自然的,上面的程序得不到我们设想的结果。下面对Element类更改如下:  class Element{  int number;  public Element(int n){  number=n;  }  public int hashCode(){  return number;  }  public boolean equals(Object o){  return (o instanceof Element) && (number==((Element)o)。number);  }  }  在这里Element覆盖了Object中的hashCode()和equals()方法。覆盖hashCode()使其以number的值作为 hashcode返回,这样对于相同内容的对象来说它们的hashcode也就相同了。而覆盖equals()是为了在HashMap判断两个key是否相等时使结果有意义(有关重写equals()的内容可以参考我的另一篇文章《重新编写Object类中的方法》)。修改后的程序运行结果如下:  h2:  Get the result for Element:  Impossible!  请记住:如果你想有效的使用HashMap,你就必须重写在其的HashCode()。  还有两条重写HashCode()的原则:  [list=1]  不必对每个不同的对象都产生一个唯一的hashcode,只要你的HashCode方法使get()能够得到put()放进去的内容就可以了。即"不为一原则".  生成hashcode的算法尽量使hashcode的值分散一些,不要很多hashcode都集中在一个范围内,这样有利于提高HashMap的性能。即"分散原则".至于第二条原则的具体原因,有兴趣者可以参考Bruce Eckel的《Thinking in Java》,在那里有对HashMap内部实现原理的介绍,这里就不赘述了。  掌握了这两条原则,你就能够用好HashMap编写自己的程序了。不知道大家注意没有,java.lang.Object中提供的三个方法:clone(),equals()和hashCode()虽然很典型,但在很多情况下都不能够适用,它们只是简单的由对象的地址得出结果。这就需要我们在自己的程序中重写它们,其实java类库中也重写了千千万万个这样的方法。利用面向对象的多态性--覆盖,Java的设计者很优雅的构建了Java的结构,也更加体现了Java是一门纯OOP语言的特性。

Java中的HashMap的工作原理是什么?

【答案】:Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

Java中的HashMap的工作原理是什么?

在Windows下运行应用程序时出现非法操作的提示此类故障引起原因较多,在如下几钟可能:(1) 系统文件被更改或损坏,倘若由此引发则打开一些系统自带的程序时就会出现非法操作,(例如,打开控制面板)(2) 驱动程序未正确安装,此类故障一般表现在显卡驱动程序之止,倘若由此引发,则打开一些游戏程序时就会产生非法操作,有时打开一此网页也会出现这种程况。(3) 内存质量不好,降低内存速度也可能会解决这个问题。(4) 软件不兼容,如,IE 5。5在Windows 98 SE 上,当打开多个网页也会产生非法操作。

一个中级java工程师应该掌握哪些知识?有什么途径去获取这些知识?

一个中级java工程师应该掌握编码能力和业务能力,可以通过网上课程获取这些知识,中级java工程师需要综合能力,丰富的经验。

工作3年的Java程序员应该掌握哪些技能

如果我面试3年的工程师。至少看他使用的框架是否了解。 你用的是ssh,ssi还是hadoop。只要你用了,就必须对其比较熟悉。另外java的基本内容,容器类,工具类的使用。数据库的使用。没人会指望你会所有的框架,但是你使用的熟不熟悉,代表你是否好学,是否能力足够。

java的LinkedHashSet是怎样实现存取有序的, 底层原理是什么

看源码去吧

JAVA中的HASHSET和HASHMap的底层实现是怎样的?大致讲一下。

上面的仁兄讲的挺清楚的,回楼主的追问,hash值是不会一样的

Java中的HashMap的工作原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量(capacity),负载因子(loadfactor)和扩容极限(thresholdresizing)。

java队列实现异步执行

你想问什么呢?判断队列是否有值?取队列中的值?这两个问题你能完成的话还有啥需要解决呢?跟你以前的需求不一样么?

用java SWT做迅雷项目时线程老卡死怎么办?求具体实例

swt执行线程SWT中的多线程机制和awt/swing中有些不同,这个大家应该都知道,不过还是要说下,Display对象中负责调用其他线程的方法有以下3种:● asyncExec(Runnable runnable):异步启动新的线程。所谓异步就是,UI线程不会等待runnable对象执行结束后再继续进行,就是说UI线程可以和runnable对象所在的线程同时运行。● syncExec(Runnable runnable):同步启动新的线程。所谓同步就是,UI线程会等待runnable对象执行结束后才会继续进行,当runnable对象是耗时大的线程时,尽量不要采用此种方式。另外,对于该种方式创建的线程可通过getSyncThread()方法获得线程对象。● timerExec(int milliseconds,Runnable runnable):指定一段时间再启动新的线程。用此方法创建的线程,将会在指定的时间后再启动线程。当然用此方法创建的线程启动后,与UI线程是异步的。如果指定的时间为负数,将不会按时启动线程。另外Display对象中,与UI线程相关的方法如下所示:● 获得当前的UI线程对象的方法:getThread(),返回Thread对象。● 使UI线程处于休眠状态:sleep()。● 唤醒UI线程:wake()。上面几点都是书里面的原话,不做阐述了.下面我要说的是一个写法的问题,不能小瞧啊,后果很严重.如果有一个线程他要做的事需要很久比如5分钟,像我这样的初学swt的人一定是new了一个线程然后getDisplay().asyncExec(线程对象); 结果虽然执行成功,但是界面确处于挂起状态(假死),直到执行结束,不过要说的是的确是异步执行的,还是ui却不知道为什么停止用户响应,原理暂时先不去理了,swt源码太复杂了.这里面就要引出一个问题为什么不 像下面这么写呢?Thread thread = new Thread(线程对象); thread.start();因为swt中非UI线程中调用窗口控件如果不像上面三种写法那样写的话,会抛org.eclipse.swt.SWTException: Invalid thread access这个异常在swt中程序启动时只有一个主线程,在这里与awt和swing是不一样的,它不允许其他线程访问UI主线程中的部件,具读过swt源码的人说AsyncExec方法根本就没有新启动一个线程而是由Synchronizer调用其中的 run 方法而已.如果是这样的话,也就难怪UI会挂起.解决这个问题的一个比较好的方法是如果要异步执行的线程所做的工作非常少的话,就无所谓了,如果异步线程需要执行很长时间的话,应该像下面这样启动线程Thread thread = new Thread(线程对象); thread.start();在线程对象里面所有调用到UI部件的地方classFinder.getGui().getDisplay().syncExec(new Runnable() { public void run() { //do run }});历经几个小时问题终于解决了这里做个总结吧.我对swt多线程的评价swt的syncExec ,asyncExec 以及timerExec都是伪线程执行方法,把它看成特别的Synchronizer调用就可以了,syncExec ,asyncExec 以及timerExec执行的线程要做的事只是改变UI部件的属性而已执行时间不能太长.此外的其他操作仍然由传统的线程来做.这里要特别注意,swt执行线程只用于在传统线程中操作ui组建在这里要感谢内部类,否则一个复杂的swt线程不知道要写多少个为swt部件服务的标准类

请问如何用java的SWT实现树节点的动态修改?

在SWT中的tree 和table要实现对应的动态编辑功能,SWT中实现了这样的方法,对应的类叫做TableEditor和TreeEditor.可以去看看

Java桌面端程序开发

  Java对于服务器 个人电脑和移动设备来说是一项伟大的技术 由于需要java的跨平台的特性 因此java在服务器和移动设备方面的应用是非常成功的 但java在个人电脑应用方面的情况和在服务器及移动设备方面的应用有所不同 但是这很快就会有所改变 至少比你想象得要快 在这篇文章中 我会分析一下java在桌面环境中的应用将怎样得到提升 然后具体说一下java GUI(用户图形接口)的三个主要的工具:AWT Swing 和SWT 在下文中 我将会开发一个完整的java桌面应用程序      Java与桌面端   现在 流行的桌面平台要数Windows Mac and Linux了 但它们不是十全十美的 Windows主宰著桌面操作系统的市场 其上有巨大的应用和开发群体 但它昂贵且有许多安全漏洞 Linux有着稳固的基础 它是开源的软件 比Windows更可靠 Macs非常容易操作且不是黑客的目标 但与Windows和Linux比起来 Mac的硬件和软件可选的余地非常的有限 公司和个人选择他们的操作系统基于许多因素 花费少且安全性高是首选的因素 这导致一些组织从Windows 系统转而选择Linux 对许多用户来说 可用性及对原有应用程序的支持是非常重要的因素 这意味着Windows 将继续享有巨大的市场 Mac有其自己忠诚的用户 这使得苹果机仍然可以存活 Linux 在桌面的流行及Mac的成功创造了多样性 这种多样性正是Java需要的 这种多样性使得Java在桌面有举足轻重的地位      跨平台的支持   Java 运行于所有相关的操作系统 包括Windows Mac和Linux 对于任何组织 他想把现有的应用从一个操作系统移植到另一个操作系统而不用做太多的改动 那么Java正是他们首选的桌面开发平台 或许用微软的可视化工具很容易构建 NET应用 但是这将使你被绑定在了Windows平台上了 很多人也许想立刻用Linux 代替Windows 从而避免由微软件操作系统的漏洞带来的问题 用户不能容忍的问题之一是当从Windows移植到Linux带来的巨大的费用 如果你的应用程序用Java构建 你就没有了这些问题 Java的图形用户界面看上去会跟你用的操作系统一样 而并不需要做什么改动 假如有一天又有一种桌面操作系统出现的话 java 是个安全的赌注 因为它现在能够运行在Windows和Linux 上 那么可以推测它也可以运行在将来可能出现的操作系统上 这些操作系统可能或迟或早地由微软 或是开源社区 或是其它的人开发出来      丰富的特征   最初 Java只有非常有限的一些特征去构建图形用户界面 思想就是用平台无关的Java应用程序接口打包不同的操作系统的本地图形用户界面 称之为抽象的窗口工具 仅有普通的部件如文件域 文本区 选择框 单选按钮 列表框和按钮被AWT支持 图形和图像的特性支持非常有限 也就是说 只足够构建简单的applet程序 认识到需要更高级的图形用户界面组件和图形能力 Sun公司开发了Swing Java D Java D 图像的输入/输出 Java高级图像(JAI)和很多其它的 这些中的一些窗体组件现在已经是Java 标准版(J SE)里的一部分 并且其它的一些扩展必须和你的应用程序打包在一起 例如Swing Java D 图像的输入/输出都是Java的核心API 随着Java开发工具包(JDK)和Java运行环境一起提供 让我们不要忘了J EE平台 如果你开发服务器端的应用程序并且需要丰富的图形用户界面 那么你毫无疑问应该选择Java 这允许你把服务器端的一些代码移到客户端 反之亦然 例如 一个项目可能开始是基于WEB和图形界面 在某些时候 用户可能要求图形元素不能在HTML中实现 如果你选择java做客户端应用 那么你可以重用这些当初用来做服务器端的代码 如果你用远程调用 一些类会真正地实现服务器和客户端的共享 通过页面服务器 Java桌面应用也能够和其它的Java 或非Java应用程序通信 如CORBA TCP/IP 或是 HTTP        Java图形界面工具   Java有三个主要的图形界面工具 AWT Swing和SWT Swing 是构建java图形界面标准的API(应用程序接口) 一些AWT类由Swing基础而来 SWT是一个非常有前途的新的窗体工具 由IBM资助 但是事实上 这三者相互补充 他们满足不同的需求      AWT   抽象窗口工具集为简单的applet程序设计 它不适宜用来构建丰富的桌面图形界面 但是从开始被介绍 它至少有一个好的思想就是布局管理 它负责为组件找到一个放置的位置 这种机制是必需的 因为GUI组件在不同的操作系统中有不同的尺寸 现在 AWT扩展了组件模型和事件处理机制(由JavaBeans说明定义) 新的图形API(称为Java D) 支持剪贴板和拖拉操作 打印 准入 和新的GUI工具Swing 所有这些都归到Java基础类中(JFC) Swing Swing是曾经开发的最复杂的GUI之一 它有一套完全的组件从按钮到文件域到表格 树型和文件编辑器 这些组件不依赖于操作系统本地的部件 而是用原始的图形像直线 矩形 文字画出 这种画代表感观插件 它能够模仿本地的感观 Swing也有平台无关的外观称为 Metal Swing的结构由MVC模式得到启发 这里在屏幕上的视觉GUI组件和支持数据的模型对象之间有一个明显的分隔 在GUI和数据层之间的通讯基于事件 在最初的Swing版本中有许多错误并且有执行问题 这减慢了接受它的速度 Swing最大的问题是被从事于并且许多人相信它是为开发桌面应用而准备的 今天 有许多基于Swing开发的商业产品 包括大多数的Java集成开发工具 我所喜欢的集成开发工具是Jbuilder 它的速度相当的快      SWT   SWT是IBM为它的Eclipse集成开发环境而开发的图形用户界面工具 SWT可以在Eclipse环境外使用 而且提供对操作系统本地图形用户界面的直接访问 因此 基于SWT的Java应用程序拥有本地的图形用户界面并且可以和本地别的应用程序和部件集成在一起 假如你的桌面应用程序产生HTML报表 你想把它显示给用户看 你可以使用Swing去浏览简单的HTML文档 但这不是一个理想的的解决方案 最好是在你的应用程序里提供IE或者Mozilla浏览器引擎 SWT社区现在正在设计浏览器API 这些API可以让你产生基于IE或者Mozilla的HTML窗口 SWT现在可以在AIX HPUX Linux QNX Solaris and Windows下面运行 Mac OS X is 也在进行之中      误解与Bug   对于java/Swing一直有着误解 诸如 Java/Swing太慢了 或者是Java/Swing需要更多的内存 Swing也许在老式的奔腾的cpu而且只有 m内存运行JDK 运行起来却是很慢 但是如果在PIII级别的CPU有着 mb的内存 运行JDK 环境是足够快的 对于一个应用程序来说鼠标在 毫秒和在 毫秒的反映的区别 对于使用者来说看起来是 没什么区别的 Java在企业级的数百人 上千人同时在线的服务器表现的很好 Java在对于有限资源的移动设备上的表现也是很出色的 那为什么Java不能成为很好的桌面应用程序呢?以我的观点看 Swing的bug比其运行速度慢这问题还严重 例如 如果你用的是JDK 你将不能在表格(称为JTable)中输入%& ($#!q 等这些字符 这八个字符和箭头键及Home End Pgup and Pgdn这几个键的键值是相同的 其中一个由JTable由到的类调用了KeyEvent getCharCode()方法代替KeyEvent getKeyCode() 这个bug这JDK 已经得到了纠正 你大概已经放弃过Swing 如果你是从用JDK 的Swing 你可能因为你不能在表格里输入q而恼怒 可能不幸的是你正需要用Jtable开发一个Swing应用 你将花费许多时间从sun的bug数据库中查找解决的办法 但没有发现你需要的(记住在那时Swing还是个新事物) 你将花费更多的时间去看Swing的源代码和发展中的工作区 经过了这个的经历之后 很少有人很在另一个项目里再用Swing了 你的工作区会像下面这样子   import java awt *; import java awt event *; import javax swing *; import javax swing table *;     public class WorkingTable extends JTable { public static final boolean JDK = System getProperty( java version ) startsWith( );     public void processKeyEvent(KeyEvent e) { if (JDK ) { char ch = e getKeyChar(); if (e getID() == KeyEvent KEY_TYPED && (( <= ch && ch <= 40) || ch == "q")) { int anchorRow = getSelectionModel().getAnchorSelectionIndex(); int anchorColumn = getColumnModel() .getSelectionModel().getAnchorSelectionIndex(); if (anchorRow != -1 && anchorColumn != -1) { if (!isEditing()) editCellAt(anchorRow, anchorColumn); Component editorComp = getEditorComponent(); if (isEditing() && editorComp instanceof JTextField) { JTextField textField = (JTextField) editorComp; textField.setText(textField.getText() + ch); return; } } } } super.processKeyEvent(e); }     }     不幸的是,Swing有许多像上面描述的那样的问题,一些问题很难解决,需要做大量的工作。Tw.WInGwiT.例如,Swing的打开文件和保存文件的对话框是基于称为JfileChooser的组件,它部分的执行了JDK 1.2和JDK 1.3(一些特性总是不能用的,要创建一个新的目录对大多数用户来是一个挑战)。我不知道为什么Sun需要几年的时间直到jdk1.4中才完成JfileChooser。在JDK 1.4之前,你有两种选择:用这种破烂的JfileChooser或是创建你自己的文件选择框,Borland公司在他们的JBuilder 4中做一个很好的文件打开对话框。然而,大多数的开发者用的是标准的JfileChooser,给他们的用户带来许多问题。有一件重要的事情需要注意:可以像上面描述的那个去创建工作环境,因为Swing的源代码是可以得到的。学习java源代码也能够让你成为更好的程序员并且让你理解工作在Java API的内部机制。当你开发你自己习惯的GUI组件,这点是有用 lishixinzhi/Article/program/Java/hx/201311/26851

java中SWT鼠标单击事件监听器

为什么不能满足?mouseUp就是按下之后被释放,mouseDown是按下去还没有释放。你可以结合Control的bound和location来计算按下和释放时的位置来确定是否进行必要的事件处理。

在线等 小白等大神来解答一下这个Java SWT问题~

Caused by: java.lang.IllegalArgumentException: Argument cannot be null关键在这句话,说的是你的参数不能为空,你看下你的程序是不是哪里需要一个参数,而你没写呢!然后提醒你一下,如果你要问问题最好把你的问题说清楚一点,有代码的尽量把代码附上,这样回答者才能更好的帮你解决问题!

java swt 中如何刷新组件

你需要从新执行以下哪个读文件列表的函数,这样就可以实现刷新了。

java swt 窗口监听问题

如果要想弹出B的话,你的B类.肯定是已经写的了.那就这样Button c = new Button(shell, SWT.none); c.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { new B(); } });

java用swt 如何建立选择文件夹路径的对话框?

放在陆经理

java 用SWT开发软件,打包为jar无法出现界面

打包成jar要打包成runablejar。

java求助:swt中如何隐藏顶部菜单

窗体顶部菜可以在实例化的时候设置,也可以单独设置:Shell s = new Shell(parent,SWT.BORDER); //建立一个有边框但没有标题栏的窗口 Shell dlgShell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); setShellStyle(这里可以任意设置样式);能够设置的样式如下:(以下属性可以多选,但是某些属性相冲突时会导致设置的其他属性失效)SWT.BORDER //建立一个有边框但没有标题栏的窗口SWT.CLOSE //建立一个只有关闭按钮的窗口SWT.MIN //建立一个不能最大化的窗口SWT.MAX, //建立一个可以最大化最小化的窗口SWT.NO_TRIM //建立一个没有任何边界和标题栏的窗口SWT.RESIZE //建立一个可以改变大小的窗口SWT.TITLE //建立一个没有标题栏图标,没有关闭按钮的窗口SWT.ON_TOP //建立一个总是在上的窗口,注意:此属性最好与CLOSE、MIN、MAX一起使用。SWT.TOOL //建立一个类似工具栏的窗口SWT.APPLICATION_MODAL //建立一个APPLICATION模态窗口SWT.MODELESS //建立一个非模态窗口SWT.PRIMARY_MODAL //建立一个PRIMARY模态窗口SWT.SYSTEM_MODAL //建立一个SYSTEM模态窗口 还有两个快捷属性来建立窗口SHELL_TRIM //建立一个标准模式的窗口,相当于属性设置为CLOSE | TITLE | MIN | MAX | RESIZEDIALOG_TRIM //建立一个对话框模式的窗口,相当于属性设置为TITLE | CLOSE | BORDER

java中,用SWT创建主窗体,我想点击关闭按钮时弹出个对话框,判断是否退出系统还是最小化到托盘...

你是不是给你窗体设了frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)?改为frame.setDefaultCloseOperation(do_nothing_on_close);

JAVA 运行 包含SWT包的程序报错了错,怎么解决啊,我在问题补充那里有说明错误哦

方法1,安装一个32位的jdk 然后window->preferences->java->installed JREs 勾选32位的jdk方法2,下载一个64位的SWT,替换即可

java swt出错,初学者求解决

额。。我想问,你这写法是什么语言转过来的,看着怪别扭的,大小写之类的全部都没区分。错误的话,应该是,text.setText(null);这个不能设置为null,改成text.setText("");就可以了。

Java 插件开发SWT中布局。用的是gridData

SWT插件用于Java 图形用户界面开发的,可以去其官网下载与Eclipse版本相关的压缩包。本人使用的是Eclipse3.4,下载的SWT包是Designer_v6.7.0_for_Eclipse3.4.zip。(注:SWT必须与Eclipse版本要一致,下载SWT是要看清楚)。将下载的SWT包解压缩,解压后有一个批处理文件和features、plugins文件夹。将这个批处理文件拷贝到eclipse目录,双击运行。然后将该批处理文件删除。将SWT解压包中features、plugins文件夹中的内容全部拷贝到eclipse的相应目录中。(注:有的资料上说:需要将eclipse目录下的configuration目录中,所有org.eclipse.*文件夹都删除。我这样试了,但是这样做Eclipse根本无法启动。所以我的这个方法中不需要这样做,不知到是否与eclipse的版本有关,还需详细考证)。然后启动eclipse,在file-new-other中如果看到designer选项,就证明SWT安装成功了。下来进行插件的注册,我选择的免费注册,不过这样需要填写一个用户的详细资料,然后就会通过email收到一个注册码。步骤:window-Preferences-Designer-Registration and Activation。在select a product to evaluate中选择SWT-Designer。点击next,然后填写你的个人信息。然后就会通过email收到一个Activation key。重新执行上述注册步骤,在Activation Key的文本框中输入通过email收到的key就完成了SWT的免费注册。

Java swt 怎样通过 按不同的按钮 在一个地方 显示 不同的table(如图,按学

jtabpanel可以实现,另个动态table model也可以实现

JAVA问题

你能不能把代码发下呢?你丢个异常给大家 大家如何分析啊

java swt 焦点事件

filterText.addFocusListener(new FocusAdapter(){ @Override public void focusGained(FocusEvent e) { filterText.selectAll(); } });

java有了Swing,为什么还要使用SWT呢?

由于在不同的操作系统下,提供的控件是不一样的,AWT采用最小公约数的办法,只提供所有操作系统都有的控件。但后来SUN改变了做法,在Swing里除了JFrame,JWinodows,JDialog(记不太清了,好像是这几个)是调用本地操作系统的控件,其它JPanel,JButton之类的都是绘出来的,所以Swing在所有平台看起来都是一样的外观。这样保持了外观一致性,但牺牲了性能。 IBM更喜欢AWT的实现机制,做出了SWT,SWT采用的是最大公倍数的做法。SWT大部分都是用的本地操作系统的控件,一些在windows里有的控件可能在linux下没有,对这种控件才采用自己绘制的方式。SWT采用类似JAVA虚拟机的方式,在不同的平台,有不同的开发包,我们写的java代码是一样的,但不同平台下看起来外观是不一样的,但性能提升很高,据说和C++做的界面速度差不多:) 也许你会问哪种更好,引一名话:this is equivalent to asking whether a harmmer is better than a screw driver,of course ,a hammer wieldded with sufficient force can probably drive a screw into a wall ,and the butt of a screw can be used in a pinch to knock in a nail. However, a good carpenter keeps both harmer and screw drivers in her tool box and will use the tool that is appropriate for the job at hand. 个人感觉以前java做界面完全没有优势,从外观到性能(我很喜欢Swing的look and feel,可以改变风格),SWT的出现改变了性能上的缺点,再加上JFace,及Eclipse的RCP,我还是倾向于用SWT。

swt是仅用于eclipse还是java的基础类库里的?

eclipse 是用Swt开发的,swt是为了开发Eclipse而设计的一个可视化组件,相当的不错,所以说在Eclipse的安装目录下肯定有Swt这个包,同事Swt也是可用用来做应用软件开发的,比起Swing,Awt有很多优势。

java中SWT是不是已经过时了,没有swing好用哦?

原来是Eclipse推出的。。 囧

Java桌面应用程序设计:SWT简介

  Java语言的声望和它在桌面应用程序(GUI程序)所取得的成就显然极不相符 至今仍然很少能看到非常成功Java桌面程序 虽然有JBuilder Netbean JProbe等大型软件作为代表 但这仍不能证明Java的GUI程序是成功的 它们的外观总是和同一操作系统平台下的其它软件显得格格不入 对机器配置的需求也似乎永无止境 这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍 或是那些不在乎金钱和时间的专业用户所接受 对绝大多数计算机使用者来说 AWT或SWING代表着怪异的界面和无法接受的速度 Standard Widget Toolkit(SWT)或许是Java这一噩梦的终结者 广大Java程序员终于可以开发出高效率的GUI程序 它们拥有标准的外观 几乎没有人能看出你的程序是用Java写出来的 更为重要的是 这些程序是跨平台的   SWT本身仅仅是Eclipse组织为了开发Eclipse IDE环境所编写的一组底层图形界面 API 或许是无心插柳 或是有意为之 至今为止 SWT无论是在性能和外观上 都超越了SUN公司提供的AWT和SWING 目前Eclipse IDE已经开发到了 版本 SWT已经十分稳定 这里指的稳定应该包含两层意思   一是指性能上的稳定 其中的关键是源于SWT的设计理念 SWT最大化了操作系统的图形构件API 就是说只要操作系统提供了相应图形的构件 那么SWT只是简单应用JNI技术调用它们 只有那些操作系统中不提供的构件 SWT才自己去做一个模拟的实现 可以看出SWT的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性   另一个稳定是指SWT API包中的类 方法的名称和结构已经少有改变 程序员不用担心由于Eclipse组织开发进度很快(Eclipse IDE每天都会有一个Nightly版本的发布) 而导致自己的程序代码变化过大 从一个版本的SWT更新至另一版本 通常只需要简单将SWT包换掉就可以了    第一个SWT程序   下面让我们开始一个SWT程序 (注意 以下的例子和说明主要针对Windows平台 其它的操作系统应该大同小异) 首先要在Eclipse安装文件中找到SWT包 Eclipse组织并不提供单独的SWT包下载 必须下载完整的Eclipse开发环境才能得到SWT包 SWT是作为Eclipse开发环境的一个插件形式存在 可以在${你的eclipse安装路径}plugins路径下的众多子目录下去搜索SWT JAR文件 在找到的JAR文件中包含了SWT全部的Java类文件 因为SWT应用了JNI技术 因此同时也要找到相对应的JNI本地化库文件 由于版本和操作平台的不同 本地化库文件的名称会有些差别 比如SWT WIN DLL是Window平台下Eclipse Build 的动态库 而在Unix平台相应版本的库文件的扩展名应该是 so 等等 注意的是 Eclipse是一个开放源代码的项目 因此你也可以在这些目录中找到SWT的源代码 相信这会对开发很有帮助 下面是一段打开空窗口的代码(只有main方法) import e one example;public class OpenShell{ public static void main(String [] args) {  Display display = new Display();  Shell shell = new Shell(display);  shell open();  // 开始事件处理循环 直到用户关闭窗口  while (!shell isDisposed()) {   if (!display readAndDispatch())    display sleep();  }  display dispose(); }}   确信在CLASSPATH中包括了SWT JAR文件 先用Javac编译例子程序 编译无错后可运行java Djava library path=${你的SWT本地库文件所在路径} e one example OpenShell 比如SWT WIN DLL件所在的路径是C:swtlib 运行的命令应该是java Djava library path=c:swtlib e one example OpenShell 成功运行后 系统会打开了一个空的窗口    剖析SWT API   下面再让我们进一步分析SWT API的组成 所有的SWT类都用 eclipse swt做为包的前缀 下面为了简化说明 我们用*号代表前缀 eclipse swt 比如* widgets包 代表的是 eclipse swt widgets包   我们最常用的图形构件基本都被包括在* widgets包中 比如Button Combo Text Label Sash Table等等 其中两个最重要的构件当数Shell和Composite Shell相当于应用程序的主窗口框架 上面的例子代码中就是应用Shell构件打开一个空窗口 Composite相当于SWING中的Panel对象 充当着构件容器的角色 当我们想在一个窗口中加入一些构件时 最好到使用Composite作为其它构件的容器 然后再去* layout包找出一种合适的布局方式 SWT对构件的布局也采用了SWING或AWT中Layout和Layout Data结合的方式 在* layout包中可以找到四种Layout和与它们相对应的布局结构对象(Layout Data) 在* custom包中 包含了对一些基本图形构件的扩展 比如其中的CLabel 就是对标准Label构件的扩展 上面可以同时加入文字和图片 也可以加边框 StyledText是Text构件的扩展 它提供了丰富的文本功能 比如对某段文字的背景色 前景色或字体的设置 在* custom包中也可找到一个新的StackLayout布局方式   SWT对用户操作的响应 比如鼠标或键盘事件 也是采用了AWT和SWING中的Observer模式 在* event包中可以找到事件监听的Listener接口和相应的事件对象 例如常用的鼠标事件监听接口MouseListener MouseMoveListener和MouseTrackListener 及对应的事件对象MouseEvent   * graphics包中可以找到针对图片 光标 字体或绘图的API 比如可通过Image类调用系统中不同类型的图片文件 通过GC类实现对图片 构件或显示器的绘图功能   对不同平台 Eclipse还开发了一些富有针对性的API 例如 在Windows平台 可以通过* ole win 包很容易的调用ole控件 这使Java程序内嵌IE浏览器或Word Excel等程序成为可能!    更复杂的程序   下面让我们展示一个比上面例子更加复杂一些的程序 这个程序拥有一个文本框和一个按键 当用户点击按键的时候 文本框显示一句欢迎信息   为了文本框和按键有比较合理的大小和布局 这里采用了GridLayout布局方式 这种布局是SWT中最常用也是最强大的布局方式 几乎所有的格式都可能通过GridLayout去达到 下面的程序也涉及到了如何应用系统资源(Color) 以及如何释放系统资源 private void initShell(Shell shell) { //为Shell设置布局对象 GridLayout gShellLay = new GridLayout(); shell setLayout(gShellLay); //构造一个Composite构件作为文本框和按键的容器 Composite panel = new Composite(shell SWT NONE); //为Panel指定一个布局结构对象   这里让Panel尽可能的占满Shell 也就是全部应用程序窗口的空间  GridData gPanelData = new GridData(GridData GRAB_HORIZONTAL| GridData GRAB_VERTICAL|GridData FILL_BOTH); panel setLayoutData(gPanelData); //为Panel也设置一个布局对象 文本框和按键将按这个布局对象来显示  GridLayout gPanelLay = new GridLayout(); panel setLayout(gPanelLay); //为Panel生成一个背景色 final Color bkColor = new Color(Display getCurrent() ); panel setBackground(bkColor); //生成文本框 final Text text = new Text(panel SWT MULTI|SWT WRAP); //为文本框指定一个布局结构对象   这里让文本框尽可能的占满Panel的空间  GridData gTextData = new GridData (GridData GRAB_HORIZONTAL| GridData GRAB_VERTICAL|GridData FILL_BOTH); text setLayoutData(gTextData); //生成按键 Button butt = new Button(panel SWT PUSH); butt setText( Push ); //为按键指定鼠标事件 butt addMouseListener(new MouseAdapter(){  public void mouseDown(MouseEvent e){   //当用户点击按键的时候 显示信息   text setText( Hello SWT );  } }; //当主窗口关闭时 会触发DisposeListener 这里用来释放Panel的背景色  shell addDisposeListener(new DisposeListener(){  public void widgetDisposed(DisposeEvent e) {   bkColor dispose();  } };}   把这段代码中的方法initShell()加入到第一个打开空窗口的例子中 得到的是一段能成功运行的完整GUI应用程序 运行方法可参考第一个例子    系统资源的管理   在一个图形化的操作系统中开发程序 都要调用系统中的资源 如图片 字体 颜色等 通常这些资源都是有限的 程序员务必非常小心的使用这些资源 当不再使用它们时 就请尽快释放 不然操作系统迟早会油尽灯枯 不得不重新启动 更严重的会导致系统崩溃   SWT是用Java开发的 Java语言本身的一大优势就是JVM的 垃圾回收机制 程序员通常不用理会变量的释放 内存的回收等问题 那么对SWT而言 系统资源的操作是不是也是如此?答案是一个坏消息 一个好消息   坏消息是SWT并没采用JVM的垃圾回收机制去处理操作系统的资源回收问题 一个关键的因素是因为JVM的垃圾回收机制是不可控的 也就是说程序员不能知道 也不可能做到在某一时刻让JVM回收资源!这对系统资源的处理是致命的 试想你的程序希望在一个循环语句中去查看数万张图片 常规的处理方式是每次调入一张 查看 然后就立即释放该图片资源 而后在循环调入下一张图片 这对操作系统而言 任何时刻程序占用的仅仅是一张图片的资源 但如果这个过程完全交给JVM去处理 也许会是在循环语句结束后 JVM才会去释放图片资源 其结果可能是你的程序还没有运行结束 操作系统已经宕掉   但下面的好消息也许会让这个坏消息变得无关紧要 对于SWT 只需了解两条简单的 黄金 法则就可以放心的使用系统资源!之所以称为黄金法则 一是因为少 只有两条 二是因为它们出奇的简单 第一条是 谁占用 谁释放 第二条是 父构件被销毁 子构件也同时被销毁 第一条原则是一个无任何例外的原则 只要程序调用了系统资源类的构造函数 程序就应该关心在某一时刻要释放这个系统资源 比如调用了 Font font = new Font (display Courier SWT NORMAL);   那么就应该在不在需要这个Font的时候调用 font dispose();   对于第二个原则 是指如果程序调用某一构件的dispose()方法 那么所有这个构件的子构件也会被自动调用dispose()方法而销毁 通常这里指的子构件与父构件的关系是在调用构件的构造函数时形成的 比如 Shell shell = new Shell();Composite parent = new Composite(shell SWT NULL);Composite child = new Composite(parent SWT NULL);   其中parent的父构件是shell 而shell则是程序的主窗口 所以没有相应的父构件 同时parent又包括了child子构件 如果调用shell dispose()方法 应用第二条法则 那么parent和child构件的dispose()方法也会被SWT API自动调用 它们也随之销毁    线程问题   在任何操作平台的GUI系统中 对构件或一些图形API的访问操作都要被严格同步并串行化 例如 在一个图形界面中的按键构件可被设成可用状态(enable)或禁用状态(disable) 正常的处理方式是 用户对按键状态设置操作都要被放入到GUI系统的事件处理队列中(这意味着访问操作被串行化) 然后依次处理(这意味着访问操作被同步) 想象当按键可用状态的设置函数还没有执行结束的时候 程序就希望再设置该按键为禁用状态 势必会引起冲突 实际上 这种操作在任何GUI系统都会触发异常   Java语言本身就提供了多线程机制 这种机制对GUI编程来说是不利的 它不能保证图形构件操作的同步与串行化 SWT采用了一种简单而直接的方式去适应本地GUI系统对线程的要求 在SWT中 通常存在一个被称为 用户线程 的唯一线程 只有在这个线程中才能调用对构件或某些图形API的访问操作 如果在非用户线程中程序直接调用这些访问操作 那么SWTExcepiton异常会被抛出 但是SWT也在* widget Display类中提供了两个方法可以间接的在非用户线程的进行图形构件的访问操作 这是通过syncExec(Runnable)和asyncExec(Runnable)这两个方法去实现 例如 //此时程序运行在一个非用户线程中 并且希望在构件panel上加入一个按键 Display getCurrent() asyncExec(new Runnable() { public void run() {  Button butt = new Button(panel SWT PUSH);  butt setText( Push ); }});   方法syncExec()和asyncExec()的区别在于前者要在指定的线程执行结束后才返回 而后者则无论指定的线程是否执行都会立即返回到当前线程    SWT的扩展 JFace   JFace与SWT的关系好比Microsoft的MFC与SDK的关系 JFace是基于SWT开发 其API比SWT更加易于使用 但功能却没SWT来的直接 比如下面的代码应用JFace中的MessageDialog打开一个警告对话框 MessageDialog openWarning(parent Warning Warning message );   如果只用SWT完成以上功能 语句不会少于 行!   JFace原本是为更加方便的使用SWT而编写的一组API 其主要目的是为了开发Eclipse IDE环境 而不是为了应用到其它的独立应用程序 因此在Eclipse 版本之前 很难将JFace API完整的从Eclipse的内核API中剥离出来 总是要多多少少导入一些非JFace以外的Eclipse核心代码类或接口才能得到一个没有任何编译错误的JFace开发包 但目前Eclipse组织似乎已经逐渐意识到了JFace在开发独立应用程序起到的重要作用 在开发的 版本中 JFace也开始变成了和SWT一样的完整独立的开发包 只是这个开发包还在变动中(笔者写本文时 应用的Eclipse M 版本) JFace开发包的包前缀是以 eclipse jface开头 JAR包的源代码也和SWT一样 也在${你的eclipse安装路径}plugins路径下去找   对开发人员来说 在开发一个图形构件的时候 比较好的方式是先到JFace包去找一找 看是不是有更简洁的实现方法 如果没有再用SWT包去自己实现 比如JFace为对话框提供了很好的支持 除了各种类型的对话框(比如上面用的MessageDialog 或是带有Title栏的对话框) 如要实现一个自定义的对话框也最好从JFace中的Dialog类继承 而不是从SWT中的* widget Dialog继承   应用JFace中的Preference包中的类很容易为自己的软件做出一个很专业的配置对话框 对于Tree Table等图形构件 它们在显示的同时也要和数据关联 例如Table中显示的数据 在JFace 中的View包中为此类构件提供了Model View方式的编程方法 这种方法使显示与数据分开 更加利于开发与维护 JFace中提供最多的功能就是对文本内容的处理 可以在 eclipse jface text * 包中找到数十个与文本处理相关类    与应用程序更近一步   Java程序通常是以class文件的方式发布的 运行class需要JRE或JDK的支持 这又是Java GUI程序的另一个致命的弱点 想象对一个面向广大用户的应用程序来说 无论你的程序功能有多简单 或是你的代码十分的精简 你都不得不让用户去下载一个 M的JRE 那是多么令人沮丧的一件事 而且对程序员来说 Class通常意味着源代码的暴露 反编译的工具让那些居心叵测的人轻易得到你的源代码 虽然有很多对Class的加密方法 但那总是以牺牲性能为代价的 好在我们还有其它的方式可用 把Class编译成exe文件! lishixinzhi/Article/program/Java/gj/201311/27737

JAVA里面Toolkit.getDefaultToolkit()是干什么的?

getDefaultToolkitpublic static Toolkit getDefaultToolkit()获取默认工具包。 如果有一个系统属性名为 "awt.toolkit",则将它看作 Toolkit 的子类的类名。 如果系统属性不存在,则使用的默认工具包是名为 "sun.awt.motif.MToolkit" 的类,它是 Abstract Window Toolkit 的主题实现。 还可以使用 Sun 引用实现中指定的属性 "assistive_technologies" 将其他类加载到 VM 中,该属性是在 "accessibility.properties" 文件的一个行中指定的。加载形式是 "assistive_technologies=...",其中 "..." 是以逗号分隔的、要加载的辅助技术类的列表。每个类都以给定的顺序加载,并且要使用 Class.forName(class).newInstance() 创建每个类的单独实例。此操作在创建 AWT 工具包之后进行。所有错误都通过 AWTError 异常来处理。 返回:默认工具包。 抛出: AWTError - 如果不能找到工具包,或者不能访问或实例化工具包。

Java 的Toolkit 的用法

toolkit此类是所有 Abstract Window Toolkit 实际实现的抽象超类。Toolkit 的子类被用于将各种组件绑定到特定本机工具包实现。这意味着如果设置某一组件的状态,随后立刻查询该状态,则返回的值可能并没有反映所请求的更改。这包括但不局限于以下操作: 滚动到指定位置。例如,如果原始请求没有被处理,那么调用 ScrollPane.setScrollPosition 并随后调用 getScrollPosition 可能返回一个不正确的值。 将焦点从一个组件移动到另一个组件。使顶层容器可见。对 Window、Frame 或 Dialog 调用 setVisible(true) 可能异步发生。 设置顶层容器的大小或位置。对 Window、Frame 或 Dialog 调用 setSize、setBounds 或 setLocation 将被转发到底层窗口管理系统,并可能被忽略或修改。Wall.class 加载Wall类对象,额说实话,还真没有什么好说的哦。。。数据库加载驱动的时候也是这样,当然也只是为了加载对象而已。

Java 的Toolkit 的用法

Toolkit这是一个工具抽象类,提供一些取资源的方法.比如这个getImage就是取图象资源的.Wall.class.getClassLoader().getResource("images/stone.gif")这句话的意思是把Wall类所在文件夹中的images文件夹下的stone.gif转换成JAVAURL类,这是一种相对地址的获取方式.

java音乐的存储路径下面是我们老师的一段wav播放器的代码,但是我不知道要对应的歌曲应该保存在哪边?

围观

JAVA培训内容有哪些?

JAVA零基础,JavaSE,数据库,WEB前端技术,JavaWEB基础 ,电商竞拍平台,
 首页 上一页  1 2 3 4 5 6 7 8 9 10  下一页  尾页