2019 JAVA自学笔记 04
数组
所谓数组,是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。
下面,我们就来看看在实现同一种作用时五种语言的数组是如何使用的叭~
C语言
创建
静态创建方法如下
int array1[3] = {1, 2, 3};
int array2[] = {1, 2, 3};//在这里,我们arr[3]里边的数字可以不用写;
int array3[3] = {1, 2};//也是可以的,只是把最后一个数初始化为0了而已
int array4[3] = {1, 2, 3, 4};//是不可以的,不能超过数组长度
char array5[3] = {'a', 98, 'c'};//因为是字符类型,所以98其实就是字符'b'
char array6[] = "abcdef";
动态创建
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
void createOneDimensionalVector(){
int n, i;
int *arr;
scanf("%d",&n);
arr = (int*)malloc(sizeof(int)*n);
for (i = 0; i < n; i++)
arr[i] = i;
for (i = 0; i < n; i++)
printf("%d\t",arr[i]);
}
int main(){
createOneDimensionalVector();
return 0;
}
数组的复制
方法一
暴力,用循环一个一个复制,实实在在看得到每一个被复制过去
方法二
通过一些函数
/*
* 通过自定义的函数memcpy实现复制功能,优点是不需要引用库函数
* 在windows平台下,通过sizeof测试发现:
int 4字节
float 4字节
double 8字节
*/
#include <stdio.h>
void *memcpy(void * des,void const *src,size_t len);
void print(int *data,size_t n);
int main(void)
{
float des[10]={0};
float src[10]={0,1,2,3,4,5,6,7,8,9}; //float int double都能够通过memcpy函数实现复制功能
printf("%d",sizeof(src));
print(des,10);
memcpy(des,src,sizeof(src));
print(des,10);
return 1;
}
void print(float *data, size_t n)
{
int i=0;
printf("\n");
for(;i<n;i++)
printf("%7.2f ",data[i]);
printf("\n");
}
void *memcpy(void *des,const void *src,size_t len)
{
char * result =des;
const char * from = src;
assert(des&&src);
while(len--)
{
*(result++) = *(from++);
}
return des;
}
C++
创建数组
在C++语言中,仍然支持malloc();
和free();
来分配和释放内存,同时增加了new
和delete
来管理内存。
int array[100]; //定义了数组array,并未对数组进行初始化
int array[100] = {1,2}; //定义并初始化了数组array
int* array = new int[100]; //分配了长度为100的数组array
delete []array;
int* array = new int[100](1,2); //为长度为100的数组array初始化前两元素
delete []array;
数组的复制
方法一
逐个复制
for (int i=0 ; i<10 ; i++)
{
b[i] = a[i];
}
方法二
使用
memcpy
int a[10]={34,56,4,10,77,51,93,30,5,52};
int b[10];
memcpy(b,a,sizeof(b));
JAVA
创建数组
public static void main(String[] args) {
//创建数组的第一种方法
int[] arr=new int[6];
int intValue=arr[5];
//System.out.println(intValue);
//创建数组的第二种方法
int[] x={1,2,3,4};
//System.out.println(x[1]);
//创建数组的第三种方法。
int[] y= new int[]{1,2,3,4,5};
int m=0;
boolean length = isLength(m,y);
if(length){
System.out.println(y[m]);
}else{
System.err.println("数组标越界");
}
}
//判断数组下标是否越界
public static boolean isLength(int m,int arr[]){
boolean flag=false;
int length = arr.length;
if(m<length)
flag=true;
return flag;
}
数组的复制
方法一
使用循环语句逐个复制数组的元素
for(int j = 0;j<targetArray.length;j++){
targetArray[j] = sourceArray[j];
}
方法二
使用System类中的静态方法
arrayCopy
//使用System中的静态方法arraycopy复制数组
System.arraycopy(sourceArray, 0,targetArray, 0, sourceArray.length);
方法三
使用
clone
方法复制数组
targetArray= (int[])sourceArray.clone(); //使用clone方法将int[]数组从sourceArray复制到targetArray
//注意:由于clone方法返回值的类型是对象Object ,所以要使用(int[])强制转换为int[] 。
Python
创建数组
直接定义和间接定义
matrix=[0,1,2,3] #直接定义
matrix=[0 for i in range(4)] #间接定义
numpy定义法
#numpy定义法
import numpy as np
a = np.array([1,2,3,4,5])
print a
b = np.zeros((2,3))
print b
c = np.arange(10)
print c
d = np.arange(2,10,dtype=np.float)
print d
e = np.linspace(1.0,4.0,6)
print e
f = np.indices((3,3))
print f
列表转数组
#列表转数组
a = []
a.append((1,2,4))
a.append((2,3,4))
a = np.array(a)
a.flatten()
元组转数组
#元组转数组
import numpy as np
mylist = [1,2,3]
print tuple(mylist)
iarray = np.array(tuple(mylist))
print iarray
数组的复制
a = [1,2,3,4,5]
b = a[:]
Java Script
创建数组
隐式创建
var arr=["Audi","BMW","Volvo"];//隐式创建
直接实例化
var arr=new Array("Audi","BMW","Volvo");//直接实例化
数组的复制
使用
concat()
用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
var arr1 = [1, 2, 3]
var arr2 = arr1.concat()
arr1[0] = 5
console.log(arr2) // [1, 2, 3]
或者利用 ES6 中的
扩展运算符
来复制数组
var arr1 = [1, 2];
// 写法一
var arr2 = [...arr1];
// 写法二
var [...arr2] = arr1;
JAVA与其他的对比
1.Java程序中的每个变量要么是基本数据类型(boolean, char, byte, short, int, long, float, double)
,要么是对对象的引用
2.C++有许多种基本类型,额外还有struct, union, enum
, 数组和指针,C++指针可以指向对象,也可以不指向对象
3.Java没有枚举、联合类型,因为Java认为没有必要。将可有可无的语言元素去掉是Java对C/C++做出的一大改变,因此,普遍认为Java较C++更轻便,更精简
4.Java采用Unicode
字符集,C++通常用ASCII
字符集。但ASCII
是Unicode
的子集,对于习惯于ASCII
的程序员感觉不到区别
5.Java中的boolean
类型不能转换成其他类型,反之亦然。C++最近引进了bool
类型,代表布尔类型,整型也作为逻辑判断
6.模板是一种“泛型编程思想”,它有别于“面向对象编程思想”。C++在很大程度上已经支持了这种新型编程方法,特别是STL
的出现 ;Java目前仍未支持泛型编程,不过据说Sun公司有在Java中引入模板的计划
7.C++支持“运算符的重载”,这是它的一个很重要的多态特征,是数据抽象和泛型编程的利器。它允许直接对对象进行四则运算,正像基本数据类型那样 Java不支持这种多态机制,也是为降低复杂性两种语言都支持方法重载(overloading) 在C++中,为了允许运行时动态决定哪个函数被调用,一个函数必须用virtual修饰。virtual关键字被自动继承,用以支持多态
凡是没有用virtual修饰的成员函数(包括static)都是静态绑定的,即在编译时决定调用哪个版本而在Java中,除了static、final、private
是静态绑定以外,所有方法一律按动态绑定处理 C++中有“拷贝构造函数”的概念,在三种情况下,自动调用它用一个对象初始化另一对象对象作实参进行函数调用对象作函数的返回值通常,当一个对象需要做“深拷贝”(钱能:《C++程序设计教程》)时,我们需要为它事先定义“拷贝构造函数”、“赋值运算符的重载函数”和“析构函数”;否则编译器将以“按位copy”的形式自动生成相应的缺省函数。倘若类中含有指针成员或引用成员,那么这三个默认的函数就隐含了错误 Java则没有这种语法结构和语义逻辑 C++支持inline
函数,可以避免函数的堆栈调用,提高运行效率 Java无这种语义 C++中,构造函数的初始化列表是这样使用的:首先按继承顺序调用基类的构造函数构造基类对象,然后按声明顺序调用成员对象的构造函数构造成员对象,最后对列表中出现的成员变量做初始化 Java不采用初始化列表这种构造机制它们的构造顺序基本一致:静态变量初始化静态初始化块(Java)调用基类的构造函数构造基类对象实例变量的初始化构造函数的其余部分 Java使用abstract
关键字修饰抽象方法或抽象类 C++的对等语法是“纯虚函数”和“抽象类” 两者都使用抽象类作为继承层次中的基类,提供一般概念,由子类实现其抽象方法,且抽象类都不能被直接实例化为对象 Java中有final关键字,修饰类、方法或变量
,final类不能被继承 final方法不能被子类覆盖 final变量就是常量 C++中没有这个关键字,常量可以使用const
或#define
定义 const
还可以修饰成员函数,即“常成员函数”,当一个const成员函数修改成员数据,或调用非const成员函数时,编译器会报错我们应将不修改成员数据的函数声明为const
;Java和C++中的static关键字语法和语义基本相同 static成员变量又叫类变量,被类的所有对象共享 A::x (C++):必须在类体外初始化 A.x (Java):必须在类体内初始化 static成员方法又叫类方法,访问static变量 A::f( ) (C++) A.f( ) (Java) 两者都有内部类和局部类的语法和语义 Java中没有友元函数和友元类的概念,严格支持封装,不允许外部方法访问类的私有成员而C++支持friend关键字,允许外部方法访问类的私有成员,因此不是一种纯面向对象的编程语言 Java中类或interface可以用public修饰,也可以不修饰;而C++类不能修饰三种访问权限的语义相同,语法略有差别 C++中还有继承权限修饰符,Java则没有 class
A: protected B, public C (C++) class A extends B (Java) Java有super关键字,指代父类对象,通常被用于调用父类的构造方法或一般方法 C++则没有super关键字两者都有this,指代当前对象 Java有package的概念,可以将类组织起来,便于打包和部署,也有利于类的安全。C++没有这个概念,一个类可以被任意类访问
8.Java applet
可以被嵌入HTML
文档中,然后由Web浏览器下载和执行 Java API有对网络通讯的特别支持 C++则无内置网络功能 C++程序员必须显式地实现动态内存管理,在析构函数中用delete
运算符或free( )
函数释放对象和其他动态分配的数据空间,否则会造成“内存泄露” 而在Java中,垃圾收集是自动的。当对象的最后一个引用变量被释放掉,这个对象就成为垃圾收集器的候选对象了因此Java不支持析构函数finalize( )
方法主要被用来释放先前打开的非内存资源,如文件句柄 Java源代码被编译成字节码(.class文件)
,字节码是一种只有JVM
才能识别的二进制低级代码,它与具体的处理器无关,要由安装在OS之上的JVM解释执行,转换成相应平台的机器码,因此Java是体系结构中立和跨平台的而C++直接被编译成底层平台的二进制机器码,由CPU执行,是平台相关的因此,当解释执行时,Java程序速度更慢 Java语言支持多线程,允许并发线程的同步与互斥操作 C++则没有这种内在机制Javadoc.exe
可以将Java程序的内容和结构转换成HTML
格式的文档
9.java script数组遍历,基本就是for,forin,foreach,forof,map
等等一些方法,性能分析对比后发现,最优雅的仍然是for
。 javascript的数组也和java中的数组差不多。但是因为javascript是弱类型语言,所以是不管什么类型都可以放入同一个数组里。
10.Python看上去是几种语言里最简洁的,实际上速度慢