有C++基础,Java零基础。想学Java。目前我采用的方法是:
- 先看一些Java入门视频(B站、腾讯课堂到处都有)快速了解Java这门语言,包括IDE怎么使用、基本输入输出、基本数据类型等,发现好些基础知识都差不多,毕竟都是面向对象的语言。
- 然后力扣做题,先用C++写一遍,做题思路保持不变,将C++里用到的API替换成Java的(比如你这道题是用C++的unordered_map写的,你用Java写的时候换成对应的HashMap写一遍,遇到不知道的就去百度一下),用Java多刷几道题就大概能记住那些类的使用方法了,这时候基本上就会用Java写代码了。
- 会用Java写代码算是刚刚入门了,如果想要代码写得好,必须要掌握语言的特性,包括Java各种类的底层原理什么的,这些可以买本书看。推荐书籍《Java核心技术》。
- 要想深入学习Java,看书肯定不够啊,去GitHub上找点项目做,然后在工作中实践等等
由于博主初学Java,下面的内容如有错误的地方,还望各位Java大佬指出来。
1、IDE选择
- 免费:Eclipse、IntelliJ Idea社区版
- 收费:IntelliJ Idea旗舰版
- 附上IntelliJ Idea官网下载链接
2、JVM、JRE与JDK
- JVM(Java Virtual Machine),Java虚拟机,JVM 是 Java 能够跨平台的核心。
- JRE(Java Runtime Envirnment),Java运行环境,JRE相对于 JVM,多了 Java 基础类库,你写好的Java程序需要有JRE才能运行。
- JDK(Java Development Kit) ,Java 开发工具包,包含了Java运行环境(JRE)、Java工具和Java基础的类库。你写的Java程序如果要调试,需要有JDK,由于JDK包含了JRE,JRE包含了JVM,因此你的IDE只要装了JDK就不需要额外装JRE和JVM了。
3、Java和C++相同的一些基础知识
-
基本数据类型:char、int、long、double……
布尔类型不同(Java boolean,C++ bool) -
运算符:+、-、*、\、%、++、–、=、&&、||、!、<、>、==……
-
判断语句:if、switch
-
循环语句:普通for语句、while语句、do-while语句
-
continue、break、 关系表达式?表达式1:表达式2 用法相同。
-
类同样有封装、继承、多态等概念;有private、pubic、this、static 等关键字;有构造函数,用法类似。
-
方法(函数)同样有定义、调用、重载等概念。
4、内存模型
java | C++ |
---|---|
5、数组
6、类的定义与使用
类的内存模型
仍以前面的代码为例,学生类Student实例化了一个对象stu1。
Java
在main()方法中使用类Student,先实例化一个对象stu1,对象stu1占用堆内存,stu1的内存中又存放着类Student的各个方法的地址。
C++
若类有虚函数的情况,请看图解C++多态,虚函数、虚函数表、虚指针、重写与覆盖
接下来是常用API的对比
1、输入 ----------------------------------------------------------------
Java------Scanner
// 导包
import java.util.Scanner;
// System.in 代表从键盘进行输入
Scanner sc = new Scanner(System.in);
// 获取键盘上输入的int型数据
int number = sc.nextInt();
// 输出看看
System.out.println(number);
// 获取键盘上输入的字符串
String str=sc.next();
// 输出看看
System.out.println(str);
C++ ------cin
// 包含头文件
#include <iostream>
// 输入int型数据
int number;
cin >> number;
// 输入string型数据
string str;
cin >> str;
// 输出看看
cout << number << endl << str << endl;
2、随机数 --------------------------------------------------------------
Java------Random
// 导包
import java.util.Random;
// 使用
Random ran=new Random();
// 输出范围为INT_MIN~INT_MAX的10个随机数
for(int i=0;i<10;i++) {
System.out.println(ran.nextInt());
}
// 输出范围为[0,n)的10个随机数
int n=5;
for (int i = 0; i < 10; i++) {
System.out.println(ran.nextInt(n));
}
C++ ------rand
// 包含头文件
#include <stdlib.h>
// 使用
// 设置种子,如果不设置,种子默认为1
srand(1);
// 输出100个伪随机数
for (int i = 0; i < 10; ++i) {
cout << rand() << " ";
}
3、动态数组 ----------------------------------------------------------
Java------ArrayList
ArrayList<E> list = new ArrayList(); | 创建一个名为list的空数组链表,存放E类型的对象 |
---|---|
ArrayList<E> list = new ArrayList(n); | 创建一个数组链表list,存放E类型的对象,初始容量大小为n |
list.get(index); | 访问下标为index的元素 |
Object[] c=list.toArray(); | 获取一个数组c,c中所有元素是数组链表中的元素,即将数组链表转换为一个数组 |
list.set(index,element); | 将下标为index的元素修改为element |
list.add(element); | 在list的尾部添加元素element |
list.add(index,element); | 在list的下标为index的位置添加元素element |
list.remove(index); | 删除下标为index的元素 |
list.clear(); | 删除所有元素 |
list.size(); | 返回值为数组链表的大小 |
list.isEmpty(); | 数组链表为空则返回true,否则返回false |
list.contains(element); | 数组链表中包含元素element则返回true,否则返回false |
list.indexOf(element); | 返回元素element在数组链表中第一次出现的位置,如果链表中没有这个元素则返回-1 |
list.lastIndexOf(element); | 返回元素element在数组链表中最后一次出现的位置,如果链表中没有这个元素则返回-1 |
上表中<>尖括号内E代表泛型,泛型只能是引用类型比如String,不能是基本类型比如int,如果希望用ArrayList存储基本类型的数据,必须使用基本类型对应的引用类型,对应关系见下表。
基本类型 | 引用类型 |
---|---|
byte | Byte |
boolean | Boolea |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
C++ ------vector
【C++】STL顺序容器之vector用法总结
4、字符串 ----------------------------------------------------------
Java------String
初始化 | |
---|---|
String s1 = new String(“hello world!”); | 创建一个字符串对象,内容为"hello world!" |
String s1 = “hello world!”; | 创建一个字符串对象,内容为"hello world!" |
String s1 = new String(); | 创建一个空字符串对象 |
char c1[] = {‘h’,‘e’,‘l’,‘l’,‘o’}; String s1 = new String(c1); | 创建一个字符串对象,内容为"hello" |
byte b1[]={104,101}; String s1 = new String(b1); | 创建一个字符串对象,内容为"he" |
查找 | |
---|---|
s1.contains(String s2); | s1中包含s2则返回true,否则返回false |
s1.charAt(int index); | 返回下标为index的字符 |
s1.indexOf(char element); | 返回字符element在s1中第一次出现的位置,如果s1中没有则返回-1 |
s1.indexOf(char element,int index); | 返回字符element 从s1的index位置开始,第一次出现的位置,如果没有则返回-1 |
s1.indexOf(String s2); | 返回字符串s2在s1中第一次出现的位置,如果s1中没有s2则返回-1 |
s1.indexOf(String s2,int index); | 返回字符串s2 从s1的index位置开始,第一次出现的位置,如果没有则返回-1 |
s1.lastIndexOf(char element); | 返回字符element在s1中最后一次出现的位置,如果s1中没有则返回-1 |
s1.lastIndexOf(char element,int index); | 返回字符element 从s1的index位置开始,最后一次出现的位置,如果没有则返回-1 |
s1.lastIndexOf(String s2); | 返回字符串s2在s1中最后一次出现的位置,如果s1中没有则返回-1 |
s1.lastIndexOf(String s2,int index); | 返回字符串s2 从s1的index位置开始,最后一次出现的位置,如果没有则返回-1 |
比较 | |
---|---|
s1.equals(s2); | s1与s2相等则返回true,否则返回false |
s1.equalsIgnoreCase(s2); | 忽略大小写的情况下,s1与s2相等则返回true,否则返回false |
s1pareTo(s2); | 比较s1与s2的大小,s1>s2返回正数,s1=s2返回0,否则返回负数 |
s1pareToIgnoreCase(s2); | 忽略大小写的情况下,比较s1与s2的大小,s1>s2返回正数,s1=s2返回0,否则返回负数 |
替换 | |
---|---|
String result=s1.replace(oldChar,newChar); | 将s1中的字符oldChar替换为字符newChar,结果保存在result中 |
String result=s1.replace(target,replacement); | 将s1中的字符串target替换为字符串replacement,结果保存在result中 |
String result=s1.replaceAll(target,replacement); | 将s1中的target全部替换为replacement,结果保存在result中,target和replacement都是正则表达式 |
String result=s1.replaceFirst(target,replacement); | 将s1中的第一个target替换为replacement,结果保存在result中,target和replacement都是正则表达式 |
其他 | |
---|---|
s1.length(); | 返回值为字符串的长度 |
s1.isEmpty(); | 字符串为空则返回true,否则返回false |
String result=s1.substring(index); | 得到s1从下标index开始的子串,结果保存在result中 |
String result=s1.substring(index1,inex2); | 得到s1从下标index1开始到下标index2结束的子串(左闭右开),结果保存在result中 |
String result=s1.toLowerCase(); | 将s1中的大写字符变换成对应的小写字母,结果保存在result中 |
String result=s1.toUpperCase(); | 将s1中的小写字符变换成对应的大写字母,结果保存在result中 |
String result=s1.concat(s2); | 将s1和s2拼接后的结果保存在result中,注意,s1、s2的值不会改变 |
String result[]=s1.split(regex); | 根据正则表达式regex将s1拆分开,结果保存在result[]字符串数组中 |
C++ ------string
【C++】STL顺序容器之string用法总结
5、操作数组的工具类 ----------------------------------------------
Java------Arrays
int[] a=new int[]{8,1,2,3,7,5,4,6,7,0}; | 以数组名为a进行举例 |
---|---|
System.out.println(Arrays.toString(a)); | 打印数组 |
Arrays.sort(a); | 对整个数组排序 |
Arrays.sort(a,index1,index2); | 对下标i范围为ndex1~index2(左闭右开)的元素进行排序 |
int result=Arrays.binarySearch(a,target); | 二分查找元素target,若找到则返回target的索引,否则返回负数 |
Arrays.fill(a,value); | 将数组元素全部填充为value |
Arrays.fill(a,index1,index2,value); | 将下标从index1开始到index2的元素(左闭右开),填充为value |
int[] b=Arrays.copyOf(a,length); | 将数组a的前length个元素拷贝给数组b |
int[] c=Arrays.copyOfRange(a,index1,index2); | 将数组a的下标从index1开始到index2的元素拷贝给数组b |
程序示例
int[] a=new int[]{8,1,2,3,7,5,4,6,7,0};
// 打印
System.out.println(Arrays.toString(a)); // toString(a)打印数组
// 排序
Arrays.sort(a,0,5); // 只对下标0~5(左闭右开)的元素进行排序
Arrays.sort(a); // 对整个数组排序
// 二分查找
int r1=Arrays.binarySearch(a,7); // 得到查找的结果的索引,未找到则返回负数
System.out.println(r1);
// 填充
Arrays.fill(a,1); // 将数组元素全部替换成1
Arrays.fill(a,0,5,0); // 将下标从0开始到5的元素(左闭右开),填充为0
System.out.println(Arrays.toString(a)); // toString(a)打印数组
// 复制数组
int[] b=Arrays.copyOf(a,5); // 复制数组的前5个元素
int[] c=Arrays.copyOfRange(a,3,7); // 复制下标从3到7的元素
6、Math类 ----------------------------------------------
程序示例
double a = 1.2038456;
double b = 1.2038456;
double result1 = Math.floor(a); // 向下取整
double result2 = Math.ceil(a); // 向上取整
double result3 = Math.round(a); // 四舍五入
double result4 = Math.max(a,b); // 最大值
double result5 = Math.min(a,b); // 最小值
double result6 = Math.abs(a); // 绝对值
double result7 = Math.pow(a,b); // 幂函数
double result8 = Math.sqrt(a); // 平方根
更多推荐
C++转Java快速入门
发布评论