c与java对照总结

2024-05-03

c与java对照总结(通用4篇)

篇1:c与java对照总结

C语言与Java的区别

一、概览

1、从编程思想来看

C语言 为面向过程语言 Java

为面向对象语言

2、从对地址的可操作性上来看

C语言可以直接对硬件操作 Java 不能直接对硬件操作

小结:在硬件安全性上考虑,Java更安全,不容易引发硬件崩溃

3、从效率上来看

C语言效率非常高,在所有编程语言中名列前茅

Java 执行效率一般,计算效率还不错,总体上来讲效率马马虎虎

4、从可移植性上来看

C语言硬件依赖极高,一旦硬件环境改变,程序运行不能的可能性很高

java 硬件依赖几乎为零,只要机器装有相匹配的虚拟机,任何机器上编写的代码都可以通用

二、语言区别

1、语言背景:

C语言是在单机时代应用非常广泛,它融合了高级语言的简单易用和汇编语言的执行效率。

Java是在研究电子消费产品开发平台和互联网应用的基础上实现的,它的许多语言特性也是从c语言那里沿用和发展,并且使面向对象更加自然和完善(如安全性和代码的移动性)。

2、语言跨平台:

C语言不可以跨平台。

因为Java可以跨平台,在windows 和 unix 等系统上都可以很好的运行。

3、指针管理:

指针是c语言最大的优点,它可以使用户几乎可以访问计算机的所有内存资源和其他部分资源(就是指那里打那里)。同时也是c语言程序最难掌握和调试的问题,并且给系统的安全性和稳定性带来很大的困难。

java中没有指针的概念,尽管也有数组和对象的引用的概念,但它的管理全部交给系统管理,这样限制了用户的资源的访问,但是也给java系统带来安全性和稳定性。JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说JAVA没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全

4、封装

c语言中没有package概念,需要其他方式来实现。

在java中引入了package的概念,使面向对象和面向组件开发更加方便,Java都能够实现面向对象思想(封装,继乘,多态)。JAVA则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了c语言的固有缺陷。

5、数据类型及类

c语言允许将函数和变量定义为全局的。

Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。

6、自动内存管理

C语言没有内存管理,必须手动(添加语句)释放内存,增加了程序设计者的负担。Java程序中所有的对象都是用new操作符建立在内存堆栈上,Java自动进行无需内存回收操作,不需要程序员进行删除。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。JAVA里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。

7、字符串:

C语言不支持字符串变量,在c语言程序中使用Null终止符代表字符串的结束。

Java中字符串是用类对象(strinR和stringBuffer)来实现的,这些类对象是Java语言的核心!

另:

Java没有函数,作为一个比c语言更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。

篇2:c与java对照总结

C语言和Java语言的混合其实是一样的,都是分客户端和服务端;

1、C语言的客户端和Java的服务器端

Java服务端代码:

import android.net.LocalServerSocket;

import android.net.LocalSocket;

import android.net.LocalSocketAddress;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

LocalServerSocket mlss = new LocalServerSocket(“/dev/socket/mysocket”);

while(true)

{

LocalSocket mServerSocket = mlss.accept();

if(mServerSocket!= null)

{

InputStream is = mServerSocket.getInputStream();

outputStream out = mServerSokcet.getOutputStream();

is.read(buff);

out.write(buff);

out.flush();

}

}

mlss.close();

C语言客户端代码结构如下:

int mSocketFd = socket(PF_UNIX, SOCK_STREAM, 0);

CHCEK(mSocketFd);

struct sockaddr_un mRemoteSocket;

mRemoteSocket.sun_family = AF_UNIX;//指定协议

strcpy(mRemoteSocket.sun_path, SOCK_PATH);//指定文件

int len = offsetof((struct sockaddr_un*), sun_path)+

strlen(mRemoteSocket.sun_path);

int io_fd= connect(mSocketFd,(struct sockaddr *)mRemoteSocket, len);CHECK(io_fd);

send(io_fd, buff, sizeof(buff), 0);

recev(io_fd, buff, len, 0);

close(io_fd);

2、C语言版服务器和Java语言客户端

int mSocketFd = socket(PF_UNIX, SOCK_STREAM, 0);

CHCEK(mSocketFd);

struct sockaddr_un mServerAddr;

mServerAddr.sun_family = AF_UNIX;//指定协议

strcpy(mServerAddr.sun_path, SOCK_PATH);//指定文件

int len = offsetof((struct sockaddr_un*), sun_path)+

strlen(mServerAddr.sun_path);

int res = bind(mSocketFd ,(struct sockaddr *)&mServerAddr, len);

listen(mSocketFd,16);

int mIOfd;

struct sockaddr_un mClientAddr;

intmClientAddrSockLen = sizeof(mClientAddr);

if((mIOfd = accept(fd,(struct sockaddr *)&mClientAddr , &mClientAddrSockLen))< 0){//在这个地方等待客户端的sendlog(“Failed to accept socket.return:%derr:%sn”, s, strerror(errno));free(qlog_nodes);

exit(ERR_UNSPEC);

}/////mIOfd是一个fd,可以直接用来读写的//从socket中得到消息ret = TEMP_FAILURE_RETRY(recv(mIOfd, &message,sizeof(message), 0));//读取消息,关于TEMP_FAILURE_RETRY,有专门的介绍

if(ret < 0){

close(s);

SLOGE(“Failed to recv message from socket.return: %d err: %sn”, ret, strerror(errno));

return;

}

//向socket中写入数据ret = TEMP_FAILURE_RETRY(send(mIOfd, buffer, sizeof(buffer), 0));//写入消息

if(ret < 0){

log(“Failed to send message from socket.return: %d err: %sn”, ret, strerror(errno));

return;

}

log(“Send %d bytes out”, ret);

//最后要关闭socket

close(mIOfd);

unlink(“bind的文件”);

Java客户端代码结构

//打开一个Socket

mSocket = new LocalSocket();//与服务器建立连接

mSocket.connect(new LocalSocketAddress(DEBUG_CONTROL_SOCKET_PATH, LocalSocketAddress.Namespace.FILESYSTEM));

//读

try {

OutputStream m_Send = mSocket.getOutputStream();//得到当前byte[] buf = new byte[2];buf[0] = FATAL_ERR_FEATURE;

buf[1] = 1;// useless

mSocket.setSendBufferSize(buf.length);

m_Send.write(buf);//写入

m_Send.flush();} catch(Exception e){

Log.e(LOG_TAG, “write socket error”);

ret = false;

}

//写

try {

InputStream in = mSocket.getInputStream();

in.read(mReadBuffer);

} catch(Exception e){

Log.e(LOG_TAG, “read socket exception!”);return false;

篇3:c与java对照总结

面对大学国内多年大学扩招, 进入大学计算机系的学生成绩逐渐走向一般。尤其是高职院校的计算机系学生, 在面对传统计算机C语言的学习时, 很难理解其中的一些章节, 比如指针 (Pointer) 和递归 (resursion) 算法, 数据结构 (Data Stucture) 。为此很多高校为了迎合学生的水平, 积极的降低课程难度, 甚至提出使用Java语言来代替C语言作为计算机的基础教程, 这样可以节省更多的时间讲解实用性的计算机知识。其实我大学刚毕业不久也有这个想法, 觉得C语言用途没有Java语言来的广, 而且难度不低, 还认为一门工具语言, 越简单越好, 做出的软件的健壮性可靠性越高。其实我的想法也没错, 可不适合在计算机基础阶段将Java语言替换成C语言。

那为什么不选一个简单的Java语言作为入门的基础课程呢, 我们必须权衡利弊, 当然我们不是非要像孔乙己那样说出回字有几种写法才算有难度, 或者对初学者有虐待的心态。下面我列出C语言的一些优势所在。

一) C语言够难

二) C语言更能区分学生的能力

三) C语言会让学生变得勤快

四) C语言更能培养合格的程序员

下面让我们正对上述的几点进行简单轻松的讨论

C语言才够难度, Java在做为基础语言中的难度是远远不够的。大学中我对计算机的兴趣非常偶然, 其实就是一个晚上占据了一个灯光良好的座位, 打算认真做作业的时候, 一位教dbase的老师带着学生进驻教师, 打算清场, 当时急中生智, 就说我也选修那位老师的课程, 在一个小时的听课中发现dbase似乎没那么难, 后来参加考试高分通过, 很容易的通过了。在休息期间请教老师, 被告知如果学好软件开发, 两门课程必须搞定, 一个就是C语言, 一个就是数据结构, 如果过不了这两关, 建议我还是老实的完成我的本专业。后来我花了两个学习才将这两门课程弄出一点头绪。现在想着当年在386机器上调试C语言程序的时候, 突然很佩服自己的毅力。

我见过高中很多英语稍微好点的同学, 可以在中华学习机上用basic编写出很优秀的代码, 那时候让我佩服的不得了。大学毕业后我从化工转到计算机软件开发方面来, 发现很多原本我认为是软件高手的同学在软件编程上没多大建树, 也许是他们没兴趣, 闲聊的时候问起来, 他们大多数被计算机两个入门的基础课程给吓楞了, 一个是C语言, 一个是数据结构。面对大量的指针, 其实都会晕头转向, 不过也许只有这样的难度, 淘汰那些知难而退的人才会留下只对软件开发有兴趣的学员, 或是激起那些学习者的知难而上的斗志。在上个世纪80年代, 会dbase的人是个高级程序员, 到了90年代, 会foxbase或者foxpro的算是个中级程序员, 到了二十一世纪, foxpro的学习者还是很多, 大部分都转行了, 除了少数毅力鉴定这改用其他语言, 要是不转行或者不改用其他高难度的开发语言和工具, 估计从事foxpro开发的人都饿趴了现在。但是那些从事C语言, 非常轻易的转移到了Java, 或者C++开发, 目前苹果系统IOS上的应用开发其实也是使用C语言的变种Object C。但是对于那些掌握VB和foxpro或者是Delphi的人来说, 转行的难度太高了, 因为他们早就接受了更简单的入门教程, 难以适应难度稍大的业务。许我们可以这么说, 别让基础语言太难, 这样娇惯了学生, 以后让他们转型实在难。人人都这样, 由难转易行, 由易转难止。

别轻易放弃C语言中的指针章节和递归及其数值算法这块内容, 即使有些概念毫无用处, 但是能让你变得头脑灵活, 思维敏捷, 高度的抽象能力和推理能力, 这样才能培养出合格的程序员, 岗位上才能有竞争力, 如果连这个都过不了, 建议这些学生改行去学习哲学, 只有马列主义基本无需很多的推理和思考, 没有了挑战只要在考试之前背一下基本都能过的。Java语言中为了简化和避免用户出错, 省去了指针这类让人头疼的东西, 造成了Java语言过于简单, 这样即使是Java语言考试得了100分, 也许这人根本不知道内存是如何分配的, 递归是如何实现的, 线性链表如何操作, 文件读写是如何进行的。他们还根本不会因为学习了一门语言会加深对计算机体系结构的认识。有人挖空心思的想让Java来代替C语言或者精简C语言来做为基础教程, 这样一来学生只会做最简单的计算机练习题, 花很少的心思就完成课后作业, 如此体贴学生犹如帮学生都把代码模块或者框架做好了让他们来完形填空了。但让老师和学生皆大欢喜, 老师教学效果不错, 学生考试通过, 可是这样学生可否面对困难和挑战呢?

C语言才有区分能力。大学的我最怕的课程就是我自学的C语言和数据结构, 还有数学。因为这三门课程我要认真学习才能在分数榜上列在前头。而其他的课程只要花一点点时间就可以了, 花更多的时间我也很难拿到满分。其他一些课程因为简单, 所以无法区分开来, 这样好坏, 优劣在学生中就无法区分开来。Java中没有了指针, 弱化了递归算法的基本原理, 用集合类来代替传统的数据结构, 让你在学习过程中无法达到思维的深度, 缺少逻辑推理, 归纳演绎, 抽象思考的锻炼, 你没有了课程中被补考重修的心理压力。而且通过多花点时间学习你就可以考试得个优秀, 面对扎堆的优秀学生, 如何区分能力远远成了Java语言C语言的一个难处, 可是C语言, 只要有指针和递归算法里面, 试卷上的分数会因为能力而拉开很大的距离。

学习C语言的学生会很勤快的。因为C语言的类库远远不及Java的类库那么多。要做一个自定义的打印等等都要写下一堆复杂的代码。没有了Java的集合类Collection和集合工具类Collections的便利性, 为了完成一个简单的数据存储你必须自己设计一个数据结构, 实现存储和读取排序之类的操作。在操作过程中学生小心谨慎的使用指针, 认真初始化每个变量。没有了插件的帮忙, 要和其他系统接口你必须自己写下大量的代码, 调试大量的程序, 最后你会发现学生变得勤快, 认真和谨慎。在Java学习中, 太多现成的特性让你非常省力。面向对象OOP代替指针和递归调用, 用封装和继承简化开发流程, 多态和重载让你使用的称心。没有了C语言的难度, Java语言学习没有机会面对心智的挑战, 更会偷懒和松懈。

有些公司招聘的时候很有意思, 总是做题目的时候让人家实现一些算法, 推荐使用Java语言。其实我面对很多新员工面试, 都是推荐让用C语言, 当然可以使用Java语言, 我会对使用VBSript和VB语言者产生一种不良的感觉, 总觉得他们不适合做程序员。如果有面试者在C语言实现过程中做的和Java一样好, 我会举的他同等Java实现者更有潜力, 因为C语言是一门有难度的语言。你见过哪个C语言好的人Java做的不好的, 但是你见过很多Java高手不会C语言的中等难度的练习。公司有时候业务需要, 从Java转移到微软.Net下的C#语言, C语言基础扎实的能在一周内参加实质性的任务了, 而那些会VB, Vbscrit和通Java但是C基础差的人, 半个月后都很难上手。一个C语言扎实的程序员一定是个合格的程序员, 当然反过来说未必成立。基础课程毕竟不是专业课程, 那那些实际的工作技能留给了后续的专业课程来完成或者是培训机构, 企业, 政府。

我在高校还从事一些基础语言教程, 发现很多教学中都强调要让课程变得简单, 其实上Java课程的时候似乎没什么东西好讲的, 不用复杂的算法, 不用遇上讨厌的指针。总不会让我花一节课时来讲解简单变量和封装类的差别了吧, 这种基础教学让底子稍微好点的学生三分之一的时间就掌握了, 那剩下的时间只好打瞌睡了。当然不是说Java不好, 其实在编程应用中Java的地位都是老大地位。我2004年做的domino OA软件使用的是Java来扩展其中的功能, 后来手机应用开发使用J2ME也是Java, 现在的平板开发Android也是Java。虽然是Java的创始者Sun被Oracle并购后, 但也不改这个趋势, 可在高校中作为基础语言, 缺少分区度, 难度, 会让学生偷懒, 难以培养优秀的程序员Java总是不合时宜, 还是让我们回到传统的C语言去。

如今的学生变懒了, 是因为我们宠着, 恶性循环下去他们什么苦都不会吃, 所以第一门的计算机语言课程不能让Java替代了C语言, 让他们过了这座山, 剩下的路就平坦了, 欲成大器, 先苦其心志。

摘要:从C语言四个固有的基础语言优势, 分析Java作为基础语言教学的不足, 结合自身的十多年IT从业经验, 以轻松漫谈的方式, 展开对C语言和Java语言作为基础教学语言中的优劣分析。

关键词:Java语言,C语言,课程难度,基础课程,适合教学

参考文献

[1]《Java编程思想》[Thinking in Java]作者:Bruce Eckel ISBN:9780131872486

篇4:c与java对照总结

垃圾回收是一种动态存储管理技术, 它自动地释放不再被程序引用的对象, 按照特定的垃圾回收算法来实现资源自动回收。

在不同语言中垃圾回收的方式也不相同, 本文将以Java语言和C语言为例进行说明。使读者能够了解垃圾回收的重要性。

1 Java语言中的垃圾回收机制

时下最流行的编程语言Java拥有自己的垃圾回收机制。实际上, Java语言来自于C++语言。但Java语言避免了C++语言中复杂的结构, 成功克服了多重继承机制存在的二义性问题;Java的垃圾回收机制显著地提高了程序的效率, 降低了复杂度。由于有垃圾回收机制, 使Java中的对象不再有“作用域”的概念, 而只有对象的引用才有“作用域”。垃圾回收器是一种动态存储分配器, 它自动释放程序不再需要的已分配堆块, 并且能够压缩进程堆块所需要的内存空间。垃圾收集是指自动回收不被程序占用的分配堆块的过程。在一个支持垃圾收集的系统中, 应用显式分配堆块, 但是从不显式释放堆块。垃圾回收器一般是作为一个低级别的独立线程运行, 不可预知的情况下对内存堆中已经废除的或者长时间没有使用的对象进行清除和回收, 而程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。

Java编程人员不用担心内存管理, 垃圾收集器会自动进行管理。但是垃圾回收机制通常只在满足两个条件时才运行:即有对象要求回收并且系统需要回收。那么, Java的垃圾回收机制是如何操作的呢?下面我们来了解一下Java垃圾回收机制的算法。

1.1 引用计数法

引用计数法, 是最原始也是被很多语言所广泛应用的垃圾回收算法。其主旨是给堆中每一个对象都设置一个引用计数, 当其被赋值给对象的引用时, 其引用计数加1, 当其对象的引用超出生命周期或者被新值赋值时, 引用减1, 当其引用计数为0时, 即可被系统回收。

1.2 跟踪算法

引用计数法一种重要的问题在于当对象间出现循环引用的时候, 其计数永远不会为0, 既永远不会被回收。跟踪算法解决了这一问题, 跟踪算法是采用从根集开始扫描来识别对象是否可达。标记可达的对象, 将不可达的对象也就是未标记的对象清除, 又称标记和清除算法。

1.3 压缩算法

跟踪算法的一个问题就是清除对象后的内存空间变成了堆碎片, 不便于再次利用。为了解决这个问题, 引入了压缩算法。所谓压缩算法就是在清除的过程中, 将所有对象移动到堆的一端, 而本来的那端就变成了一段空闲内存区, 收集器要对移动对象的所有引用进行更新。

1.4 复制算法

压缩算法的问题在于每次对对象引用更新的时候都产生了冗余的句柄和句柄表。为此, 又引入了复制算法, 复制算法的主旨是在一开始就把堆分成一个对象面和多个空闲面, 将对象面的内存空间分配给程序, 当空间满了的时候, 利用追踪算法的机理扫描活动对象, 但并不清除, 而是将每个活动对象复制到空闲面, 这样空闲面和对象面就互换了。

1.5 分代算法

复制算法又称停止和复制算法, 在其对象面和空闲面切换的过程中程序要暂停执行, 这样大大降低了程序执行的效率。分代算法正好可以解决这个问题。分代算法基于程序中大多数对象生命周期较短, 少数较长的特点, 将堆分成多个, 每个子堆作为对象的一代。垃圾收集器从最新创建的对象中, 将活跃的对象移到最高代的子堆中, 这样老一代的子堆不会被经常回收, 利用这种分代式的方法, 节约了时间。

1.6 自适应算法

自适应法, 就是指根据特殊情况, 采取特殊算法, 通过监控当前堆的使用情况选择适当的算法进行垃圾回收。

垃圾回收要占用时间, 因此, Java运行时, 系统只在需要的时候才使用它, 而编程者本身无法知道回收发生的准确时间。但如果需要垃圾回收, 编程者也可以随时调用下面的方法之一:

System.gc () ;

Runtime.get Runtime () .gc () ;

2 C语言中的垃圾回收

C语言凭借其简洁紧凑、数据类型丰富、程序执行效率高等特点, 拥有着大量的编程爱好者, 而众多IT界牛人也说, 精通C语言, 就等于精通编程。然而C语言实际上是没有垃圾回收机制的, 那么被如此广泛应用的编程语言如何来处理其垃圾回收问题呢?

答案就是使用保守垃圾收集器并调用free () 函数。像Java语言中, 垃圾收集器对于指针的创建和使用有着严格的控制, 所以其能回收所有的垃圾内存, 而诸如C这样的语言, 垃圾收集器不能被严格控制, 则称之为保守垃圾收集器。

那么在C语言中的垃圾收集器是如何工作的呢?

C语言支持垃圾回收系统, 如前文所说, 在支持垃圾收集的系统中, 应用显示分配堆块, 但不显式地释放。而在C语言程序中, 应用程序调用malloc () 函数但是从不调用free () 函数, 取而代之的是使用垃圾收集器周期性识别垃圾堆块, 并需要编程人员调用free () 函数, 将这些垃圾堆块放回到空闲链表中。因此, 只依靠垃圾收集器是无法做到垃圾内存的全部释放。

下面我们用有向图的概念理解存储器, 当存在一条从任意根节点出发并到达Q点的有向路径时, 我们说节点Q是可达的。Java语言中的垃圾回收器, 能够准确的标记每个节点是否可达, 并将不可达的节点回收, 放入空链表中。而C语言的垃圾回收器, 就是我们所说的保守垃圾回收器, 能够正确地标记可达的节点, 但一些不可达的节点却有可能被错误地标记为可达。从而, 被错误标记的节点, 将永远不会被回收。可想而知, 当系统中的内存被错误标记所占满时, 系统将无法再运行。

下面我们来看, 垃圾收集器如何为C程序将一个保守的收集器加入到已存在的malloc () 函数中, 如图1所示。

垃圾收集器作为一个应用并行的独立线程, 不断地更新有向图和回收垃圾。无论应用程序何时需要内存空间, 系统都会调用malloc () 函数, 如果malloc () 函数找不到可用的内存分配快, 那么它就调用垃圾收集器, 垃圾收集器识别出垃圾块, 并通过调用free () 函数将它们返回给堆块。这里的关键在于, 垃圾收集器代替了应用程序去调用free () 函数, 当对垃圾收集的调用返回时, malloc () 函数想要发现一个可用的空闲块。如果还是不成功, 它就向操作系统请求额外的存储器。最后, 如果成功, malloc () 函数返回一个指向请求块的指针, 如果不成功就返回一个空指针。

3 小结

综上所述, 不同语言对于垃圾回收的方式不同, 但是不管是什么语言, 垃圾回收都有着重要的作用。所以, 在编程学习中, 尤其是编程入门阶段应该养成调用内存释放函数的好习惯, 在每次占用内存结束后, 应主动释放内存, 这样即节省内存空间, 又提高系统效率。

摘要:垃圾回收是一种动态存储管理技术, 本文对比其在Java语言和C语言中的不同实现方式, 了解其重要性。

上一篇:中环项目满意度提升方案下一篇:东财金融学硕怎么样