
我将从基础概念、进阶知识、高阶应用等方面出发,结合阿里Java面试常见考点,为你呈现一份全面的学习指南,希望能助你顺利通过面试。
int num = 10;,这里int就是基本数据类型。基本数据类型存储在栈内存中,数据直接存储值;而引用数据类型存储在堆内存中,栈中存储的是对象的引用地址。int a = 5, b = 3; boolean result = a > b;,这里>就是比较运算符,&&逻辑与运算符常用于多个条件同时满足的判断,如if (a > 0 && b < 10)。for循环打印1到10的数字:for (int i = 1; i <= 10; i++) {
System.out.println(i);
}if - else语句用于条件判断后的不同执行分支,如if (a > 5) { System.out.println("大于5"); } else { System.out.println("小于等于5"); }。
Person类:class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("大家好,我叫" + name + ",今年" + age + "岁。");
}
}创建对象:Person person = new Person("张三", 20); person.sayHello();,通过new关键字创建对象,并调用对象的方法。
private修饰符),并提供公共的访问方法(getter和setter方法)来实现封装。如上述Person类中,name和age属性被私有化,通过getName和getAge等方法来访问和修改。extends关键字。例如定义一个Student类继承自Person类:class Student extends Person {
private String school;
public Student(String name, int age, String school) {
super(name, age);
this.school = school;
}
public void study() {
System.out.println(name + "在" + school + "学习。");
}
}这里Student类继承了Person类的属性和方法,还添加了自己特有的school属性和study方法。
Person类基础上,Student类重写sayHello方法:class Student extends Person {
// 省略其他代码
@Override
public void sayHello() {
System.out.println("我是学生" + name + ",我在" + school + "上学。");
}
}当使用Person类型引用指向Student对象时,调用sayHello方法会执行Student类中重写后的方法,体现了多态性。
ArrayList和LinkedList。ArrayList基于数组实现,查询效率高,增删操作在非尾部时效率低;LinkedList基于链表实现,增删操作效率高,查询效率低。例如:List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
int num = list.get(0);HashSet和TreeSet。HashSet基于哈希表实现,插入和查找效率高;TreeSet基于红黑树实现,可对元素进行排序。如:Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
boolean contains = set.contains("apple");HashMap、TreeMap和ConcurrentHashMap。HashMap非线程安全,基于哈希表;TreeMap可对键进行排序;ConcurrentHashMap线程安全,适用于高并发场景。例如:Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
int value = map.get("one");Thread类和实现Runnable接口两种方式。继承Thread类:class MyThread extends Thread {
@Override
public void run() {
System.out.println("线程运行中");
}
}
MyThread thread = new MyThread();
thread.start();实现Runnable接口:
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程运行中");
}
}
MyRunnable runnable = new MyRunnable();
Thread thread2 = new Thread(runnable);
thread2.start();synchronized关键字、Lock接口等。例如使用synchronized修饰方法实现同步:class SynchronizedExample {
private int count = 0;
public synchronized void increment() {
count++;
}
}Lock接口提供了更灵活的锁控制,如ReentrantLock:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class LockExample {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}ThreadPoolExecutor,可通过Executors工具类创建不同类型线程池,如固定大小线程池Executors.newFixedThreadPool(int nThreads):import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executorService.submit(() -> {
System.out.println(Thread.currentThread().getName() + "正在执行任务");
});
}
executorService.shutdown();Checked Exception(受检异常,如IOException、SQLException等,必须显式捕获或抛出)和Unchecked Exception(非受检异常,包括RuntimeException及其子类,如NullPointerException、ArrayIndexOutOfBoundsException等,可不显式处理)。Exception类是所有异常的父类,Error类表示系统错误,如OutOfMemoryError,一般不由程序处理。try - catch - finally块处理异常。try块中放置可能抛出异常的代码,catch块捕获并处理异常,finally块无论是否发生异常都会执行。例如:try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("捕获到算术异常:" + e.getMessage());
} finally {
System.out.println("finally块执行");
}也可通过throws关键字在方法声明处抛出异常,由调用者处理。例如:
public void readFile() throws IOException {
// 文件读取代码可能抛出IOException
}Class对象:Class<?> clazz = String.class;
// 或通过对象获取
String str = "hello";
Class<?> clazz2 = str.getClass();
// 或通过类名获取
try {
Class<?> clazz3 = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}try {
Class<?> clazz = Class.forName("com.example.Person");
Object obj = clazz.getConstructor(String.class, int.class).newInstance("张三", 20);
if (obj instanceof Person) {
Person person = (Person) obj;
person.sayHello();
}
} catch (Exception e) {
e.printStackTrace();
}这里通过反射获取Person类的构造函数,并创建对象调用方法。
class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}懒汉式在第一次调用getInstance方法时创建实例,需注意线程安全问题,可通过双重检查锁实现线程安全的懒汉式:
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}interface Shape {
void draw();
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘制矩形");
}
}
class ShapeFactory {
public static Shape createShape(String type) {
if ("circle".equals(type)) {
return new Circle();
} else if ("rectangle".equals(type)) {
return new Rectangle();
}
return null;
}
}使用时:Shape shape = ShapeFactory.createShape("circle"); shape.draw();
InvocationHandler接口和Proxy类实现,假设要对一个UserService接口的实现类进行代理增强:interface UserService {
void sayHello();
}
class UserServiceImpl implements UserService {
@Override
public void sayHello() {
System.out.println("Hello, User!");
}
}
class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("方法调用前增强");
Object result = method.invoke(target, args);
System.out.println("方法调用后增强");
return result;
}
}
class ProxyFactory {
public static Object createProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new ProxyHandler(target)
);
}
}使用时:UserService userService = new UserServiceImpl(); UserService proxyService = (UserService) ProxyFactory.createProxy(userService); proxyService.sayHello();
Eureka用于服务注册与发现,服务提供者将自己注册到Eureka Server,服务消费者从Eureka Server获取服务列表。例如在服务提供者项目中配置Eureka:
在pom.xml添加依赖:<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring - cloud - starter - netflix - eureka - client</artifactId>
</dependency>在application.yml配置:
server:
port: 8081
eureka:
client:
service - url:
defaultZone: http://localhost:8761/eureka/启动类添加注解@EnableEurekaClient。
Ribbon用于客户端负载均衡,它会从Eureka Server获取服务列表,并根据负载均衡算法选择一个服务实例进行调用。Feign是声明式的Web服务客户端,可通过接口定义和注解简化服务调用,例如定义一个调用其他服务的Feign接口:
@FeignClient(name = "service - name")
interface OtherServiceClient {
@GetMapping("/api/hello")
String sayHello();
}Seata等框架解决分布式事务问题。Seata提供了AT、TCC等事务模式。以AT模式为例,在项目中引入Seata依赖:<dependency>
<groupId>io.seata</groupId>
<artifactId>seata - spring - boot - starter</artifactId>
</dependency>配置Seata相关参数,如事务组名称等。在业务方法上添加@GlobalTransactional注解标识分布式事务,例如:
@Service
public class OrderService {
@GlobalTransactional
public void createOrder() {
// 业务逻辑,可能涉及多个服务调用
}
}-Xms2g -Xmx2g,选择G1垃圾回收器:-XX:+UseG1GC。可通过分析GC日志(使用-Xlog:gc*参数开启日志)了解垃圾回收情况,如新生代和老年代的回收次数、回收时间等,进而调整参数。commons - pool2库实现的对象池)复用对象;优化算法和数据结构,例如在查找操作频繁时,将ArrayList替换为HashSet或HashMap以提高查找效率;合理使用缓存,如在应用中引入Redis缓存热点数据,减少数据库查询次数。例如使用Redis缓存用户信息:import redis.clients.jedis.Jedis;
public class UserCache {
private Jedis jedis;
public UserCache() {
jedis = new Jedis("localhost", 6379);
}
public String getUserFromCache(String userId) {
return jedis.get("user:" + userId);
}
public void setUserToCache(String userId, String userInfo) {
jedis.set("user:" + userId, userInfo);
}
}通过对这100题涉及的从基础到高阶知识的学习和实践,不断积累和总结,在面试中就能更加自信从容,顺利通关终面,开启在阿里的精彩职业之旅。
Java 面试,阿里面试题,Java 基础面试题,Java 高阶面试题,Java 核心题库,面试通关攻略,Java 开发面试,互联网大厂面试,Java 面试必刷题,Java 终面题库,Java 备考攻略,Java 程序员面试,Java 核心知识点,大厂面试技巧,Java 面试高频题
资源地址:
https://pan.quark.cn/s/14fcf913bae6
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。