java 规格overview_《Java數據結構和算法》- OverView

Q: 不同數據結構的優缺點?

數據結構

優點

缺點

數組(Array)

快速訪問,如果知道下標,就可以非常快地存取

查找慢, 插入或刪除慢, 大小固定

有序數組(OrderedArray)

比無序的數組查找快

插入或刪除慢,大小固定

棧(Stack)

提供后進先出方式的存取

存取其他項很慢

隊列(Queue)

提供先進先出方式的存取

存取其他項很慢

鏈表(LinkedList)

插入快,刪除快

查找慢

二叉樹(BinaryTree)

查找、插入、刪除都快(如果樹保持平衡)

刪除算法復雜

紅-黑樹(RBTree)

查找、插入、刪除都快。樹總是平衡的

算法復雜

2-3-4樹(2-3-4Tree)

查找、插入、刪除都快。樹總是平衡的。類似的樹對磁盤存儲有用

算法復雜

哈希表(HashTable)

如果關鍵字已知則存取極快。插入快

刪除慢,如果不知道關鍵字則存取很慢,對存儲空間使用不充分

堆(Heap)

插入、刪除快,對最大數據項的存取很快

對其他數據項存取慢

圖(Graph)

對現實世界建模

有些算法慢且復雜

Q: 算法的概述?

A:許多算法直接適用於上面的數據結構,都需要知道如何:

1) 插入一個新的數據項

2) 刪除某一特定的數據項

3) 尋找某一個特定的數據項

4) 如何迭代地訪問各個數據項

5) 排序

Q: 為什么面向對象編程比面向過程編程要好一些?

A:面向過程編程,如C、Pascal或早期版本的Basic在處理大型的復雜問題時有些力不從心,為什么會這樣呢?有兩類問題:一是程序與現實世界缺乏相應關系;二是程序內部的結構出現了問題。

A:對現實世界建模的無能為力

使用過程語言對現實世界問題進行抽象及概念化十分困難:方法執行任務,而數據存儲信息,但是現實世界中的事物是對兩者同時進行操作的。

例如,爐子上的自動調溫器例子,如果用過程語言來寫這個程序,可能會以兩個函數turnOn()和turnOff()即爐開和爐閉來完成,但是還會有兩個全局變量currentTemp和desiredTemp,即現在的溫度和希望的溫度。

然而這些函數和變量並沒有形成任何編程對象,在程序中不會出現任何可以稱之為自動調溫器的單元,這個單元的唯一概念僅存在程序員的腦海中。

對於大型的程序,有可能包括上百個類似調溫器的實體,面向過程語言對這種情況將會使程序變得極為混亂,錯誤頻繁出現,有時甚至不可能實現方案,因此需要一種可以更好地將程序中的事物與現實中的事物相匹配的語言。

A:粗糙的組織結構

解決程序的內部組織是一個更微妙而且事關重大的問題。面向對象被划分為一個一個的函數,這種基於函數組織形式的一個巨大問題是它僅僅考慮了函數,而沒有重視數據。當不得不面對數據時,它沒有過多的選擇。簡而言之,數據可以是一個特定的函數的局部變量,也可以使所有函數都可以存取的全局變量,就是無法規定一個變量只允許某些函數存取而不允許另一些函數存取。

如果一個變量要想被多個函數存取到,就必須為全局變量,但是全局變量會在不經意間被程序的任何一個函數存取,這就導致了頻繁的程序錯誤。

Q: 什么是軟件工程?

A:軟件工程研究是許多程序員參與的大型復雜的計算機程序的創建方法。它強調是程序的整體設計和如何依照最終用戶需求而進行設計的問題。

A:軟件工程關系一個軟件項目的整個生命周期,包括分析、設計、驗證、編碼、測試、生產和維護各個階段。

Q: C++和Java的幾處不同?

A:這里只列出可以幫助C++程序員看懂示例的Java特性

A:沒有指針

Java和C++的最大區別在於Java沒有指針,其實,Java只是擺脫了顯示表露的指針,指針依舊是以存儲地址的形式隱藏在程序的深處,有時甚至可以說在Java中,所有的東西都是指針。

1) 引用(reference)

Java對基本數據類型的處理與對象的處理不同

int nVar; // an int variable called nVar

BankAccount bankAccount; // reference to a BankAccount object

在第一行語句中,一個被稱為nVar的存儲地址保存了一個數值127,然而,bankAccount這個存儲地址並沒有保存BankAccount對象的數據,這個名稱bankAccount是對象的引用,它並不是對象本身。

實際上,如果bankAccount沒有被預先賦值的話,它就不會稱為引用。在賦值為某個對象之前,它保存了一個被稱為null的特殊對象的引用。同樣,nVar在它被賦值之前也不會保存數值。如果嘗試使用一個被賦值的變量,編譯器會報錯。

在C++中

BankAccount bankAccount;

實際上在棧里創建了一個對象,它留出了所有這個對象的數據的空間。而在Java中,這條語句只創建了一個放置某一對象的存儲地址的空間。可以將Java引用認為是普通變量語法中的指針。

2) 賦值

Java中的賦值操作符與C++中的不一樣。

在C++中,這條語句:

bankAccount2 = bankAccount1;

將一個名為bankAccount1的對象的所有數據都拷貝到另一個名為bankAccount2的對象中。然而在Java中,這條語句的賦值語是向bankAccount2拷貝了bankAccount1指向的存儲地址,現在bankAccount1和bankAccount2實際指的是同一個對象,它們都是這個對象的引用。

如果對賦值操作符理解不深的話,上面的語句會讓人感到困惑。

如果想對一個對象中復制數據到另一個對象中,必須保證在一開始就有兩個不同的對象,然后分別拷貝每個字段,等號是不起復制的作用的。

3) new操作符

在Java中任何創建對象的工作必須使用new。但是new在Java中返回一個引用,而不像C++中返回一個指針。下面是創建對象的一個方法:

BankAccount bankAccount = null;

bankAccount = new BankAccount();

取消指針意味着一個更安全的系統。程序員不可能找到bankAccount的真實地址,也就不可能意外地破壞它。

用new向堆申請空間后,如何去釋放那些不再使用的空間?在C++中,可以使用delete。在Java中,則根本不需要對釋放空間擔心。Java每隔一段時間就會查看每一塊由new開辟的內存,看指向它的有效引用是否依舊存在,如果這個引用不存在,系統會自動將這塊空間歸入空閑內存區。這個過程被稱為垃圾回收。

幾乎所有的程序員在使用C++過程中都會有忘記刪除存儲空間的經歷,這會導致“內存泄漏”(memory leak)從而消耗系統資源,使程序處於不穩定的狀態,甚至會導致系統崩潰。內存泄漏在Java中不可能出現(或至少幾乎沒有)。

4) 參數

在C++中,指針經常被用來在函數間傳遞對象,從而避免拷貝一個大對象的系統開銷。在Java中,對象經常以引用的形式傳遞,這種方法同樣地避免了對象的拷貝:

void f1() {

BankAccount bankAccount = new BankAccount(270.00);

f2(bankAccount);

}

void f2(BankAccount ba) {}

上面的代碼中引用bankAccount和ba都指向同一個對象,而在C++中,ba則是從bankAccount拷貝而來的另一個對象。

然而,簡單的基本數據類型總是通過它的值來傳遞。

5) 相等與同一

在Java中,對基本數據類型,可以通過相等操作符(==)來判斷兩個變量是否含有相同的值:

int a = 12;

int b = a;

if (a == b) {

System.out.println("they are equal");

}

這同C/C++語法。

但是在Java中,由於關系操作符使用引用,所以它們在涉及到對象的判斷時有些不同。 當使用相等操作符(==)判斷類時,實際上判斷的是類的引用是否一致,即它們是否指向的是同一個對象:

BankAccount ba1 = new BankAccount(250.00);

BankAccount ba2 = ba1;

if (ba1 == ba2) {

System.out.println("they are identical");

}

在C++中,這個操作符會判斷兩個對象是否含有相同的數據。如果在Java中要判斷兩個對象是否含有相同的數據,則使用Object類的equals()方法:

BankAccount ba1 = new BankAccount(250.00);

BankAccount ba2 = new BankAccount(250.00);

if (ba1 == ba2) {

System.out.println("they are equal");

}

A:重載操作符

Java中沒有重載操作符,在C++中可以重新定義+、*、=及大多數其他操作符,以便使它們在特定的類中達到不同的效果。在Java中,任何類似的重新定義都是不可能的,而可以使用命名的方法,如add()或其他名字。

A:基本數據類型

Java八種基本數據類型

c22e5693a94b815b9cb13577cc12ccce.png

參考

《Java數據結構和算法》Robert Lafore 著,第1章 - 綜述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 集群怎么卸载节点_Greenplum移除节点

基于某某原因,我们的Greenplum需要卸载一个节点(测试环境的Greenplum集群),由于该集群使用了很久,里面有许多开发所需要的数据,所以在卸掉一个节点后,还要保证数据不会丢失。当然,期间也遇到了点问题&#…

python中不论类的名字是什么歌_Python自动猜歌名,还愁排名上不去嘛?

前言相传,就在前几日,在网上闲逛时,刷到了一个猜歌的小程序。这个小程序通过播放歌曲部分片段,然后让用户来猜它的歌名,大概是这样的:作为一个脑热的听歌爱好者,于是他越陷越深,越刷…

trace java_使用java动态字节码技术简单实现arthas的trace功能。

参考资料用过[Arthas]的都知道,Arthas是alibaba开源的一个非常强大的Java诊断工具。不管是线上还是线下,我们都可以用Arthas分析程序的线程状态、查看jvm的实时运行状态、打印方法的出入参和返回类型、收集方法中每个代码块耗时,甚至可以监控…

打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 补课

学了JAVA WEB应用,补充一下HTML的标签,常用的,不然页面都画不出来了~~test 标题,h1h2h3 3个字号test 段落link 链接 使用 Target 属性,你可以定义被链接的文档在何处显示。下面的这行会在新窗口打开文档:Vi…

python 角度传感器模拟_python树莓派红外反射传感器

本文实例为大家分享了python树莓派红外反射传感器的程序,供大家参考,具体内容如下1、工具rpi3,微雪ARPI600,Infrared Reflective Sensor2、基本原理Infrared Reflective Sensor 输出数字和模拟信号模拟信号通过ARPI600上的AD转换芯…

java构造方法赋值内存图_java 面向对象(九):类的结构:构造器(一)简介;属性赋值顺序;JavaBean的概念...

1.构造器(或构造方法):Constructor构造器的作用:* 1.创建对象* 2.初始化对象的信息2.使用说明:* 1.如果没显式的定义类的构造器的话,则系统默认提供一个空参的构造器* 2.定义构造器的格式:权限修饰符 类名(形参列表){}…

java 集合modcount_源码|jdk源码之LinkedList与modCount字段

链表是对上一篇博文所说的顺序表的一种实现。与ArrayList思路截然不同,链表的实现思路是:不同元素实际上是存储在离散的内存空间中的。每一个元素都有一个指针指向下一个元素,这样整个离散的空间就被“串”成了一个有顺序的表。从链表的概念来…

idea 新建ssm java ee_IDEA搭建SSM项目实现增删改查

首先打开IDEA,File—>New—>Project创建项目选择左侧导航栏里的Maven,勾上勾,选择webapp按如下图进行填写创建完成后进入项目,右下角弹出的提示点击右边的Enable Auto-Import,自动配置连接数据库,我用…

php mail centos_centos怎么发送邮件

一、安装sendmail与mail1、安装sendmail:1) centos下可以安装命令:yum -y install sendmail2) 安装完后启动sendmail命令:service sendmail start2、安装mail安装命令:yum install -y mailx二、发送邮件1、通过文件内容发送发送命…

php文件的作用,php入口文件的作用-PHP问题

php入口文件的作用php入口文件能够完成主动加载性能。解析PHP入口文件的主动加载性能php的主动加载:正在php5之前,咱们要用某个类或类的办法,那必需include或许require,之后能力应用,每一次用一个类,都需求…

java中随机数边界问题,java 简单Dice问题(随机数的运用)

[java]代码库/*** Dice Write a program that simulates rolling two dice using the following* steps: 1. Prompt the user for the number of sides for two dice. 2. “Roll” the* dice three times by generating a random number between 1 (inclusive) and the* number…

java单词测试,java单词 - 在线打字测试(dazi.kukuw.com)

java单词贡献者:15533470608类别:英文 时间:2018-08-04 22:32:16 收藏数:20 评分:0返回上页举报此文章请选择举报理由:广告/谣言/欺诈政治敏感色情/违法信息垃圾文章其他收藏到我的文章改错字public static…

java vector list,Java基础之:List——ArrayList Vector

Java基础之:List——ArrayList & VectorArrayList简单介绍ArrayList实现了List接口,底层是一个数组,并实现了可变的功能。底层属性(transient Object[] elementData;)在序列化时,忽略该属性。ArrayList实现了List接口&#xf…

钉钉 php 推送,微信模板推送,钉钉信息推送

上午的时候看到有朋友需要微信推送,正好我也需要,之前一直用 Server 酱的,但是最近用不了,想找一个替代品,一开始准备选择钉钉,除了打卡,我很少使用钉钉,邮件提醒是备用方案&#xf…

涡轮机叶片matlab强度分析论文,一种基于MATLAB及Pro_E的涡轮建模方法

自动化与控制与二一种基于MATLAB及Pro/E的涡轮建模方法王智明(中海油服油田技术事业部北京1011&am…

php按文章评论数排序,zblog获取分类文章排序按指定的时间排序、评论数量排序、浏览数量排序...

Zblog PHP在1.8版本的时候想要调用多个分类的文章,并且按照自己的需求去排序是很简单的事情,很多博友也利用这个方法进行最新文章排行、热门评论文章排行等等操作,现在随着ZblogPHP版本的升级,已经封装了数据库语句,导…

蚁群算法matlab vrp问题车辆限重,蚁群算法MATLAB解VRP问题

Excel exp12_3_2.xls内容:ANT_VRP函数:function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)%% R_best 各代最佳路线%% L_best 各代最佳路线的长度%% L_ave 各代平均距离%% Shortest_Rout…

java线程6种状态转换,Java线程的生命周期和各种状态转换详解

在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时&#…

matlab里dcgain,制系统的时域分析

一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下某种典型的输入函数作用下对象的响应,控制系统常用的输入函数为单位阶跃函数和脉冲激励函数(即冲激函数)。在MATLAB的控制系统工具箱中提供了求取这两种输入下系统响应的函数。一、时域分…

在oracle数据库中显示异常,Oracle数据库出现ORA-01034错误的解决方案

类型:数据库类大小:42.1M语言:中文 评分:5.0标签:立即下载使用Oracle数据库的朋友经常会碰到的错误ORA-3113 "end of fileon communication channel" 就是这样的一个,我们可以简单的把这个错误理…