虽说发自内心的不怎么喜欢C#,但是C#有很多特性真的比Java好,用起来方便多了,而且近几年来,C#的确是抢占了Java越来越多的市场啊,照这种趋势发展下去,再过5年,Java不会真的被淘汰了吧?随便举几个例子:
1. C#里DateTime别提多好用了,Java里的Calendar相比起来就垃圾多了,最后还得去用apache的DateUtils来弥补
2. C#的struct简化了很多操作,Java里还要装箱拆箱
3. C#的ADO.NET,Java里有可以类比的好东西么?
4. C#的as关键字,Java里有对应的好东西么?
5. C#的LINQ,lambda expression,Java里有这么好的东西么?总结起来就是:Java有的好东西C#都有,C#有的很多好东西,Java一个都没有!新手在此迷茫的请教各位Java前辈,10年内到底Java会不会被C#取代而没落??
1. C#里DateTime别提多好用了,Java里的Calendar相比起来就垃圾多了,最后还得去用apache的DateUtils来弥补
2. C#的struct简化了很多操作,Java里还要装箱拆箱
3. C#的ADO.NET,Java里有可以类比的好东西么?
4. C#的as关键字,Java里有对应的好东西么?
5. C#的LINQ,lambda expression,Java里有这么好的东西么?总结起来就是:Java有的好东西C#都有,C#有的很多好东西,Java一个都没有!新手在此迷茫的请教各位Java前辈,10年内到底Java会不会被C#取代而没落??
解决方案 »
- 简单说就是写一个方法,方法中需要传递一个int类型的数组,遍历这个数组,返回这个数组中的素数的个数,另外一点的要求是,例如这个数组是{2,3,4}那么素数不光是2和3 还有2+3=5 3+4=7,也就
- 急!解决后立即结帖
- JAVA能可视化编程吗?
- 关于mock测试的问题
- 10分题,请抢答,立即结贴!!!在线!!
- 从ASC码值转换成字符
- 错误:找不到对象
- 想买一块15'的LCD,不知什么牌子,型号的质量比较好(3000RMB左右)
- SOS..Java中矢量图绘制方法
- 一个朋友的遭遇和我的意见
- 问个基础的String 问题
- java1.7.0_09环境变量设置后能显示java 命令但是找不到javac命令
Java能生存那么久是因为碰到了2次千载难逢的机遇,一次是网络普及,一次是安卓,并不是Java本身怎么好
不容置疑的是EE做B\S是相当了得的,让一大批ME的开发人员转安卓也是可以接受的;当然我不否认Objective-C现在份额越来越大,但关C#鸟事呀!这是跨平台性带来的优势,跨平台就是JAVA的初衷。
再说一下开源,因为开源,所以才有那么多优秀的第三方库,虽然SUN挂了,但是JAVA不会挂。虽然有很多第三方库配置起来很麻烦,难道你是 chi shi的吗?作为一个程序员不会配置还写个鸟程序呀?什么东西都IDE配好了,你以为用PhotoShop p图呀?
跨平台、开源?C#能比吗?我对C#不是很了解,就算能比也不会转~
这种帖子我一般不想回的,楼主们就是一纯托+喷子,我也不想骂人,但是很鄙视楼主这种看起来是挺其实是贬JAVA的行为~轻微C#给你了什么好处?
你先把跨平台和开源这两样弄清楚再说吧。java会不会被淘汰,在你的的职业生涯中,不需要考虑这个问题。
这话实在是为了证明你的观点瞎编硬造
C#确实拥有一些java不具备的特性和优点,这毋庸置疑,在表扬一个新生事物的同时,没必要去贬低以存在的弱点,毋庸置疑C#总结了很多语言的优缺点进行了重新设计,但谁都知道他抄袭了多少
老拿别人的缺点比自己的优点你永远就只有那些优点,
你口口声声来请教,在心里却已经做了判断,既然已经做了决定就按照自己想的去做就是了,又何必在这里寻求心理的安慰,更何况在java版你得不到安慰,这个帖子应该去C#版发,而且你举的那五点,大多数和语言特性有半毛钱关系??衡量一个语言是否优秀,那个datetime的库来判断?可笑
你这是哪年的数据了???python比C#多???现在随便打开一个网站,有几个不是asp.net做的?如果连一个小小的DateTime库都做不好,还谈什么?正所谓一屋不扫,何以扫天下???
一门语言活得好不好 和 使用这门语言的个体程序员活得好不好 之间的相关系数(correlation)为0.999好不好!
好吧,上面那个2011年的,这个是2012年九月的,你自己欣赏吧一个库做没做好是衡量一个语言优良的标准??既然apache 的DateUtils能让你满意,就是说java能做到,
你觉得你这个观点站得住脚?更何况Calendar哥用的挺顺手的,没觉得比什么DateTime差这真的可笑,你都开的什么网站??还就是几张网页??先开拓开拓你的视野,再来bb
其实最近对Java前景不看好的帖子多起来的原因并不是针对Java自身的,而是Oracle的一些做法确实让人很失望。另外,下面的内容可能有人会喷。在下这里只强调一下,本人只是站在中立的立场描述事实而已。关于跨平台和开源。
MS并没有在其它平台上做.Net,但这不表示没人做。Unix/Linux上的Mono存在其实已经不是一年两年的事了,还有人不断的说.Net只能在Windows上运行……就算是反对使用C#的,知己知彼也是要做到的吧。
对于开源,.Net虽然没有公布源代码,但可以通过反编译工具查到类库的IL(相当于Java的字节码)。别人怎么看在下不清楚,至少在下觉得看Java源代码和字节码没什么区别的吧。
2、C#开源码?Windows系统开源吗?
3、还有像J王说的,C#喜欢推到重来,比如:F#,银光其实已经被微软放弃了。
我感觉C#封装的太好太强大反而失去了灵活性,要问我喜欢Java的理由,Eclipse开发环境,语法?还有很多,反正我喜欢Java,当然我对C#也不反感。未来10年的事大家都不好讲,科学技术飞速发展,学习哪一门语言的真正权利掌握在科学家手里,说不定几年后量子计算机出来了,一切都得重头开始。对于程序员来说,计算机语言知识一种工具,要灵活取舍。看了那么多大哥的评论,你觉得再讨论孰高孰轻的问题,有意义吗?
哪有人拿类库来比两个语言优劣的
或者这么说,即使是你说的这几个也无非就是一种坐井观天的青蛙式想法
datatime比calendar好用吗?java对于时间的支持又何止一个calendar?对于date的包装timestamp,sql.date,long等等,或者说只是你自己觉得那玩意儿好用罢了
struct难道不破坏面向对象完整性吗?何况,用一个类来实现struct有什么区别吗?
ado.net和java比数据库技术?你想要笑死大牙米?或者说你只用过jdbc?jdbc不好用?spring的jdbc包装怎么样?还不够?mybatis怎么样?再不够?hibernate够了不?
关键字...我服了...这都能拿来比...C#有instanceof关键字吗?这也能拿来比一下
LINQ,lambda expression是很好,但是又怎么样那?说穿了也就是种变种的脚本,你怎么就知道java没有这种东西了,哪个人能站出来说他知道java所有的扩展库? 题外话,要说扩展到话javaCC用过吗,C#能自己做编译器吗
多喷就该变成愤青了...这话我也听了10年了吧,貌似至今为止java活得还是好好的,当年叫的最凶的几个人连脸都看不到鸟,希望10年后LZ能拍着胸脯说,java已死
还有Java的动态语言等....
怎么总有Java的人宣称C#里没有instanceof?C#的is比java的instanceof简便多了!相反,C#的as,java里有么?
就是WINDOWS上GUI那一小块吗?
这么说吧,C#能在LINUX用吗? 你见过有企业应用用C#吗? 你见过有支撑系统用C#吗? 你见过通信行业用C#吗?
C#开源吗?C#有多少开源类库选择?C#离了WINDOWS还能干嘛?
虽然WORA是Java宣传口号,但并不表示这一特点是Java独占的。Mono解决了.Net不跨平台的问题是不争的事实(虽然MS官方可能并不认为这是个问题)。还有“Java比C#快”?在下真心不这么认为。不管在Windows下是Linux下,对同一规模的算法运算.Net都比Java效率高,不少人说.Net效率优化比Java好并不是空穴来风。不过话说回来,从SUN开始Java的开发者就从没拿Java的效率来说事。也就是说Java的开发者都没把运行效率当作Java的优势来考虑,所以总拿不是Java优点的地方来和别的语言比不碰壁才怪。其实在下也明白上面的各位想表达的真实意思:“JSP服务器比ASP.Net服务器运行效率好”。没错,这是事实。IIS说白了只是款测试用服务器,对于其它的ASP.Net服务器,恕在下孤陋寡闻,只知道Apache,但它比Tomcat等JSP服务器起步要晚得多。总结起来:Java与.Net相比的优势并不是效率高,而是有着丰富的经验。这也是开源带来的好处吧。
这个我没做过测试,不敢说什么,你能拿出有力的证据证明你说的么?谁这么说了,我咋没看到,但我只是觉得,如果那C#写个web,然后为了转到linux下,需要安个mod_mono,寄存在apache底下,这不是找虐么?ms或者Novell哪天搞个iis Linux在比较吧。ps:纠正一点,说apache比JSP服务器起步晚得多,这属于瞎扯。而且两者没有可比性,一个是专业的http服务器,一个是java web的容器,两者在处理静态资源的效率上是没法比的
从隔壁抄来的地址,从这些数据看,貌似C#Mono速度真的不如java,而且这个比空口说白话更有说服力。
测试算法:列选主元高斯消去
测试规模:千元线性方程组(有解)
测试环境:
CPU:主频3.10G(4X)
.Net framework: v4.0
JDK: 1.7
测试结果:
VC:230-250ms
C#:370-390ms
Java:740-750ms(直接用jdk测的结果,通过Eclipse调用为820-840ms,可能是IDE运行也要占点资源吧,PS:Eclipse版本3.8M1)
Mono:由于在下的Linux是跑在虚拟机下的,测得不准。谁装的Linux是跑在实机上的可以帮忙测下。
http://shootout.alioth.debian.org/这是ubuntu系统上各个语言性能的一些测试,包括java1.7和C# Monohttp://shootout.alioth.debian.org/demo/measurements.php?lang=csc
http://shootout.alioth.debian.org/demo/measurements.php?lang=java
这两个是vista下C#和java 1.7的一些测试,我不知道你怎么测试的C# mono比java 1.7快那么多,至少这些测试里,mono性能没法跟java 1.7 比,但在windows平台c#和java 1.7 伯仲之间
人能在火坑里活么?按照你的逻辑,能,至少也得能活一分钟吧,在火坑里人还能哭,还能叫,谁说人在火坑里什么都干不了?那好,来,我们跳火坑吧这是在掩耳盗铃么, 你的测试里结果是java最慢,比C#慢了100% 这些测试里面,他们是差不多的,这是测试结果本质上的不同
没有,我确实没有一个一个看代码,这是事实,但是,对于语言效率的比较只是在相同语法下单纯的时间长短比较?难道不应该,为了解决同一个问题发挥各自语言设计上的优势?这种比较你认为草率?而你的测试就一个算法就跑一次,就因为和人家测试的结果不同就严谨?再来如果你觉得他们写的C#代码为去了C#尽可以拿出你的解法
需求都是一样的,都是一系列任务tasks使用固定的线程池去执行。
看看有什么不一样。说先说说c#下的线程池操作
// 这边要说一下 c# 必须要需要设置 doneEvent,来通知是否完成任务。
// 而且必须在任务执行完毕后finally执行通知
public abstract class AbstractTask
{
/// <summary>
/// taskCallBack
/// </summary>
/// <param name="parameter"></param>
public void taskCallBack(Object parameter)
{
this.TaskResult = doTask();
} /// <summary>
/// done Event handler
/// </summary>
private ManualResetEvent doneEvent;
public ManualResetEvent DoneEvent
{
get { return doneEvent; }
set { doneEvent = value; }
}
}
public class ThreadPoolManager
{
/// <summary>
/// 这边设置线程池的大小
/// </summary>
private int poolSize;
private ThreadPoolManager(int poolSize)
{
this.poolSize = poolSize;
System.Threading.ThreadPool.SetMaxThreads(this.poolSize, this.poolSize);
} /// <summary>
/// 执行 IList<TaskParameter>
/// </summary>
/// <param name="taskParameters">task list</param>
/// <param name="methods">Delegate array</param>
/// <returns></returns>
private const int NUM_WAIT_HANDLES = 64; // the number of wait handles
public List<AbstractTask> startTask(IList<TaskParameter> taskParameters)
{
int taskSize = taskParameters.Count;
List<AbstractTask> tasks = new List<AbstractTask>();
if (taskSize == 0)
{
return tasks;
} Queue<ManualResetEvent> events = new Queue<ManualResetEvent>(taskSize);
foreach (TaskParameter eachPara in taskParameters)
{
AbstractTask task = TaskManger.getTaskInstance(eachPara);
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
events.Enqueue(manualResetEvent);
task.DoneEvent = manualResetEvent;
tasks.Add(task);
} // task.taskCallBack 执行真正的任务
// c# 需要将任务一个一个的加入到tasks池中
foreach (AbstractTask task in tasks)
{
System.Threading.ThreadPool.QueueUserWorkItem(task.taskCallBack, null);
} // 这边还有一个问题就是 等待任务的数量不能超过64,你说郁闷吗?
// 那只能批量64个任务 等待了。
// Wait for completion
// Due to limitations on WaitAll, must be "chunked" in sets of 64 or fewer wait handles
List<WaitHandle> handles = new List<WaitHandle>(NUM_WAIT_HANDLES);
// calculate the number of times that we need to wait
int loops = ((taskParameters.Count - 1) / NUM_WAIT_HANDLES) + 1;
//chuncking the waiting
for (int currentLoop = 0; currentLoop < loops; currentLoop++)
{
for (int handleCount = 0; handleCount < NUM_WAIT_HANDLES; handleCount++)
{
if (events.Count == 0)
{
break;
}
handles.Add(events.Dequeue());
}
WaitAll(handles.ToArray());
handles.Clear();
}
return tasks;
} /// <summary>
/// Wait All done Event
/// </summary>
/// <param name="doneEvents"></param>
private void WaitAll(WaitHandle[] doneEvents)
{ // WaitAll for multiple handles on an STA thread is not supported.
// so wait on each handle individually.
if (Thread.CurrentThread.GetApartmentState() == ApartmentState.STA)
{
// using foreach,wait for each Thread
foreach (WaitHandle myWaitHandle in doneEvents)
{
WaitHandle.WaitAny(new WaitHandle[] { myWaitHandle });
}
}
else
{
WaitHandle.WaitAll(doneEvents);
} }下面在说说可爱的java,很简单,因为都已经封装好了。public final class MutipThread {
public static void main(String[] args) { List<Task> tasks = new ArrayList<Task>(task_num);
for (int index = 0; index < task_num; index++) {
tasks.add(new Task(....));
} ExecutorService threadPoolService = null;
try {
threadPoolService = Executors.newFixedThreadPool(thread_num);
List<Future<Object>> futures = threadPoolService.invokeAll(downloadTasks);
for (Future<Object> future : futures) {
System.out.println(future.get());
}
} finally {
if (threadPoolService != null) {
threadPoolService.shutdown();
} }
} static class Task implements Callable<Object> {
public Object call() throws Exception {
// do something
}
}
}
以上的总结是我做项目的时候分别碰到的,很明显java的对线程池处理部分明显要比.net要简洁很多。
java enum的好处就是定义枚举单位的属性。比如说一下代码
public class EnumTest {
public static void main(String[] args) {
for (EnumWithAttribute enumItem :EnumWithAttribute.values()) {
System.out.println(String.format("Enum name:%s, attribute1:%s, attribute2:%s, attribute3:%s ",
enumItem.name(),
enumItem.getAttribute1(),
enumItem.getAttribute2(),
enumItem.getAttribute3() ));
}
} static enum EnumWithAttribute {
EnumUnit1("detail1", 1, 1L),
EnumUnit2("detail2", 2, 2L),
EnumUnit3("detail3", 3, 3L),
EnumUnit4("detail4", 4, 4L),
EnumUnit5("detail5", 5, 5L),
EnumUnit6("detail6", 6, 6L); private String attribute1; public String getAttribute1() {
return this.attribute1;
} private int attribute2; public int getAttribute2() {
return this.attribute2;
} private long attribute3; public long getAttribute3() {
return this.attribute3;
} EnumWithAttribute(String attribute1, int attribute2, long attribute3) {
this.attribute1 = attribute1;
this.attribute2 = attribute2;
this.attribute3 = attribute3;
}
}
}.net 可以吗?有人说可以 还给了代码。先看代码。public enum EnumWithAttribute
{
[EnumUnit("detail1", 1, 1L)]
EnumUnit1,
[EnumUnit("detail2", 2, 2L)]
EnumUnit2,
[EnumUnit("detail3", 3, 3L)]
EnumUnit3,
[EnumUnit("detail4", 4, 4L)]
EnumUnit4,
[EnumUnit("detail5", 5, 5L)]
EnumUnit5,
[EnumUnit("detail6", 6, 6L)]
EnumUnit6
}
[AttributeUsageAttribute(AttributeTargets.Field, Inherited = true, AllowMultiple = false)]
public class EnumUnitAttribute : Attribute
{
public String attribute1;
public int attribute2;
public long attribute3; public EnumUnitAttribute(String attribute1, int attribute2, long attribute3)
{
this.attribute1 = attribute1;
this.attribute2 = attribute2;
this.attribute3 = attribute3;
}
}但是如果想得到其中一个EnumUnit4的attribute1的结果【detail4】,该怎么写?
恐怕就没那么方便了吧。好像还要强制转化吧!! 简直太繁琐了。所有劝楼主还是先精通一门吧,多积累项目经验。如果还是比来比去,最后一事无成!!
java在服务端,网络,web,搜索等都有很多优秀的框架,技术,近年来吵的很火的hadoop,hbase等都是基于java平台技术的,你还说java会在5年之后淘汰,那人家这些搞开源的“累死累活”的更新版本就是为了淘汰啊,不知道人家是2BT还是你是2BT。
还有些大神,你让我膜拜啊,你搞基java,c#测试啊什么的,你懂测试?你懂jvm?你用的是标准虚拟机吧,你知道jdk跟jrocket是怎么回事?摆脱不要小白好不?大家最好对这样的帖子犹如粪土,视而不见。注册了号这么长时间,就回复了两三次,就看见你们喷了,实在受不鸟了,但也欢迎LZ其他人再来喷我吧。
如果你只能调调API,那么JAVA的生与死对你而言毫无关系