从C++到Java —— C系列编程语言辨析总结

学习了各个主流编程语言后,经常学了这个忘了那个,故写此文对各语言进行总结和辨析。

基本类型

Java 拥有8大基本类型:byte, boolean, char, short, int, long, float, double
C++ 的基本类型包括:bool, (signed) char, (unsigned) short, (unsigned) int, (unsigned) long, float, double
C语言的基本数据类型有:(signed) char, (unsigned) short, (unsigned) int, (unsigned) long, float, double

注意,布尔类型Java叫boolean,C++叫bool,C语言默认没有。
字符类型Java使用双字节存储,而C/C++则使用单字节存储。
Java拥有字节类型byte,而C/C++没有。

数组

Java创建一个长度为n的数组:

1
boolean[] flags = new boolean[n];

Java创建数组的方式非常单一,就是在堆内存中开辟一段空间,然后赋值给一个引用。
而C/C++中更加常用的是创建栈空间数组:

1
2
int nums[3] = {1,2,3};
int *cnt = {1,2,3};

唯一不太灵活的地方是无法指定一个变量作为栈空间数组的大小(因为编译生成函数栈时就需要确定栈区大小)

所以,C/C++也是支持在堆空间中创建数组滴~ 但是注意,别忘了用完后释放内存!重新申请了新地址拷贝过去后也要释放原来地址的内存!
C++创建一个长度为n的数组:

1
2
3
bool *flags = new bool[n];
...
delete[] flags;

C语言创建一个长度为n的数组:

1
char *flags = (char *)malloc(n * sizeof(char));

由于C/C++通过指针创建数组,所以没法根据指针获得数组长度,而Java获取数组长度的方法为

1
int len = flags.length;

指针

C语言的概念,C++中引入了智能指针。Java采用引用替代了指针。

全局变量

C/C++中,在函数外部定义的变量称为全局变量,或外部变量。全局变量储存在静态存储区,在文件作用域范围内都能访问到。
Java为完全面向对象语言,不能在类作用域的外部定义全局变量。不过Java可以通过单例模式实现全局唯一对象。

类和对象

Java 根据类实例化一个对象的一般做法:

1
Test test = new Test();

C++根据类实例化一个对象的一般做法:

1
Test test = Test();

注意,C++中的new关键字是用来分配内存的,和delete关键字相对应;类似于C语言的mallocfree函数;而Java语言拥有垃圾回收机制,一般不需要手动处理内存分配和回收。

常量

Java中使用final来表示常量固定值
对于集合类型的转化方法

1
final List<?> constList = Collections.unmodifiableList(list);

接口

Java传递接口作为参数的三种方法

以sort函数中常用的比较器Comparator为例展示接口作为参数的3种实现方法。
先看比较器的源码定义:

1
2
3
4
public interface Comparator<T> {
int compare(T o1, T o2);
...
}
  1. Lambda函数(最简洁)
    1
    2
    3
    4
    String[] strs = {"dog", "apple", "cat"};
    Arrays.sort(strs, (o1, o2)->{
    return o2.comparesTo(o1);
    });

这种方式比较特殊,仅用在接口里面只有一个抽象方法的情况。这种接口也成为Single Abstract Method(SAM)Interface。
Java8中新引入了 @FunctionalInterface 用来帮助在编译阶段检查是否为SAM接口。

  1. new接口,并重写接口方法(最常用)

    1
    2
    3
    4
    5
    6
    7
    Integer arr[] = {2, 1, 3};
    Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer n1, Integer n2) {
    return n2 - n1;
    }
    });
  2. 接口实现类(最传统)

    1
    2
    3
    4
    5
    6
    7
    8
    Arrays.sort(list, new MyComparator());
    ...
    class MyComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer n1, Integer n2) {
    return n2 - n1;
    }
    }

常用类型

字符串

C语言使用指向字符类型的指针 char* 作为字符串,通过’\0’ 标识字符串的末尾。C++标准库加入了 std::string 作为字符串。C语言和C++字符串之间的转化操作为:

1
2
3
4
5
char* hello_c = "hello, C";
std::string str = std::string(hello_c); // C转C++字符串

std::string hello_cpp("hello, Cpp");
const char* hello_cpp = hello_cpp.c_str(); // C++转C字符串,注意这里const指针表示不可以通过hello_cpp修改string的指针,但是string中内容修改是可以反映到hello_cpp的

到了Java语言,使用 java.lang.String 类作为常量字符串,涉及字符串修改的多用 java.lang.StringBuilder

字符串常用操作

去除前后字符串

C语言和C++没有trim函数,需要手动处理

1
2
3
4
5
6
7
8
void trim(char* str) {
while(str[0] == ' ') {
str++;
}
while(str[strlen(str)-1] == ' ') {
str[strlen(str)-1] = 0;
}
}

字符串反转

C++借用了std::reverse的反转功能实现字符串的反转

1
2
3
cout << str << end;
reverse(str.begin(), str.end());
cout << str << end;

C语言没有提供stack,需要自己构建。C++标准库提供了stack。Java提供了Stack实现

std::stack (C++)

获取栈顶元素
top()

去除栈顶元素
pop()

向栈中压入元素
push(v)

java.util.Stack

弹出栈顶元素
value = pop()

向栈压入元素
push(v)

队列

C++的栈和队列都是使用双端队列(deque)去实现的。Java提供了Queue接口,常用实现有LinkedList

std::queue (C++)

获取队首元素
front()

加入队尾
push(v)

从队首弹出
pop()

java.util.Queue

获取队首元素
top()

加入队尾
push(v)

从队首弹出
pop()

优先队列

std::priority_queue (C++)

获取队首元素: top()
从队首弹出:pop()

集合

C语言没有提供set,需要自己构建。C++标准库提供了set。Java提供了Set接口,实现类有HashSet。

std::set(C++)

插入元素

  1. insert(const value_type& val)

删除元素

  1. erase (const_iterator position)
  2. erase (const value_type& val)

检查元素是否存在

  1. const_iterator find (const value_type& val) const
  2. iterator find (const value_type& val)
    找不到则返回 set.end() 迭代器

java.util.Set

插入元素
boolean add(E e);

删除元素
boolean remove(Object o);

检查元素是否存在
boolean contains(Object o);

内存数据区

C/C++ 开源项目构建 高级MySQL与大表优化

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×