929. Unique Email Addresses(java)

Java刷题:处理Email地址问题
博主面试后决定奋发刷题,意向Java方向。记录一道处理Email地址的题目,要去掉email本地名里的 “.” 和“+”后面部分。同时提醒注意String.replace()与String.replaceAll()的区别,以及比较字符串不能用==。

经过一轮来不及准备的面试,我应该知道了自己几斤几两了,,, 奋发刷题,记录下自己的解题过程,以及一些遇到的需要注意的问题。 

意向java方向,java还是在大一学的,大三重拾处处是坑。

上题:大意是要去掉email里面本地名里面的 “.” 和“+”后面的部分。

  public static int numUniqueEmails(String[] emails) {
        int num=0;
			String str, tmp1, t;
			for(int i=0; i<emails.length; i++)
			{
				str = emails[i]; 
				emails[i] = str.substring(str.indexOf( "@"));//@后面的
				tmp1 = str.replace(".", "");//去掉 。 
				 
				if(tmp1.indexOf("+")>0) 
					emails[i] = tmp1.substring(0, tmp1.indexOf( "+")-1) + emails[i];		
				else
					emails[i] = tmp1.substring(0, tmp1.indexOf( "@")) + emails[i];  
			} 
			
			for(int i=0; i<emails.length; i++) 
				for(int j=0; j<emails.length; j++) 
					if(emails[i].equals(emails[j]) && i!=j) 
						emails[j] = "";   
			
	        for(int i=0; i<emails.length; i++) 
	            if(emails[i]!="")
	                num++; 
			return num;	        
	    } 

注意点:

String.replace() String.replaceAll() 两者不一样,后者是为正则表达式设立的,要注意特殊字符,比如+ 在后者要写成“\\+”转义一下。

emails[i].equals(emails[j]) 这里不能用==,两者地址不一样。

 

 

<think>我们正在讨论Java实体类使用注解映射数据库字段的问题。根据引用内容,我们可以使用JPA(Java Persistence API)提供的注解来实现这一目标。下面我将详细解释如何使用这些注解。 ### 1. 基本注解 - `@Entity`: 标记类为实体类,表示该类将映射到数据库表。 - `@Table`: 指定实体类映射的数据库表名。如果表名与类名相同,可省略。 - `@Id`: 标记该属性为主键。 - `@GeneratedValue`: 指定主键生成策略,如自增(AUTO, IDENTITY等)。 - `@Column`: 指定属性映射到数据库的字段名,还可以定义字段的其他属性(如长度、是否可为空等)。 ### 2. 示例代码 以下是一个简单的实体类示例,使用注解映射到数据库表: ```java import javax.persistence.*; @Entity @Table(name = "users") // 指定映射的数据库表名为"users" public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键,适用于MySQL等 @Column(name = "id") // 映射到数据库字段"id" private Long id; @Column(name = "username", length = 50, nullable = false) // 字段名、长度、非空 private String username; @Column(name = "password", length = 100, nullable = false) private String password; @Column(name = "email", unique = true) // 唯一约束 private String email; // 省略构造方法、getter和setter } ``` ### 3. 注解详解 - **@Entity**: 必须标注在类上,表示这是一个实体类。 - **@Table**: - `name`: 指定数据库表名(可选,默认类名)。 - 其他属性:`catalog`, `schema`, `uniqueConstraints`等(可选)。 - **@Id**: 必须标注在主键字段或getter方法上。 - **@GeneratedValue**: - `strategy`: 主键生成策略,常见的有: - `GenerationType.IDENTITY`: 数据库自增(如MySQL的AUTO_INCREMENT)。 - `GenerationType.SEQUENCE`: 使用数据库序列(如Oracle)。 - `GenerationType.TABLE`: 使用表模拟序列。 - `GenerationType.AUTO`: 由JPA自动选择。 - **@Column**: - `name`: 数据库字段名(可选,默认属性名)。 - `nullable`: 是否允许为空(默认true)。 - `unique`: 是否唯一(默认false)。 - `length`: 字段长度(仅对字符串有效,默认255)。 - `columnDefinition`: 自定义DDL语句(如`"TEXT"`定义MySQL的文本类型,见引用[4])。 ### 4. 特殊字段映射 - **日期时间映射**(引用[4]): - 使用`@Temporal`注解指定日期类型: - `TemporalType.DATE`: 日期(年月日)。 - `TemporalType.TIME`: 时间(时分秒)。 - `TemporalType.TIMESTAMP`: 日期和时间。 - 结合`@DateTimeFormat`(Spring框架)或`@JSONField`(Fastjson)处理格式: ```java @Temporal(TemporalType.TIMESTAMP) @Column(name = "create_time") private Date createTime; // 存储日期和时间 ``` - 自定义字段类型(如MySQL的`TEXT`): ```java @Column(name = "content", columnDefinition = "TEXT") private String content; ``` ### 5. 注意事项 - 确保导入正确的注解包:`javax.persistence.*`(JPA标准注解)。 - 实体类通常需要无参构造方法。 - 建议为每个属性提供getter和setter方法。 - 如果使用Hibernate作为JPA实现,它会根据注解自动生成或更新数据库表结构(需配置`hibernate.hbm2ddl.auto`)。 ### 6. 扩展:关系映射 除基本字段外,JPA还支持关系映射: - `@OneToOne`: 一对一 - `@OneToMany`: 一对多 - `@ManyToOne`: 多对一 - `@ManyToMany`: 多对多 例如,一个用户有多个地址(一对多): ```java @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List<Address> addresses = new ArrayList<>(); ``` ### 总结 通过JPA注解,我们可以方便地将Java实体类映射到数据库表。核心注解包括`@Entity`, `@Table`, `@Id`, `@GeneratedValue`, `@Column`等。此外,还可以通过`@Temporal`处理日期时间,`columnDefinition`自定义字段类型。 §§相关问题§§ 1. JPA中如何实现实体类的一对多关系映射? 2. 如何通过JPA注解设置字段的默认值? 3. JPA和Hibernate在注解使用上有何区别? 4. 如何用注解实现数据库表之间的关联查询?</think>### Java实体类使用注解映射数据库字段详解 在Java中,通过JPA(Java Persistence API)注解可以轻松实现实体类与数据库字段的映射。以下是核心步骤和代码示例: #### 1. **基础映射注解** ```java import javax.persistence.*; @Entity // 声明为实体类 @Table(name = "users") // 指定映射的表名 public class User { @Id // 标识主键 @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增策略 private Long id; @Column(name = "user_name", length = 50, nullable = false) // 字段映射 private String username; @Column(name = "email", unique = true) // 唯一约束 private String email; } ``` - **`@Entity`**:标记类为JPA实体 - **`@Table`**:指定数据库表名(默认类名) - **`@Id`** + **`@GeneratedValue`**:定义主键和生成策略 - **`@Column`**:核心字段映射注解 - `name`:数据库字段名(默认属性名) - `nullable`:是否允许空值(默认true) - `length`:字符串长度(默认255) - `unique`:唯一约束 #### 2. **特殊数据类型处理** ##### 日期类型映射 ```java @Temporal(TemporalType.TIMESTAMP) // 定义日期精度 @Column(name = "create_time") private Date createTime; // 存储日期+时间 @Temporal(TemporalType.DATE) private Date birthDate; // 仅存储日期 ``` - `TemporalType.DATE`:年月日 - `TemporalType.TIME`:时分秒 - `TemporalType.TIMESTAMP`:完整时间戳 ##### 大文本字段 ```java @Lob // 大对象注解 @Column(columnDefinition = "TEXT") // MySQL文本类型 private String content; @Lob private byte[] fileData; // 二进制数据 ``` #### 3. **字段默认值设置** ```java @Column(columnDefinition = "VARCHAR(100) DEFAULT 'unknown'") private String status; // 数据库默认值 @Column(insertable = false, updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") private LocalDateTime createTime; // 自动插入时间 ``` #### 4. **枚举类型映射** ```java @Enumerated(EnumType.STRING) // 存储枚举名称(推荐) @Column(name = "user_role") private UserRole role; // 枚举类 // 枚举定义示例 public enum UserRole { ADMIN, USER, GUEST } ``` #### 5. **完整示例 ```java @Entity @Table(name = "employees") public class Employee { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "full_name", nullable = false, length = 100) private String fullName; @Column(unique = true) private String employeeId; @Temporal(TemporalType.DATE) private Date hireDate; @Column(columnDefinition = "DECIMAL(10,2) DEFAULT 0.0") private BigDecimal salary; } ``` ### 关键注意事项 1. **包导入**:使用`javax.persistence.*`而非Hibernate特定包[^3] 2. **命名策略**:默认驼峰转下划线(如`userName` → `user_name`) 3. **DDL生成**:配合`spring.jpa.hibernate.ddl-auto=update`可自动建表 4. **关联关系**:通过`@OneToMany`, `@ManyToOne`等处理表关联(需单独配置) > 通过合理使用JPA注解,开发者可以避免直接编写SQL语句,实现对象关系映射(ORM),提高开发效率并减少数据库耦合[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值