有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、内存模型

javaC++

       

       

       

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存储基本类型的数据,必须使用基本类型对应的引用类型,对应关系见下表。

基本类型引用类型
byteByte
booleanBoolea
charCharacter
shortShort
intInteger
longLong
floatFloat
doubleDouble

       
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快速入门