学习了各个主流编程语言后,经常学了这个忘了那个,故写此文对各语言进行总结和辨析。
基本类型
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 | int nums[3] = {1,2,3}; |
唯一不太灵活的地方是无法指定一个变量作为栈空间数组的大小(因为编译生成函数栈时就需要确定栈区大小)
所以,C/C++也是支持在堆空间中创建数组滴~ 但是注意,别忘了用完后释放内存!重新申请了新地址拷贝过去后也要释放原来地址的内存!
C++创建一个长度为n的数组:
1 | bool *flags = new bool[n]; |
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语言的malloc
和free
函数;而Java语言拥有垃圾回收机制,一般不需要手动处理内存分配和回收。
常量
Java中使用final来表示常量固定值
对于集合类型的转化方法
1 | final List<?> constList = Collections.unmodifiableList(list); |
接口
Java传递接口作为参数的三种方法
以sort函数中常用的比较器Comparator为例展示接口作为参数的3种实现方法。
先看比较器的源码定义:
1 | public interface Comparator<T> { |
- Lambda函数(最简洁)
1
2
3
4String[] strs = {"dog", "apple", "cat"};
Arrays.sort(strs, (o1, o2)->{
return o2.comparesTo(o1);
});
这种方式比较特殊,仅用在接口里面只有一个抽象方法的情况。这种接口也成为Single Abstract Method(SAM)Interface。
Java8中新引入了 @FunctionalInterface 用来帮助在编译阶段检查是否为SAM接口。
new接口,并重写接口方法(最常用)
1
2
3
4
5
6
7Integer arr[] = {2, 1, 3};
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer n1, Integer n2) {
return n2 - n1;
}
});接口实现类(最传统)
1
2
3
4
5
6
7
8Arrays.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 | char* hello_c = "hello, C"; |
到了Java语言,使用 java.lang.String
类作为常量字符串,涉及字符串修改的多用 java.lang.StringBuilder
。
字符串常用操作
去除前后字符串
C语言和C++没有trim函数,需要手动处理
1 | void trim(char* str) { |
字符串反转
C++借用了std::reverse的反转功能实现字符串的反转
1 | 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++)
插入元素
insert(const value_type& val)
删除元素
erase (const_iterator position)
erase (const value_type& val)
检查元素是否存在
const_iterator find (const value_type& val) const
iterator find (const value_type& val)
找不到则返回 set.end() 迭代器
java.util.Set
插入元素boolean add(E e);
删除元素boolean remove(Object o);
检查元素是否存在boolean contains(Object o);
Comments
shortname
for Disqus. Please set it in_config.yml
.